From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25003 invoked by alias); 2 May 2006 17:38:12 -0000 Received: (qmail 24980 invoked by uid 48); 2 May 2006 17:38:08 -0000 Date: Tue, 02 May 2006 17:38:00 -0000 Message-ID: <20060502173808.24979.qmail@sourceware.org> X-Bugzilla-Reason: CC References: Subject: [Bug tree-optimization/26944] [4.1/4.2 Regression] -ftree-ch generates worse code In-Reply-To: Reply-To: gcc-bugzilla@gcc.gnu.org To: gcc-bugs@gcc.gnu.org From: "steven at gcc dot gnu dot org" Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2006-05/txt/msg00198.txt.bz2 List-Id: ------- 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 ; :; (*D.1561_56)[Int_Index_37] = Int_Loc_3; Int_Index_58 = Int_Index_37 + 1; if (D.1563_41 >= Int_Index_58) goto ; else goto ; :; goto (); and # ivtmp.34_26 = PHI ; # Int_Index_37 = PHI ; :; 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 ; else goto ; :; goto (); and :; 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 ; else goto ; 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 ; :; 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 ; else goto ; :; goto (); and # ivtmp.38_26 = PHI ; :; 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 ; else goto ; :; goto (); and :; 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 ; else goto ; 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