forked from OSchip/llvm-project
[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. llvm-svn: 322754
This commit is contained in:
parent
d703ec94a9
commit
12e6e709e9
|
|
@ -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
|
||||
|
||||
...
|
||||
|
|
@ -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 ------------------------------------------------------------===//
|
||||
|
|
|
|||
Loading…
Reference in New Issue