aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2021-02-19 13:05:47 +0100
committerJakub Jelinek <jakub@redhat.com>2021-02-19 13:05:47 +0100
commit1a132c4d7cdb22cbab85b8596418daa2c3157812 (patch)
tree8cb548532a88091b386d0663eb9e9c5a50e860bc /gcc
parent37bde2f87267908a93c07856317a28827f8284f7 (diff)
downloadgcc-1a132c4d7cdb22cbab85b8596418daa2c3157812.zip
gcc-1a132c4d7cdb22cbab85b8596418daa2c3157812.tar.gz
gcc-1a132c4d7cdb22cbab85b8596418daa2c3157812.tar.bz2
arm: Fix ICE with -fstack-protector -mpure-code [PR98998]
The vla15.C testcase ICEs with -mcpu=cortex-m1 -mpure-code -fstack-protector -mthumb as what force_const_mem returns (a SYMBOL_REF) is not a valid memory address. Previously the code was moving the address of the force_const_mem into a register rather than the content of that MEM, so that instruction must have been supported and loading from a MEM with a single REG base ought to be valid too. 2021-02-19 Jakub Jelinek <jakub@redhat.com> PR target/98998 * config/arm/arm.md (*stack_protect_combined_set_insn, *stack_protect_combined_test_insn): If force_const_mem result is not valid general operand, force its address into the destination register first. * gcc.target/arm/pure-code/pr98998.c: New test.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/arm/arm.md10
-rw-r--r--gcc/testsuite/gcc.target/arm/pure-code/pr98998.c20
2 files changed, 30 insertions, 0 deletions
diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
index 3e441f9..45a471a 100644
--- a/gcc/config/arm/arm.md
+++ b/gcc/config/arm/arm.md
@@ -9216,6 +9216,11 @@
else
{
rtx mem = force_const_mem (SImode, operands[1]);
+ if (!general_operand (mem, SImode))
+ {
+ emit_move_insn (operands[2], XEXP (mem, 0));
+ mem = replace_equiv_address (mem, operands[2], false);
+ }
emit_move_insn (operands[2], mem);
}
}
@@ -9299,6 +9304,11 @@
else
{
rtx mem = force_const_mem (SImode, operands[1]);
+ if (!general_operand (mem, SImode))
+ {
+ emit_move_insn (operands[3], XEXP (mem, 0));
+ mem = replace_equiv_address (mem, operands[3], false);
+ }
emit_move_insn (operands[3], mem);
}
}
diff --git a/gcc/testsuite/gcc.target/arm/pure-code/pr98998.c b/gcc/testsuite/gcc.target/arm/pure-code/pr98998.c
new file mode 100644
index 0000000..9d7b0b2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/pure-code/pr98998.c
@@ -0,0 +1,20 @@
+/* PR target/98998 */
+/* { dg-do compile { target fstack_protector } } */
+/* { dg-options "-mpure-code -fstack-protector" } */
+
+void *volatile p;
+
+int
+main ()
+{
+ int n = 0;
+ lab:;
+ int x[n % 1000 + 1];
+ x[0] = 1;
+ x[n % 1000] = 2;
+ p = x;
+ n++;
+ if (n < 1000000)
+ goto lab;
+ return 0;
+}