https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110903
Andrew Pinski changed:
What|Removed |Added
Last reconfirmed||2023-08-04
Status|UNCONFIRMED |NEW
Target Milestone|--- |12.4
Ever confirmed|0 |1
Keywords||needs-bisection
Summary|[14 Regression] Dead Code |[12/13/14 Regression] Dead
|Elimination Regression |Code Elimination Regression
|since r14-1597-g64d90d06d2d |
--- Comment #2 from Andrew Pinski ---
Confirmed. before r14-1597, there was a jump threading happening with respect
to:
if (j_32 <= 0)
goto ; [50.00%]
else
goto ; [50.00%]
[local count: 238907556]:
[local count: 477815112]:
# iftmp.10_37 = PHI <_11(7), 0(8)>
But after, we change that into
iftmp.10_37 = _11 & (j_32 <= 0);
It just happens we depend on that due to:
_43 = l_22 | _25;
_39 = j_32 <= 0;
_12 = ~_43;
_44 = _12 & _39;
If we change the code to be:
```
void foo(void);
static signed char b, c;
static short e, f;
static int g = 41317;
static int(a)(int h, int i) { return h + i; }
static int(d)(int h, int i) { return i & h;}//i ? h : 0; }
short t = 10;
int main() {
{
signed char j;
short k = t;
for (; g >= 10; g = (short)g) {
_Bool l = 1;
int m = 0;
j = 8 * k;
k = j <= 0;
f = c + 3;
for (; c < 2; c = f) {
signed char n = 4073709551615;
if (!(((m) >= 0) && ((m) <= 0))) {
__builtin_unreachable();
}
if (g)
;
else {
if ((m = k, (b = a(d(l, k), e) && n) || l) < k) foo();
e = l = 0;
}
}
}
}
}
```
GCC 11 is able to remove the call to foo but GCC 12 cannot.
the IR for the part where the phiopt2 changes on the trunk is similar enough.
So this is instead a regression from GCC 11.