On 03 Feb 2015, at 15:58, leledumbo wrote:

int c ;
int test( int p){
 int i;
 i = p;
 return (i+2+c+2+c+2+c);
}
int main(){
 c = test(128);
}

Hmm....yes, from C perspective, there's nothing can modify c before it's used the first time (unless you inject the startup code). Therefore, the compiler is safe to assume that c is its initial global value (0) and is able to use constant propagation, with c assumed as constant to reduce the
function call into a simple value.

The assembler code generated for the C program does take into account the initial value of C:

       movl    _c, %eax
       leal    134(%eax,%eax,2), %eax
       movl    %eax, _c

It could also be modified in a C program before "main" gets executed by e.g. the initialisation code of a dynamic library.

In the end, it's not so much about constant propagation as it is about reordering expressions to be able to fold them better.


Jonas
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to