Hi Richi, Following up your suggestion on PR41488, I am continuing to test with loop header copy before FRE in GCC 4.4.1. One regression I am trying to tackle is from the test case below.
typedef struct { int degree; int c[(256)]; } swbcht_Polynomial; typedef struct { int m; int n; const swbcht_Polynomial *primPoly; unsigned short alpha[(1 << (13))]; } swbcht_GF; typedef struct { swbcht_GF gf; } swbcht_Handle; static const swbcht_Polynomial _primPoly13; void _ComputeGFLookupTables (swbcht_Handle *bchH, int m) { int i, j; swbcht_GF *gf = &bchH->gf; gf->m = m; gf->n = (1 << m) - 1; gf->primPoly = &_primPoly13; for (i = 0; i < gf->m; i++) { gf->alpha[gf->m] ^= (gf->primPoly->c[i] * gf->alpha[i]); } } The dump after CH - FRE looks like _ComputeGFLookupTables (struct swbcht_Handle * bchH, int m) { int i; short unsigned int D.1241; short int D.1240; short int D.1239; short unsigned int D.1238; short unsigned int D.1237; short unsigned int D.1236; const int D.1235; const struct swbcht_Polynomial * D.1233; short int D.1232; short unsigned int D.1231; int D.1230; int D.1229; int D.1228; <bb 2>: bchH_2(D)->gf.m = m_4(D); D.1228_5 = 1 << m_4(D); D.1229_6 = D.1228_5 + -1; bchH_2(D)->gf.n = D.1229_6; bchH_2(D)->gf.primPoly = &_primPoly13; if (m_4(D) > 0) goto <bb 5>; else goto <bb 6>; <bb 6>: goto <bb 4>; <bb 5>: <bb 3>: # i_35 = PHI <0(5), i_23(7)> D.1230_10 = bchH_2(D)->gf.m; D.1231_11 = bchH_2(D)->gf.alpha[D.1230_10]; D.1232_12 = (short int) D.1231_11; D.1233_13 = bchH_2(D)->gf.primPoly; D.1235_15 = D.1233_13->c[i_35]; D.1236_16 = (short unsigned int) D.1235_15; D.1237_18 = bchH_2(D)->gf.alpha[i_35]; D.1238_19 = D.1236_16 * D.1237_18; D.1239_20 = (short int) D.1238_19; D.1240_21 = D.1239_20 ^ D.1232_12; D.1241_22 = (short unsigned int) D.1240_21; bchH_2(D)->gf.alpha[D.1230_10] = D.1241_22; i_23 = i_35 + 1; D.1230_8 = bchH_2(D)->gf.m; if (i_23 < D.1230_8) goto <bb 7>; else goto <bb 8>; <bb 7>: goto <bb 3>; <bb 8>: <bb 4>: return; } 1. Why does FRE miss eliminating expression bchH_2(D)->gf.primPoly in bb 3 with &_primPoly13. This is normally the case if we ran FRE then CH. Further PRE identifies bchH_2(D)->gf.primPoly as a partially redundant expression and hoists it into predecessor bb 7 and we get <bb 3>: # i_35 = PHI <0(5), i_23(7)> # prephitmp.25_49 = PHI <m_4(D)(5), D.1230_8(7)> # prephitmp.27_51 = PHI <&_primPoly13(5), pretmp.26_50(7)> D.1230_10 = prephitmp.25_49; D.1231_11 = bchH_2(D)->gf.alpha[D.1230_10]; D.1232_12 = (short int) D.1231_11; D.1233_13 = prephitmp.27_51; D.1235_15 = D.1233_13->c[i_35]; D.1236_16 = (short unsigned int) D.1235_15; D.1237_18 = bchH_2(D)->gf.alpha[i_35]; D.1238_19 = D.1236_16 * D.1237_18; D.1239_20 = (short int) D.1238_19; D.1240_21 = D.1239_20 ^ D.1232_12; D.1241_22 = (short unsigned int) D.1240_21; bchH_2(D)->gf.alpha[D.1230_10] = D.1241_22; i_23 = i_35 + 1; D.1230_8 = bchH_2(D)->gf.m; if (D.1230_8 > i_23) goto <bb 7>; else goto <bb 8>; <bb 7>: pretmp.26_50 = bchH_2(D)->gf.primPoly; goto <bb 3>; Clearly prephitmp.27_51 will make a redundant induction variable. Stepping through the insert_into_preds_of_block in tree-ssa-pre.c I can see the value numbers for expression bchH_2(D)->gf.primPoly available through bb 3 and through bb 2 are different. 2. Is this because alias analysis cannot determine bchH_2(D)->gf has a unique target? Many Thanks, Rahul