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