Message ID | 20201001133337.GM15011@bubble.grove.modra.org |
---|---|
State | New |
Headers | show |
Series | [RS6000] ICE in decompose, at rtl.h:2282 | expand |
Hi! On Thu, Oct 01, 2020 at 11:03:37PM +0930, Alan Modra wrote: > 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. Yes, you can in general not just do GEN_INT on stuff you did arithmetic on. Nice catch :-) Okay for trunk, and backports if possible after a day or two. Thanks! > * config/rs6000/rs6000.c (rs6000_legitimize_address): Properly > sign extend high part of address constant. I would just say "use gen_int_mode" ;-) But this is fine, sure. Segher
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 375fff59928..d0924d59a65 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -8364,7 +8364,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