https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100359
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2021-09-25 Ever confirmed|0 |1 --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- The difference starts in cunrolli. -O2 does a decent job at unrolling this mess: goto <bb 9>; [100.00%] <bb 3> [local count: 4278941306]: j[g_10] = &b; <bb 4> [local count: 8557882624]: # h_11 = PHI <1(3), 0(7)> if (h_11 == 0) goto <bb 3>; [50.00%] else goto <bb 5>; [50.00%] <bb 5> [local count: 4278941306]: g_12 = g_10 + 1; <bb 6> [local count: 12966488877]: # g_10 = PHI <g_12(5), 0(10)> if (g_10 != 3) goto <bb 7>; [33.00%] else goto <bb 8>; [67.00%] <bb 7> [local count: 4278941306]: goto <bb 4>; [100.00%] <bb 8> [local count: 8687547571]: _13 = j[0]; a = _13; j ={v} {CLOBBER}; c.2_14 = c; *c.2_14 = &b; _16 = f.4_15 + 1; f = _16; <bb 9> [local count: 9761289395]: f.4_15 = f; if (f.4_15 <= 0) goto <bb 10>; [89.00%] else goto <bb 11>; [11.00%] <bb 10> [local count: 8687547571]: goto <bb 6>; [100.00%] But -O3 does not but It gets almost cleared up before pre but the -O3 case we have: f = 0; a = &b; j ={v} {CLOBBER}; c.2_14 = c; *c.2_14 = &b; f = 1; a.0_1 = a; *a.0_1 = 0; c.1_2 = c; _3 = *c.1_2; _4 = *_3; While in the -O2 case we have: f = 0; a = &b; c.2_14 = c; *c.2_14 = &b; f = 1; a.0_1 = a; *a.0_1 = 0; c.1_2 = c; _3 = *c.1_2; _4 = *_3; The clobber is getting in the way of pre.