Hi!

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.

Bootstrapped/regtested on armv7hl-linux-gnueabi, ok for trunk?

No testcase, as I haven't figured out my way through gcc.target/arm, sorry.

2021-02-12  Jakub Jelinek  <ja...@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/config/arm/arm.md.jj    2021-01-04 10:25:44.404170742 +0100
+++ gcc/config/arm/arm.md       2021-02-11 12:50:26.049604711 +0100
@@ -9216,6 +9216,11 @@ (define_insn_and_split "*stack_protect_c
       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 @@ (define_insn_and_split "*stack_protect_c
       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);
        }
     }

        Jakub

Reply via email to