In this code, a <<= 1 is fully redundant unsigned short f(unsigned short a) { if (a & 0x8000) a <<= 1, a = a ^ 0x1021; else a <<= 1;
return a; } the body should be turned into unsigned short f(unsigned short a) { unsigned short b = a << 1; if (a & 0x8000) a = b, a = a ^ 0x1021; else a = b; return a; } or something similar. However PRE leaves the GIMPLE unchanged: f (a) { int D.1267; short int a.0; <bb 0>: a.0_3 = (short int) a_2; if (a.0_3 < 0) goto <L0>; else goto <L1>; <L0>:; a_7 = a_2 << 1; a_8 = a_7 ^ 4129; goto <bb 3> (<L2>); <L1>:; a_6 = a_2 << 1; # a_1 = PHI <a_8(1), a_6(2)>; <L2>:; D.1267_4 = (int) a_1; return D.1267_4; } On PPC, this is only caught after reload. Paolo -- Summary: missed fully redundant expression Product: gcc Version: 4.1.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P2 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: bonzini at gcc dot gnu dot org CC: gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23286