http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49911
Summary: vrp2 + -fstrict-enums incorrectly remove predicate Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassig...@gcc.gnu.org ReportedBy: rafael.espind...@gmail.com with a r176947 cc1plus, running cc1plus -fstrict-enums -fdump-tree-all ~/tmpfs/test2.ii -fno-rtti -fno-exceptions -fno-strict-aliasing -m32 -O2 in extern void JS_Assert(); typedef enum { eax, ecx, edx, ebx, esp, ebp, esi, edi } RegisterID; union StateRemat { RegisterID reg_; int offset_; }; static StateRemat FromRegister(RegisterID reg) { StateRemat sr; sr.reg_ = reg; return sr; } static StateRemat FromAddress3(int address) { StateRemat sr; sr.offset_ = address; //sr.offset_ = 0; if (address < 46 && address >= 0) { JS_Assert(); } return sr; } struct FrameState { StateRemat dataRematInfo2(bool y, int z) { if (y) return FromRegister(RegisterID(1)); return FromAddress3(z); } }; FrameState frame; StateRemat x; void jsop_setelem(bool y, int z) { x = frame.dataRematInfo2(y, z); } produces a test2.ii.123t.vrp2 with: Folding predicate SR.6_11 <= 45 to 1 replacing the "sr.offset_ = address" line with sr.offset_ = 0 prevents the transformation.