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); } } 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 +...