GVNPRE /PRE is not effective

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