------- Comment #4 from steven at gcc dot gnu dot org 2006-05-02 17:38 ------- The inner loop in the .cunroll, .ivopts and .final_cleanup with GVN-PRE disabled look like this:
# Int_Index_37 = PHI <Int_Index_58(5), Int_Loc_3(3)>; <L0>:; (*D.1561_56)[Int_Index_37] = Int_Loc_3; Int_Index_58 = Int_Index_37 + 1; if (D.1563_41 >= Int_Index_58) goto <L8>; else goto <L2>; <L8>:; goto <bb 4> (<L0>); and # ivtmp.34_26 = PHI <ivtmp.34_19(5), ivtmp.34_1(3)>; # Int_Index_37 = PHI <Int_Index_58(5), Int_Loc_3(3)>; <L0>:; D.1613_59 = (int *) ivtmp.34_26; MEM[base: D.1613_59, offset: 20B] = Int_Loc_3; Int_Index_58 = Int_Index_37 + 1; ivtmp.34_19 = ivtmp.34_26 + 4B; if (D.1563_41 >= Int_Index_58) goto <L8>; else goto <L2>; <L8>:; goto <bb 4> (<L0>); and <L0>:; MEM[base: (int *) ivtmp.34, offset: 20B] = Int_Loc; Int_Index = Int_Index + 1; ivtmp.34 = ivtmp.34 + 4B; if (D.1563 >= Int_Index) goto <L0>; else goto <L2>; which compiles to: .L4: addl $1, %eax movl %ecx, 20(%edx) addl $4, %edx cmpl %eax, %ebx jge .L4 With PRE enabled, we get this: # Int_Index_37 = PHI <Int_Index_58(6), Int_Loc_3(4)>; <L0>:; D.1559_54 = pretmp.27_59; D.1560_55 = pretmp.28_45; D.1561_56 = pretmp.28_49; (*pretmp.28_49)[Int_Index_37] = Int_Loc_3; Int_Index_58 = Int_Index_37 + 1; if (D.1563_41 >= Int_Index_58) goto <L8>; else goto <L9>; <L8>:; goto <bb 5> (<L0>); and # ivtmp.38_26 = PHI <ivtmp.38_35(6), 0(4)>; <L0>:; D.1559_54 = pretmp.27_59; D.1560_55 = pretmp.28_45; D.1561_56 = pretmp.28_49; D.1622_34 = (int *) pretmp.28_49; D.1623_33 = (int *) Int_1_Par_Val_2; D.1624_22 = (int *) ivtmp.38_26; D.1625_21 = D.1623_33 + D.1624_22; MEM[base: D.1622_34, index: D.1625_21, step: 4B, offset: 20B] = Int_Loc_3; ivtmp.38_35 = ivtmp.38_26 + 1; D.1626_20 = (unsigned int) Int_1_Par_Val_2; D.1627_17 = D.1626_20 + ivtmp.38_35; D.1628_16 = D.1627_17 + 5; Int_Index_15 = (One_Fifty) D.1628_16; if (D.1563_41 >= Int_Index_15) goto <L8>; else goto <L9>; <L8>:; goto <bb 5> (<L0>); and <L0>:; MEM[base: (int *) prephitmp.33, index: (int *) Int_1_Par_Val + (int *) ivtmp.38, step: 4B, offset: 20B] = Int_Loc; ivtmp.38 = ivtmp.38 + 1; if ((One_Fifty) ((unsigned int) Int_1_Par_Val + 5 + ivtmp.38) <= D.1563) goto <L0>; else goto <L2>; and from there: .L5: leal (%edi,%edx), %eax addl $1, %edx movl %ecx, 20(%ebx,%eax,4) leal (%ecx,%edx), %eax cmpl %esi, %eax jle .L5 So it's a mix of PRE and IVOPTs that gives this strange code. BTW regarding "Its strange that tree-ch messes up", please next time don't blame random passes if you don't fully analyze the problem. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=26944