diff mbox series

VAX: Fix lower bound adjustment with `casesi'

Message ID alpine.LFD.2.21.2012101013440.2104409@eddie.linux-mips.org
State Accepted
Headers show
Series VAX: Fix lower bound adjustment with `casesi' | expand

Commit Message

Maciej W. Rozycki Dec. 10, 2020, 11:20 a.m. UTC
Fix an issue with the `casesi' expander using `GEN_INT' to produce the 
constant rtx for lower bound adjustment.  This generates a VOIDmode 
value which may overflow the SImode range required for the operand to 
stay within to satisfy `general_operand', resulting in an ICE like:

.../gcc/testsuite/gcc.c-torture/compile/pr46934.c: In function 'caller':
.../gcc/testsuite/gcc.c-torture/compile/pr46934.c:17:1: error: unrecognizable insn:
(insn 5 2 6 2 (set (reg:SI 25)
        (plus:SI (mem/c:SI (reg/f:SI 17 virtual-incoming-args) [1 reg_type+0 S4 A32])
            (const_int 2147483648 [0x80000000]))) -1
     (nil))
during RTL pass: vregs
.../gcc/testsuite/gcc.c-torture/compile/pr46934.c:17:1: internal compiler error: in extract_insn, at recog.c:2315
0x110d4673 _fatal_insn(char const*, rtx_def const*, char const*, int, char const*)
	.../gcc/rtl-error.c:108
0x110d46eb _fatal_insn_not_found(rtx_def const*, char const*, int, char const*)
	.../gcc/rtl-error.c:116
0x1106578b extract_insn(rtx_insn*)
	.../gcc/recog.c:2315
0x10b63f73 instantiate_virtual_regs_in_insn
	.../gcc/function.c:1609
0x10b65b2f instantiate_virtual_regs
	.../gcc/function.c:1979
0x10b65ca7 execute
	.../gcc/function.c:2028
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
compiler exited with status 1
FAIL: gcc.c-torture/compile/pr46934.c   -O0  (internal compiler error)

Use `gen_int_mode' to produce the rtx instead, requesting a SImode value 
so that the constant gets correctly truncated:

@@ -199,7 +199,7 @@ caller (unsigned int reg_type)

 (insn 5 4 6 (set (reg:SI 25)
         (plus:SI (mem/c:SI (reg/f:SI 17 virtual-incoming-args) [1 reg_type+0 S4 A32])
-            (const_int 2147483648 [0x80000000]))) -1
+            (const_int -2147483648 [0xffffffff80000000]))) -1
      (nil))

 (jump_insn 6 5 7 (set (pc)

removing these test suite failures:

FAIL: gcc.c-torture/compile/pr46934.c   -O0  (internal compiler error)
FAIL: gcc.c-torture/compile/pr46934.c   -O0  (test for excess errors)

with the `vax-netbsdelf' target.

	gcc/
	* config/vax/vax.md (casesi): Use `gen_int_mode' rather than
	`GEN_INT' for the immediate used for lower bound adjustment.
---
 gcc/config/vax/vax.md |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Jeff Law Dec. 13, 2020, 4:02 p.m. UTC | #1
On 12/10/20 4:20 AM, Maciej W. Rozycki wrote:
> Fix an issue with the `casesi' expander using `GEN_INT' to produce the 
> constant rtx for lower bound adjustment.  This generates a VOIDmode 
> value which may overflow the SImode range required for the operand to 
> stay within to satisfy `general_operand', resulting in an ICE like:
>
> .../gcc/testsuite/gcc.c-torture/compile/pr46934.c: In function 'caller':
> .../gcc/testsuite/gcc.c-torture/compile/pr46934.c:17:1: error: unrecognizable insn:
> (insn 5 2 6 2 (set (reg:SI 25)
>         (plus:SI (mem/c:SI (reg/f:SI 17 virtual-incoming-args) [1 reg_type+0 S4 A32])
>             (const_int 2147483648 [0x80000000]))) -1
>      (nil))
> during RTL pass: vregs
> .../gcc/testsuite/gcc.c-torture/compile/pr46934.c:17:1: internal compiler error: in extract_insn, at recog.c:2315
> 0x110d4673 _fatal_insn(char const*, rtx_def const*, char const*, int, char const*)
> 	.../gcc/rtl-error.c:108
> 0x110d46eb _fatal_insn_not_found(rtx_def const*, char const*, int, char const*)
> 	.../gcc/rtl-error.c:116
> 0x1106578b extract_insn(rtx_insn*)
> 	.../gcc/recog.c:2315
> 0x10b63f73 instantiate_virtual_regs_in_insn
> 	.../gcc/function.c:1609
> 0x10b65b2f instantiate_virtual_regs
> 	.../gcc/function.c:1979
> 0x10b65ca7 execute
> 	.../gcc/function.c:2028
> Please submit a full bug report,
> with preprocessed source if appropriate.
> Please include the complete backtrace with any bug report.
> See <https://gcc.gnu.org/bugs/> for instructions.
> compiler exited with status 1
> FAIL: gcc.c-torture/compile/pr46934.c   -O0  (internal compiler error)
>
> Use `gen_int_mode' to produce the rtx instead, requesting a SImode value 
> so that the constant gets correctly truncated:
>
> @@ -199,7 +199,7 @@ caller (unsigned int reg_type)
>
>  (insn 5 4 6 (set (reg:SI 25)
>          (plus:SI (mem/c:SI (reg/f:SI 17 virtual-incoming-args) [1 reg_type+0 S4 A32])
> -            (const_int 2147483648 [0x80000000]))) -1
> +            (const_int -2147483648 [0xffffffff80000000]))) -1
>       (nil))
>
>  (jump_insn 6 5 7 (set (pc)
>
> removing these test suite failures:
>
> FAIL: gcc.c-torture/compile/pr46934.c   -O0  (internal compiler error)
> FAIL: gcc.c-torture/compile/pr46934.c   -O0  (test for excess errors)
>
> with the `vax-netbsdelf' target.
>
> 	gcc/
> 	* config/vax/vax.md (casesi): Use `gen_int_mode' rather than
> 	`GEN_INT' for the immediate used for lower bound adjustment.
OK
jeff
diff mbox series

Patch

Index: gcc/gcc/config/vax/vax.md
===================================================================
--- gcc.orig/gcc/config/vax/vax.md
+++ gcc/gcc/config/vax/vax.md
@@ -2816,7 +2816,7 @@ 
       rtx index = gen_reg_rtx (SImode);
       emit_insn (gen_addsi3 (index,
 			     operands[0],
-			     GEN_INT (-INTVAL (operands[1]))));
+			     gen_int_mode (-INTVAL (operands[1]), SImode)));
       operands[0] = index;
     }