aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2020-01-21 10:31:13 +0000
committerRichard Sandiford <richard.sandiford@arm.com>2020-01-23 13:56:16 +0000
commit2214053f9d9cdf66a4f3a657dbae43d293fd0387 (patch)
treeb577bee03b2bfd6558950c4d49a2074c295c0bd7
parentd16db16edd35bf4f0774aafef2325e113559d910 (diff)
downloadgcc-2214053f9d9cdf66a4f3a657dbae43d293fd0387.zip
gcc-2214053f9d9cdf66a4f3a657dbae43d293fd0387.tar.gz
gcc-2214053f9d9cdf66a4f3a657dbae43d293fd0387.tar.bz2
aarch64: Fix -mtrack-speculation for irreversible conditions [PR93341]
We can't yet represent the inverse of all conditions in rtl (see g:865257c447cc50f5819e), triggering an ICE in the pass that handles -mtrack-speculation. Since we don't expect these insns to be optimised in any way, the easiest fix seemed to be to add an insn that reverses the condition internally. 2020-01-23 Richard Sandiford <richard.sandiford@arm.com> gcc/ PR target/93341 * config/aarch64/aarch64.md (UNSPEC_SPECULATION_TRACKER_REV): New unspec. (speculation_tracker_rev): New pattern. * config/aarch64/aarch64-speculation.cc (aarch64_do_track_speculation): Use speculation_tracker_rev to track the inverse condition. gcc/testsuite/ PR target/93341 * gcc.target/aarch64/pr93341.c: New test.
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/aarch64/aarch64-speculation.cc17
-rw-r--r--gcc/config/aarch64/aarch64.md15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/aarch64/pr93341.c14
5 files changed, 48 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cf8e212..ac8b18f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2020-01-23 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR target/93341
+ * config/aarch64/aarch64.md (UNSPEC_SPECULATION_TRACKER_REV): New
+ unspec.
+ (speculation_tracker_rev): New pattern.
+ * config/aarch64/aarch64-speculation.cc (aarch64_do_track_speculation):
+ Use speculation_tracker_rev to track the inverse condition.
+
2020-01-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/93381
diff --git a/gcc/config/aarch64/aarch64-speculation.cc b/gcc/config/aarch64/aarch64-speculation.cc
index 98dcc11..f490b64 100644
--- a/gcc/config/aarch64/aarch64-speculation.cc
+++ b/gcc/config/aarch64/aarch64-speculation.cc
@@ -215,20 +215,13 @@ aarch64_do_track_speculation ()
&& REG_P (XEXP (cond, 0))
&& REGNO (XEXP (cond, 0)) == CC_REGNUM
&& XEXP (cond, 1) == const0_rtx);
- enum rtx_code inv_cond_code
- = reversed_comparison_code (cond, insn);
- /* We should be able to reverse all conditions. */
- gcc_assert (inv_cond_code != UNKNOWN);
- rtx inv_cond = gen_rtx_fmt_ee (inv_cond_code, GET_MODE (cond),
- copy_rtx (XEXP (cond, 0)),
- copy_rtx (XEXP (cond, 1)));
+ rtx branch_tracker = gen_speculation_tracker (copy_rtx (cond));
+ rtx fallthru_tracker = gen_speculation_tracker_rev (cond);
if (inverted)
- std::swap (cond, inv_cond);
+ std::swap (branch_tracker, fallthru_tracker);
- insert_insn_on_edge (gen_speculation_tracker (cond),
- BRANCH_EDGE (bb));
- insert_insn_on_edge (gen_speculation_tracker (inv_cond),
- FALLTHRU_EDGE (bb));
+ insert_insn_on_edge (branch_tracker, BRANCH_EDGE (bb));
+ insert_insn_on_edge (fallthru_tracker, FALLTHRU_EDGE (bb));
needs_tracking = true;
}
else if (GET_CODE (PATTERN (insn)) == RETURN)
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 55dde54..4f58981 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -262,6 +262,7 @@
UNSPEC_REV_SUBREG
UNSPEC_REINTERPRET
UNSPEC_SPECULATION_TRACKER
+ UNSPEC_SPECULATION_TRACKER_REV
UNSPEC_COPYSIGN
UNSPEC_TTEST ; Represent transaction test.
UNSPEC_UPDATE_FFR
@@ -7219,6 +7220,20 @@
[(set_attr "type" "csel")]
)
+;; Like speculation_tracker, but track the inverse condition.
+(define_insn "speculation_tracker_rev"
+ [(set (reg:DI SPECULATION_TRACKER_REGNUM)
+ (unspec:DI [(reg:DI SPECULATION_TRACKER_REGNUM) (match_operand 0)]
+ UNSPEC_SPECULATION_TRACKER_REV))]
+ ""
+ {
+ operands[1] = gen_rtx_REG (DImode, SPECULATION_TRACKER_REGNUM);
+ output_asm_insn ("csel\\t%1, %1, xzr, %M0", operands);
+ return "";
+ }
+ [(set_attr "type" "csel")]
+)
+
;; BTI <target> instructions
(define_insn "bti_noarg"
[(unspec_volatile [(const_int 0)] UNSPECV_BTI_NOARG)]
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8ad220e..7a03ebb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-01-23 Richard Sandiford <richard.sandiford@arm.com>
+
+ PR target/93341
+ * gcc.target/aarch64/pr93341.c: New test.
+
2020-01-23 David Malcolm <dmalcolm@redhat.com>
* gcc.dg/analyzer/data-model-3.c: Remove hardcoded "-O2" and move
diff --git a/gcc/testsuite/gcc.target/aarch64/pr93341.c b/gcc/testsuite/gcc.target/aarch64/pr93341.c
new file mode 100644
index 0000000..1efebee
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/pr93341.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-mtrack-speculation" } */
+
+int synths_ ( float * rc)
+{
+ float r1, r2;
+ int i;
+ for (i = 0; i < 128; ++i)
+ {
+ r2 = rc[i];
+ r1 = ((r2) <= (.99f) ? (r2) : (.99f));
+ rc[i] = ((r1) >= (-.99f) ? (r1) : (-.99f));
+ }
+}