diff mbox series

[RS6000] ICE in decompose, at rtl.h:2282

Message ID 20201001133337.GM15011@bubble.grove.modra.org
State New
Headers show
Series [RS6000] ICE in decompose, at rtl.h:2282 | expand

Commit Message

Alan Modra Oct. 1, 2020, 1:33 p.m. UTC
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.

Bootstrapped and regression tested powerpc64-linux biarch and
powerpc64le-linux.  OK?

	* config/rs6000/rs6000.c (rs6000_legitimize_address): Properly
	sign extend high part of address constant.

Comments

Segher Boessenkool Oct. 1, 2020, 10:54 p.m. UTC | #1
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 mbox series

Patch

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