[PATCH] D49671: [SchedModel] Propagate read advance cycles to implicit operands outside instruction descriptor
Jonas Paulsson via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Oct 6 03:35:00 PDT 2018
jonpa updated this revision to Diff 168568.
jonpa added a comment.
Updated patch per review. Submitting again since I had to add a (int) cast to silence compiler warning:
bool ImplicitPseudoUse =
(UseMIDesc && UseOp >= (**(int)**UseMIDesc->getNumOperands()) &&
!UseMIDesc->hasImplicitUseOfPhysReg(*Alias));
I would think this should be ok, right? UseOp may be -1 for ExitSU, but that doesn't matter.
Reduced the test case further.
https://reviews.llvm.org/D49671
Files:
lib/CodeGen/ScheduleDAGInstrs.cpp
test/CodeGen/SystemZ/misched-readadvances.mir
Index: test/CodeGen/SystemZ/misched-readadvances.mir
===================================================================
--- /dev/null
+++ test/CodeGen/SystemZ/misched-readadvances.mir
@@ -0,0 +1,31 @@
+# Check that the extra operand for the full register added by RegAlloc does
+# not have a latency that interferes with the latency adjustment
+# (ReadAdvance) for the MSY register operand.
+
+# RUN: llc %s -mtriple=s390x-linux-gnu -mcpu=z13 -start-before=machine-scheduler \
+# RUN: -debug-only=machine-scheduler -o - 2>&1 | FileCheck %s
+# REQUIRES: asserts
+
+# CHECK: ScheduleDAGMI::schedule starting
+# CHECK: SU(4): renamable $r2l = MSR renamable $r2l(tied-def 0), renamable $r2l
+# CHECK: Latency : 6
+# CHECK: SU(5): renamable $r2l = MSY renamable $r2l(tied-def 0), renamable $r1d, -4, $noreg, implicit $r2d
+# CHECK: Predecessors:
+# CHECK: SU(4): Data Latency=2 Reg=$r2l
+# CHECK: SU(4): Data Latency=0 Reg=$r2d
+
+---
+name: Perl_do_sv_dump
+alignment: 4
+tracksRegLiveness: true
+body: |
+ bb.0 :
+ %1:addr64bit = IMPLICIT_DEF
+ %2:addr64bit = IMPLICIT_DEF
+ %3:vr64bit = IMPLICIT_DEF
+
+ bb.1 :
+ %2:addr64bit = ALGFI %2, 4294967291, implicit-def dead $cc
+ %2.subreg_l32:addr64bit = MSR %2.subreg_l32, %2.subreg_l32
+ %2.subreg_l32:addr64bit = MSY %2.subreg_l32, %1, -4, $noreg
+...
Index: lib/CodeGen/ScheduleDAGInstrs.cpp
===================================================================
--- lib/CodeGen/ScheduleDAGInstrs.cpp
+++ lib/CodeGen/ScheduleDAGInstrs.cpp
@@ -234,6 +234,11 @@
// Ask the target if address-backscheduling is desirable, and if so how much.
const TargetSubtargetInfo &ST = MF.getSubtarget();
+ // Only use any non-zero latency for real defs/uses, in contrast to
+ // "fake" operands added by regalloc.
+ const MCInstrDesc *DefMIDesc = &SU->getInstr()->getDesc();
+ bool ImplicitPseudoDef = (OperIdx >= DefMIDesc->getNumOperands() &&
+ !DefMIDesc->hasImplicitDefOfPhysReg(MO.getReg()));
for (MCRegAliasIterator Alias(MO.getReg(), TRI, true);
Alias.isValid(); ++Alias) {
if (!Uses.contains(*Alias))
@@ -257,11 +262,18 @@
Dep = SDep(SU, SDep::Data, *Alias);
RegUse = UseSU->getInstr();
}
- Dep.setLatency(
- SchedModel.computeOperandLatency(SU->getInstr(), OperIdx, RegUse,
- UseOp));
+ const MCInstrDesc *UseMIDesc =
+ (RegUse ? &UseSU->getInstr()->getDesc() : nullptr);
+ bool ImplicitPseudoUse =
+ (UseMIDesc && UseOp >= ((int)UseMIDesc->getNumOperands()) &&
+ !UseMIDesc->hasImplicitUseOfPhysReg(*Alias));
+ if (!ImplicitPseudoDef && !ImplicitPseudoUse) {
+ Dep.setLatency(SchedModel.computeOperandLatency(SU->getInstr(), OperIdx,
+ RegUse, UseOp));
+ ST.adjustSchedDependency(SU, UseSU, Dep);
+ } else
+ Dep.setLatency(0);
- ST.adjustSchedDependency(SU, UseSU, Dep);
UseSU->addPred(Dep);
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D49671.168568.patch
Type: text/x-patch
Size: 3080 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181006/c2beefd6/attachment.bin>
More information about the llvm-commits
mailing list