simplify-rtl: Fix crash due to simplify_with_subreg_not [PR120059]

r16-286-gd84fbc516ea57d added a call to simplify_gen_subreg but didn't
check if the result of simplify_gen_subreg was non-null. simplify_gen_subreg
can return NULL if the subreg would be not valid. In the case below we had
a hard register for the SSE register xmm0 of mode SI and doing a subreg to
QI mode but QImode is not a valid mode for the SSE register so simplify_gen_subreg
would return NULL.

This adds the obvious check.

Pushed as obvious after bootstrap/test on x86_64-linux-gnu.

	PR rtl-optimization/120059

gcc/ChangeLog:

	* simplify-rtx.cc (simplify_with_subreg_not): Check the result
	of simplify_gen_subreg.

gcc/testsuite/ChangeLog:

	* gcc.dg/torture/pr120059-1.c: New test.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
This commit is contained in:
Andrew Pinski 2025-05-02 09:46:24 -07:00
parent e81f2f4855
commit dba5d11269
2 changed files with 21 additions and 0 deletions

View File

@ -3063,6 +3063,10 @@ simplify_with_subreg_not (rtx_code binop, machine_mode mode, rtx op0, rtx op1)
XEXP (SUBREG_REG (opn), 0),
GET_MODE (SUBREG_REG (opn)),
SUBREG_BYTE (opn));
if (!new_subreg)
return NULL_RTX;
rtx new_not = simplify_gen_unary (NOT, mode, new_subreg, mode);
if (opn == op0)
return simplify_gen_binary (binop, mode, new_not, op1);

View File

@ -0,0 +1,17 @@
/* { dg-do compile } */
/* { dg-options "-g" } */
/* PR rtl-optimization/120059 */
int a[4];
int c, d;
void f(void) {
for (int e = 0; e < 4; e++)
a[e] = e | c;
int b = 0;
if ((a[0] & 1) && (a[0] & 4))
b = 2;
if (a[0] & 16)
b |= 1;
d = ~b;
}