mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
e81f2f4855
commit
dba5d11269
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue