https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106884
Bug ID: 106884 Summary: ifcombine may move shift so it shifts more than bitwidth Product: gcc Version: 13.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: kristerw at gcc dot gnu.org Target Milestone: --- The function foo from gcc.dg/tree-ssa/ssa-ifcombine-1.c can be called as foo(1, 1, 33) without invoking undefined behavior int foo (int x, int a, int b) { int c = 1 << a; if (x & c) if (x & (1 << b)) return 2; return 0; } But ifcombine transforms this to int foo (int x, int a, int b) { int c; int _4; int _10; int _11; int _12; int _13; <bb 2>: _10 = 1 << b_8(D); _11 = 1 << a_5(D); _12 = _10 | _11; _13 = x_7(D) & _12; if (_12 == _13) goto <bb 3>; else goto <bb 4>; <bb 3>: <bb 4>: # _4 = PHI <2(3), 0(2)> return _4; } and this will now calculate 1 << 33 unconditionally for _10.