[llvm] cfba1a9 - [Hexagon] pX.new cannot be used with p3:0 as producer

Brian Cain via llvm-commits llvm-commits at lists.llvm.org
Tue May 19 15:06:46 PDT 2020


Author: Brian Cain
Date: 2020-05-19T17:06:34-05:00
New Revision: cfba1a9668152d54dbb119031fc3c6f5bbe0699d

URL: https://github.com/llvm/llvm-project/commit/cfba1a9668152d54dbb119031fc3c6f5bbe0699d
DIFF: https://github.com/llvm/llvm-project/commit/cfba1a9668152d54dbb119031fc3c6f5bbe0699d.diff

LOG: [Hexagon] pX.new cannot be used with p3:0 as producer

Writes to p3:0 do not produce new values, we should bar any .new
consumer trying to use it as a producer.

Added: 
    llvm/test/MC/Hexagon/c4_newval.s
    llvm/test/MC/Hexagon/multiple-pc4.s

Modified: 
    llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp
index 52c56d6db524..fee1acdbbe8a 100644
--- a/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp
+++ b/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCChecker.cpp
@@ -391,7 +391,7 @@ bool HexagonMCChecker::checkPredicates() {
   for (const auto &I : NewPreds) {
     unsigned P = I;
 
-    if (!Defs.count(P) || LatePreds.count(P)) {
+    if (!Defs.count(P) || LatePreds.count(P) || Defs.count(Hexagon::P3_0)) {
       // Error out if the new predicate register is not defined,
       // or defined "late"
       // (e.g., "{ if (p3.new)... ; p3 = sp1loop0(#r7:2, Rs) }").

diff  --git a/llvm/test/MC/Hexagon/c4_newval.s b/llvm/test/MC/Hexagon/c4_newval.s
new file mode 100644
index 000000000000..f569aec7d49b
--- /dev/null
+++ b/llvm/test/MC/Hexagon/c4_newval.s
@@ -0,0 +1,19 @@
+# RUN: not llvm-mc -arch=hexagon %s 2>%t; FileCheck --implicit-check-not=error %s <%t
+
+.Lfoo:
+{ p3:0 = r0
+  if (!p0.new) jump:t .Lfoo }
+
+# CHECK: error: register `P0' used with `.new' but not validly modified in the same packet
+
+{ c4 = r0
+  if (!p0.new) jump:t .Lfoo }
+
+# CHECK: error: register `P0' used with `.new' but not validly modified in the same packet
+
+{ c4 = r0
+  p0 = r0
+  if (!p0.new) jump:t .Lfoo }
+
+# CHECK: error: register `P0' used with `.new' but not validly modified in the same packet
+# CHECK: error: register `P3_0' modified more than once

diff  --git a/llvm/test/MC/Hexagon/multiple-pc4.s b/llvm/test/MC/Hexagon/multiple-pc4.s
new file mode 100644
index 000000000000..d5eb9887dd14
--- /dev/null
+++ b/llvm/test/MC/Hexagon/multiple-pc4.s
@@ -0,0 +1,17 @@
+# RUN: llvm-mc -arch=hexagon -filetype=asm %s 2>%t; FileCheck --implicit-check-not=error %s <%t
+
+# Check that multiple changes to a predicate in a packet are caught.
+
+	{ p0 = cmp.eq (r0, r0); p3:0 = r0 }
+# CHECK: rror: register {{.+}} modified more than once
+
+	{ p0 = cmp.eq (r0, r0); c4 = r0 }
+# CHECK: rror: register {{.+}} modified more than once
+
+	p3:0 = r9
+# CHECK-NOT: rror: register {{.+}} modified more than once
+
+# Multiple writes to the same predicate register are permitted:
+
+	{ p0 = cmp.eq (r0, r0); p0 = and(p1, p2) }
+# CHECK-NOT: rror: register {{.+}} modified more than once


        


More information about the llvm-commits mailing list