Split out from PR31136. Testcase: struct S { unsigned b4:4; unsigned b6:6; } s;
int main(void){ s.b6 = 31; s.b4 = s.b6; s.b6 = s.b4; return s.b6 == 15 ? 0 : 1; } with gcc 4.2 FRE can look through s.b6 to see the 31 for the store to s.b4. With mainline this no longer happens: On 4.2 we have for the def_stmt # SFT.0D.1539_2 = V_MUST_DEF <SFT.0D.1539_1>; sD.1526.b6D.1525 = 31 while on the trunk # SFT.0_10 = VDEF <SFT.0_9(D)> { SFT.0 } s.b6 = 31 and the predicate !ZERO_SSA_OPERANDS (def_stmt, SSA_OP_VIRTUAL_USES) evaluates differently on them. *sigh* Also, create_value_expr_from does not fold the result even if it produces constant arguments (generated by above look-through-loads). This may confuse fold (as it did in PR31136). -- Summary: [4.3 Regression] FRE does not fold intermediate CCP results, FRE does no longer look through loads Product: gcc Version: 4.3.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: rguenth at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31651