https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102705
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |pinskia at gcc dot gnu.org --- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Actually we should be able to convert: # RANGE [irange] int [0, 1] MASK 0x1 VALUE 0x0 _2 = 1 >> b.1_1; Into: `b.1_1 == 0` as b.1_1 since the only value that gives out 1 that is defined is 0. That might solve it too. Since if we had that, then: _t = b.1_1 == 0; _2 = (int)_t; iftmp.0_9 = (char) _2; _3 = (unsigned int) _2; b = _3; _4 = iftmp.0_9 ^ 1; _22 = (short int) _4; _5 = (short int) _2; if (_5 == _22) and then: _t1 = b.1_1 != 0; _4 = (char) _t1; _22 = (short int)_t1; _2 = (short int)_t; And then _t1 == _t1 which gives false. So maybe: /* `1 >> x` can be "simplified" into `(convert)x == 0`. */ (simplify (rshift integer_onep @2) (if (INTEGRAL_TYPE_P (type)) (convert (eq:boolean_type_node @2 { build_zero_cst (type); }))))