https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110875
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed| |2023-08-03 Ever confirmed|0 |1 Status|UNCONFIRMED |NEW --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Confirmed. Though I have no idea how to fix this really. The first major change to the IR happens in thread2 where we decide to do a jump thread with the change that we didn't do before. In GCC 13 we had: ``` <bb 4> [local count: 282631250]: # a.8_39 = PHI <_12(23), 0(3)> # f_lsm.17_20 = PHI <f_lsm.17_16(23), f_lsm.17_51(3)> # f_lsm_flag.18_22 = PHI <f_lsm_flag.18_10(23), 0(3)> # b_lsm.19_45 = PHI <0(23), b_lsm.19_53(3)> # b_lsm_flag.20_47 = PHI <1(23), 0(3)> # a_lsm.21_49 = PHI <_12(23), _55(D)(3)> _1 = a.8_39 != 0; _2 = (int) _1; if (_2 != a.8_39) goto <bb 5>; [41.79%] ``` On the trunk we get: ``` <bb 4> [local count: 339987332]: # a.8_38 = PHI <_10(24), 0(3)> # f_lsm.17_18 = PHI <f_lsm.17_14(24), f_lsm.17_50(3)> # f_lsm_flag.18_20 = PHI <f_lsm_flag.18_8(24), 0(3)> # b_lsm.19_44 = PHI <0(24), b_lsm.19_52(3)> # b_lsm_flag.20_46 = PHI <1(24), 0(3)> # a_lsm.21_48 = PHI <_10(24), _54(D)(3)> _13 = (unsigned int) a.8_38; if (_13 > 1) goto <bb 5>; [34.74%] else goto <bb 7>; [65.26%] ``` We duplicate bb4 for bb3 as we can figure that _13>1 will be false. This was not done for the IR in GCC 13. I am super confused about VRP's ranges: We have the following that ranges that get exported and their relationships: Global Exported: a.8_105 = [irange] int [-2, 0] _10 = a.8_105 + -1; Global Exported: _10 = [irange] int [-INF, -6][-3, -1][1, 2147483645] _103 = (unsigned int) _10; Global Exported: _103 = [irange] unsigned int [1, 2147483645][2147483648, 4294967290][4294967294, +INF] Simplified relational if (_103 > 1) into if (_103 != 1) Shouldn't the range of _10 just be [-3,-1] ???? If so _103 can't get 0 or 1 ? And then if that gets it right then the call to foo will go away.