[Patch ARM] Fix probe_stack constraint.
authorRamana Radhakrishnan <ramana.radhakrishnan@arm.com>
Tue, 5 Dec 2017 16:32:55 +0000 (16:32 +0000)
committerRamana Radhakrishnan <ramana@gcc.gnu.org>
Tue, 5 Dec 2017 16:32:55 +0000 (16:32 +0000)
The probe_stack pattern uses r0 as a fixed register. This can cause issues if we have auto-increment instructions coming out that have r0 as the base register.

Tested with a bootstrap and regression run. richi reports that the original issue was fixed in the run. I did consider whether probe_stack_range was affected but it all comes back to probe_stack pattern so I think we are ok.

I don't have a testcase that seems to provoke this but it seems to be default on most distributions so I'm expecting the testcoverage to come from there.

Applied.

Ramana

PR target/82248

* config/arm/arm.md (probe_stack) : Use the 'o' constraint.

From-SVN: r255428

gcc/ChangeLog
gcc/config/arm/arm.md

index 4d58c0f9aec01f9bc4ed15edca1bf6b6ff28bbb9..d47c575763a0deee62d0039af6491115e1c2607f 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-05  Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
+
+       PR target/82248
+       * config/arm/arm.md (probe_stack) : Use the 'o' constraint.
+
 2017-12-05  Bin Cheng  <bin.cheng@arm.com>
 
        * tree-ssa-dce.c (simple_dce_from_worklist): Move and rename from
index 545ee257699abc47abdab8b4959a16a512526cb5..d60c5af551ccf42edc9d24f94f931cc07e6f6c11 100644 (file)
    (set_attr "type" "block")]
 )
 
+;; Since we hard code r0 here use the 'o' constraint to prevent
+;; provoking undefined behaviour in the hardware with putting out
+;; auto-increment operations with potentially r0 as the base register.
 (define_insn "probe_stack"
-  [(set (match_operand:SI 0 "memory_operand" "=m")
+  [(set (match_operand:SI 0 "memory_operand" "=o")
         (unspec:SI [(const_int 0)] UNSPEC_PROBE_STACK))]
   "TARGET_32BIT"
   "str%?\\tr0, %0"