[llvm] r322754 - [globalisel][tablegen] Honour priority order within nested instructions.
Daniel Sanders via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 17 12:34:29 PST 2018
Author: dsanders
Date: Wed Jan 17 12:34:29 2018
New Revision: 322754
URL: http://llvm.org/viewvc/llvm-project?rev=322754&view=rev
Log:
[globalisel][tablegen] Honour priority order within nested instructions.
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.
Added:
llvm/trunk/test/CodeGen/ARM/GlobalISel/select-pr35926.mir
Modified:
llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp
Added: llvm/trunk/test/CodeGen/ARM/GlobalISel/select-pr35926.mir
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/GlobalISel/select-pr35926.mir?rev=322754&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/GlobalISel/select-pr35926.mir (added)
+++ llvm/trunk/test/CodeGen/ARM/GlobalISel/select-pr35926.mir Wed Jan 17 12:34:29 2018
@@ -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
+
+...
Modified: llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp?rev=322754&r1=322753&r2=322754&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp (original)
+++ llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp Wed Jan 17 12:34:29 2018
@@ -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 ------------------------------------------------------------===//
More information about the llvm-commits
mailing list