Hi All, The PRE or GVNPRE is not effective for the below use case. int sum; int phi =30; void f (int i, int *a) { if ((a[i] << (1)) > -15) sum =(phi+ 0x7fffffffL )/ a[i]; if ((a[i] << (2)) > -15) sum =(phi + 0x7fffffffL) /a[i]; } respective asm (clang on trunk ) #clang -O3 -S test.c BB#0: # %entry pushl %edi pushl %esi movl 12(%esp), %esi movl 16(%esp), %edi movl (%edi,%esi,4), %ecx leal (%ecx,%ecx), %eax cmpl $-14, %eax jl .LBB0_2 # BB#1: # %if.then movl $2147483647, %eax # imm = 0x7FFFFFFF addl phi, %eax cltd idivl %ecx movl %eax, sum movl (%edi,%esi,4), %ecx .LBB0_2: # %if.end leal (,%ecx,4), %eax cmpl $-14, %eax jl .LBB0_4 # BB#3: # %if.then5 movl $2147483647, %eax # imm = 0x7FFFFFFF addl phi, %eax cltd idivl %ecx movl %eax, sum .LBB0_4: # %if.end9 popl %esi popl %edi ret the instruction sequences like movl $2147483647, %eax # int temp = (phi+ 0x7fffffffL ) addl phi, %eax cltd would had be hoisted in the BB0 from BB1 and BB3 or sure i'm missing something here . Thanks ~Umesh