[globalisel][tablegen] Honour priority order within nested instructions.
authorDaniel Sanders <daniel_l_sanders@apple.com>
Wed, 17 Jan 2018 20:34:29 +0000 (20:34 +0000)
committerDaniel Sanders <daniel_l_sanders@apple.com>
Wed, 17 Jan 2018 20:34:29 +0000 (20:34 +0000)
It appears that we haven't been prioritizing rules that contain nested
instructions properly. InstructionOperandMatcher didn't override
isHigherPriorityThan so it never compared the instructions/operands/predicates
inside nested instructions.

Fixes PR35926. Thanks to Diana Picus for the bug report.

llvm-svn: 322754

llvm/test/CodeGen/ARM/GlobalISel/select-pr35926.mir [new file with mode: 0644]
llvm/utils/TableGen/GlobalISelEmitter.cpp

diff --git a/llvm/test/CodeGen/ARM/GlobalISel/select-pr35926.mir b/llvm/test/CodeGen/ARM/GlobalISel/select-pr35926.mir
new file mode 100644 (file)
index 0000000..d2b4ffa
--- /dev/null
@@ -0,0 +1,40 @@
+# RUN: llc -mtriple arm-gnueabihf -mattr=+vfp4 -run-pass=instruction-select -global-isel -o - %s | FileCheck %s
+--- |
+  declare double @llvm.fma.f64(double, double, double) #0
+  
+  define double @vfnmsd(double %x, double %y, double %z) #1 {
+    %minus.y = fsub double -0.000000e+00, %y
+    %fma = tail call double @llvm.fma.f64(double %x, double %minus.y, double %z)
+    %minus.fma = fsub double -0.000000e+00, %fma
+    ret double %minus.fma
+  }
+  
+  ; Function Attrs: nounwind
+  declare void @llvm.stackprotector(i8*, i8**) #2
+  
+  attributes #0 = { nounwind readnone speculatable "target-features"="+vfp4" }
+  attributes #1 = { "target-features"="+vfp4" }
+  attributes #2 = { nounwind }
+
+...
+---
+name:            vfnmsd
+legalized:       true
+regBankSelected: true
+selected:        false
+body:             |
+  bb.1 (%ir-block.0):
+    liveins: %d0, %d1, %d2
+  
+    %0:fprb(s64) = COPY %d0
+    %1:fprb(s64) = COPY %d1
+    %2:fprb(s64) = COPY %d2
+    %3:fprb(s64) = G_FNEG %1
+    %4:fprb(s64) = G_FMA %0, %3, %2
+    %5:fprb(s64) = G_FNEG %4
+    %d0 = COPY %5(s64)
+    MOVPCLR 14, %noreg, implicit %d0
+
+# CHECK: %{{[0-9]+}}:dpr = VFNMSD %{{[0-9]+}}, %{{[0-9]+}}, %{{[0-9]+}}, 14, %noreg
+
+...
index b4073b1..fd9ba08 100644 (file)
@@ -1692,6 +1692,19 @@ public:
                             RuleMatcher &Rule) const override {
     InsnMatcher->emitPredicateOpcodes(Table, Rule);
   }
+
+  bool isHigherPriorityThan(const OperandPredicateMatcher &B) const override {
+    if (OperandPredicateMatcher::isHigherPriorityThan(B))
+      return true;
+    if (B.OperandPredicateMatcher::isHigherPriorityThan(*this))
+      return false;
+
+    if (const InstructionOperandMatcher *BP =
+            dyn_cast<InstructionOperandMatcher>(&B))
+      if (InsnMatcher->isHigherPriorityThan(*BP->InsnMatcher))
+        return true;
+    return false;
+  }
 };
 
 //===- Actions ------------------------------------------------------------===//