rtlanal: Fix up replace_rtx [PR105333]
The following testcase FAILs, because replace_rtx replaces a REG with CONST_WIDE_INT inside of a SUBREG, which is an invalid transformation because a SUBREG relies on SUBREG_REG having non-VOIDmode but CONST_WIDE_INT has VOIDmode. replace_rtx already has code to deal with it, but it was doing it only for CONST_INTs. The following patch does it also for VOIDmode CONST_DOUBLE or CONST_WIDE_INT. 2022-04-22 Jakub Jelinek <jakub@redhat.com> PR rtl-optimization/105333 * rtlanal.cc (replace_rtx): Use simplify_subreg or simplify_unary_operation if CONST_SCALAR_INT_P rather than just CONST_INT_P. * gcc.dg/pr105333.c: New test.
This commit is contained in:
parent
c1a9cf6791
commit
7092b7aea1
@ -3390,7 +3390,7 @@ replace_rtx (rtx x, rtx from, rtx to, bool all_regs)
|
||||
{
|
||||
rtx new_rtx = replace_rtx (SUBREG_REG (x), from, to, all_regs);
|
||||
|
||||
if (CONST_INT_P (new_rtx))
|
||||
if (CONST_SCALAR_INT_P (new_rtx))
|
||||
{
|
||||
x = simplify_subreg (GET_MODE (x), new_rtx,
|
||||
GET_MODE (SUBREG_REG (x)),
|
||||
@ -3406,7 +3406,7 @@ replace_rtx (rtx x, rtx from, rtx to, bool all_regs)
|
||||
{
|
||||
rtx new_rtx = replace_rtx (XEXP (x, 0), from, to, all_regs);
|
||||
|
||||
if (CONST_INT_P (new_rtx))
|
||||
if (CONST_SCALAR_INT_P (new_rtx))
|
||||
{
|
||||
x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
|
||||
new_rtx, GET_MODE (XEXP (x, 0)));
|
||||
|
21
gcc/testsuite/gcc.dg/pr105333.c
Normal file
21
gcc/testsuite/gcc.dg/pr105333.c
Normal file
@ -0,0 +1,21 @@
|
||||
/* PR rtl-optimization/105333 */
|
||||
/* { dg-do compile { target int128 } } */
|
||||
/* { dg-options "-Og -fno-tree-coalesce-vars -fno-tree-fre" } */
|
||||
|
||||
int g;
|
||||
short s;
|
||||
|
||||
static inline unsigned short
|
||||
bar (short a, __int128 b)
|
||||
{
|
||||
b ^= (unsigned long) -a;
|
||||
__builtin_strncpy ((void *) &s, (void *) &a, 1);
|
||||
b *= 14;
|
||||
return b;
|
||||
}
|
||||
|
||||
void
|
||||
foo (void)
|
||||
{
|
||||
g *= (__int128) bar (1, 1);
|
||||
}
|
Loading…
Reference in New Issue
Block a user