Commit 5f5c5e0f by Eric Botcazou Committed by Eric Botcazou

re PR target/78002 (gcc.target/aarch64/stack-checking.c ICEs with -mabi=ilp32)

	PR target/78002
	* config/aarch64/aarch64.c (aarch64_emit_probe_stack_range): Replace
	ptr_mode with Pmode throughout.
	* config/aarch64/aarch64.md (probe_stack_range_<PTR:mode): Rename
	into probe_stack_range and use DImode.

From-SVN: r246702
parent d0ee17a5
2017-04-05 Eric Botcazou <ebotcazou@adacore.com>
PR target/78002
* config/aarch64/aarch64.c (aarch64_emit_probe_stack_range): Replace
ptr_mode with Pmode throughout.
* config/aarch64/aarch64.md (probe_stack_range_<PTR:mode): Rename
into probe_stack_range and use DImode.
2017-04-05 Dominik Vogt <vogt@linux.vnet.ibm.com> 2017-04-05 Dominik Vogt <vogt@linux.vnet.ibm.com>
PR target/79890 PR target/79890
......
...@@ -2610,7 +2610,7 @@ aarch64_libgcc_cmp_return_mode (void) ...@@ -2610,7 +2610,7 @@ aarch64_libgcc_cmp_return_mode (void)
static void static void
aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size) aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
{ {
rtx reg1 = gen_rtx_REG (ptr_mode, PROBE_STACK_FIRST_REG); rtx reg1 = gen_rtx_REG (Pmode, PROBE_STACK_FIRST_REG);
/* See the same assertion on PROBE_INTERVAL above. */ /* See the same assertion on PROBE_INTERVAL above. */
gcc_assert ((first % ARITH_FACTOR) == 0); gcc_assert ((first % ARITH_FACTOR) == 0);
...@@ -2622,9 +2622,9 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size) ...@@ -2622,9 +2622,9 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
const HOST_WIDE_INT base = ROUND_UP (size, ARITH_FACTOR); const HOST_WIDE_INT base = ROUND_UP (size, ARITH_FACTOR);
emit_set_insn (reg1, emit_set_insn (reg1,
plus_constant (ptr_mode, plus_constant (Pmode,
stack_pointer_rtx, -(first + base))); stack_pointer_rtx, -(first + base)));
emit_stack_probe (plus_constant (ptr_mode, reg1, base - size)); emit_stack_probe (plus_constant (Pmode, reg1, base - size));
} }
/* The run-time loop is made up of 8 insns in the generic case while the /* The run-time loop is made up of 8 insns in the generic case while the
...@@ -2634,7 +2634,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size) ...@@ -2634,7 +2634,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
HOST_WIDE_INT i, rem; HOST_WIDE_INT i, rem;
emit_set_insn (reg1, emit_set_insn (reg1,
plus_constant (ptr_mode, plus_constant (Pmode,
stack_pointer_rtx, stack_pointer_rtx,
-(first + PROBE_INTERVAL))); -(first + PROBE_INTERVAL)));
emit_stack_probe (reg1); emit_stack_probe (reg1);
...@@ -2645,7 +2645,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size) ...@@ -2645,7 +2645,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
for (i = 2 * PROBE_INTERVAL; i < size; i += PROBE_INTERVAL) for (i = 2 * PROBE_INTERVAL; i < size; i += PROBE_INTERVAL)
{ {
emit_set_insn (reg1, emit_set_insn (reg1,
plus_constant (ptr_mode, reg1, -PROBE_INTERVAL)); plus_constant (Pmode, reg1, -PROBE_INTERVAL));
emit_stack_probe (reg1); emit_stack_probe (reg1);
} }
...@@ -2654,11 +2654,11 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size) ...@@ -2654,11 +2654,11 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
{ {
const HOST_WIDE_INT base = ROUND_UP (rem, ARITH_FACTOR); const HOST_WIDE_INT base = ROUND_UP (rem, ARITH_FACTOR);
emit_set_insn (reg1, plus_constant (ptr_mode, reg1, -base)); emit_set_insn (reg1, plus_constant (Pmode, reg1, -base));
emit_stack_probe (plus_constant (ptr_mode, reg1, base - rem)); emit_stack_probe (plus_constant (Pmode, reg1, base - rem));
} }
else else
emit_stack_probe (plus_constant (ptr_mode, reg1, -rem)); emit_stack_probe (plus_constant (Pmode, reg1, -rem));
} }
/* Otherwise, do the same as above, but in a loop. Note that we must be /* Otherwise, do the same as above, but in a loop. Note that we must be
...@@ -2668,7 +2668,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size) ...@@ -2668,7 +2668,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
equality test for the loop condition. */ equality test for the loop condition. */
else else
{ {
rtx reg2 = gen_rtx_REG (ptr_mode, PROBE_STACK_SECOND_REG); rtx reg2 = gen_rtx_REG (Pmode, PROBE_STACK_SECOND_REG);
/* Step 1: round SIZE to the previous multiple of the interval. */ /* Step 1: round SIZE to the previous multiple of the interval. */
...@@ -2679,11 +2679,11 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size) ...@@ -2679,11 +2679,11 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
/* TEST_ADDR = SP + FIRST. */ /* TEST_ADDR = SP + FIRST. */
emit_set_insn (reg1, emit_set_insn (reg1,
plus_constant (ptr_mode, stack_pointer_rtx, -first)); plus_constant (Pmode, stack_pointer_rtx, -first));
/* LAST_ADDR = SP + FIRST + ROUNDED_SIZE. */ /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE. */
emit_set_insn (reg2, emit_set_insn (reg2,
plus_constant (ptr_mode, stack_pointer_rtx, plus_constant (Pmode, stack_pointer_rtx,
-(first + rounded_size))); -(first + rounded_size)));
...@@ -2699,10 +2699,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size) ...@@ -2699,10 +2699,7 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
probes at FIRST + N * PROBE_INTERVAL for values of N from 1 probes at FIRST + N * PROBE_INTERVAL for values of N from 1
until it is equal to ROUNDED_SIZE. */ until it is equal to ROUNDED_SIZE. */
if (ptr_mode == DImode) emit_insn (gen_probe_stack_range (reg1, reg1, reg2));
emit_insn (gen_probe_stack_range_di (reg1, reg1, reg2));
else
emit_insn (gen_probe_stack_range_si (reg1, reg1, reg2));
/* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time /* Step 4: probe at FIRST + SIZE if we cannot assert at compile-time
...@@ -2716,11 +2713,11 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size) ...@@ -2716,11 +2713,11 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
{ {
const HOST_WIDE_INT base = ROUND_UP (rem, ARITH_FACTOR); const HOST_WIDE_INT base = ROUND_UP (rem, ARITH_FACTOR);
emit_set_insn (reg2, plus_constant (ptr_mode, reg2, -base)); emit_set_insn (reg2, plus_constant (Pmode, reg2, -base));
emit_stack_probe (plus_constant (ptr_mode, reg2, base - rem)); emit_stack_probe (plus_constant (Pmode, reg2, base - rem));
} }
else else
emit_stack_probe (plus_constant (ptr_mode, reg2, -rem)); emit_stack_probe (plus_constant (Pmode, reg2, -rem));
} }
} }
......
...@@ -5412,11 +5412,11 @@ ...@@ -5412,11 +5412,11 @@
(set_attr "type" "block")] (set_attr "type" "block")]
) )
(define_insn "probe_stack_range_<PTR:mode>" (define_insn "probe_stack_range"
[(set (match_operand:PTR 0 "register_operand" "=r") [(set (match_operand:DI 0 "register_operand" "=r")
(unspec_volatile:PTR [(match_operand:PTR 1 "register_operand" "0") (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "0")
(match_operand:PTR 2 "register_operand" "r")] (match_operand:DI 2 "register_operand" "r")]
UNSPECV_PROBE_STACK_RANGE))] UNSPECV_PROBE_STACK_RANGE))]
"" ""
{ {
return aarch64_output_probe_stack_range (operands[0], operands[2]); return aarch64_output_probe_stack_range (operands[0], operands[2]);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment