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.