From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeffrey A Law To: Oskar Enoksson Cc: egcs@egcs.cygnus.com Subject: Re: Optimization Date: Mon, 29 Mar 1999 08:18:00 -0000 Message-id: <876.922704204@upchuck> References: X-SW-Source: 1999-03/msg00941.html In message you write: > > Hi! I'm working with computational mathematics using c and c++. > > Does g++/gcc have any optimization that brings out constant subexpressions > outside loops? Consider the following: > > void sqr(float *x, int *step) { > int i,j,k; > > for (i=0; i<100; i++) > for (j=0; j<100; j++) > for (k=0; k<100; k++) > *(x+i*step[2]+j*step[1]+k*step[0]) *= > *(x+i*step[2]+j*step[1]+k*step[0]); > } > > The resulting assembler with egcs 1.0.2 (i686-pc-linux-gnulibc1) is not > very efficient, because the integer expressions are calculated again > and again inside the innermost loop. Can I make the compiler translate the > above code into something like the following: > > void sqr(float *x, int *step) { > int i,j,k; > float *xi,*xj; > > for (i=0; i<100; i++) { > xi=x+i*step[2]; > for (j=0; j<100; j++) { > xj=xi+j*step[1]; > for (k=0; k<100; k++) { > *(xj+k*step[0]) *= > *(xj+k*step[0]); > } > } > } > } > > If this is impossible with the current version, would it be hard to > add this optimization to the compiler? The resulting assembler is much > more efficient. An FYI -- current development snapshots perform this optimization and thus egcs-1.2 will perform this optimization when released. This optimization was made possible by Mark Mitchell's type based alias analysis will allows the compiler to realize that the floating point stores in the loop can not access the same memory as the integer loads that were initially in the loop. This exposes the integer loads to loop invariant code motion optimizations. jeff From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeffrey A Law To: Oskar Enoksson Cc: egcs@egcs.cygnus.com Subject: Re: Optimization Date: Wed, 31 Mar 1999 23:46:00 -0000 Message-ID: <876.922704204@upchuck> References: X-SW-Source: 1999-03n/msg00949.html Message-ID: <19990331234600.YOCAfqWq7leQrgitH8DGdZbGhT3fZmCc46egmN6BRcs@z> In message you write: > > Hi! I'm working with computational mathematics using c and c++. > > Does g++/gcc have any optimization that brings out constant subexpressions > outside loops? Consider the following: > > void sqr(float *x, int *step) { > int i,j,k; > > for (i=0; i<100; i++) > for (j=0; j<100; j++) > for (k=0; k<100; k++) > *(x+i*step[2]+j*step[1]+k*step[0]) *= > *(x+i*step[2]+j*step[1]+k*step[0]); > } > > The resulting assembler with egcs 1.0.2 (i686-pc-linux-gnulibc1) is not > very efficient, because the integer expressions are calculated again > and again inside the innermost loop. Can I make the compiler translate the > above code into something like the following: > > void sqr(float *x, int *step) { > int i,j,k; > float *xi,*xj; > > for (i=0; i<100; i++) { > xi=x+i*step[2]; > for (j=0; j<100; j++) { > xj=xi+j*step[1]; > for (k=0; k<100; k++) { > *(xj+k*step[0]) *= > *(xj+k*step[0]); > } > } > } > } > > If this is impossible with the current version, would it be hard to > add this optimization to the compiler? The resulting assembler is much > more efficient. An FYI -- current development snapshots perform this optimization and thus egcs-1.2 will perform this optimization when released. This optimization was made possible by Mark Mitchell's type based alias analysis will allows the compiler to realize that the floating point stores in the loop can not access the same memory as the integer loads that were initially in the loop. This exposes the integer loads to loop invariant code motion optimizations. jeff