[RS6000] ICE in decompose, at rtl.h:2282
authorAlan Modra <amodra@gmail.com>
Thu, 1 Oct 2020 09:44:09 +0000 (19:14 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 1 Oct 2020 23:06:25 +0000 (08:36 +0930)
during RTL pass: fwprop1
gcc.dg/pr82596.c: In function 'test_cststring':
gcc.dg/pr82596.c:27:1: internal compiler error: in decompose, at rtl.h:2282

-m32 gcc/testsuite/gcc.dg/pr82596.c fails along with other tests after
applying rtx_cost patches, which exposed a backend bug.
legitimize_address when presented with the following address
(plus (reg) (const_int 0x7ffffffff))
attempts to rewrite it as a high/low sum.  The low part is 0xffff, or
-1, making the high part 0x80000000.  But this is no longer canonical
for SImode.

* config/rs6000/rs6000.c (rs6000_legitimize_address): Use
gen_int_mode for high part of address constant.

gcc/config/rs6000/rs6000.c

index 1b5b8e213bfc35391350f437962e9b6cbd0d7c0a..69c4f368efb8edbdf7348ca43f8adfbecbed0c05 100644 (file)
@@ -8455,7 +8455,7 @@ rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
        low_int = 0;
       high_int = INTVAL (XEXP (x, 1)) - low_int;
       sum = force_operand (gen_rtx_PLUS (Pmode, XEXP (x, 0),
-                                        GEN_INT (high_int)), 0);
+                                        gen_int_mode (high_int, Pmode)), 0);
       return plus_constant (Pmode, sum, low_int);
     }
   else if (GET_CODE (x) == PLUS