forked from OSchip/llvm-project
[SystemZ] Mark CC defs as dead whenever possible.
Marking implicit CC defs as dead everywhere except when CC is actually defined and used explicitly, is important since the post-ra scheduler will otherwise insert edges between instructions unnecessarily. Also temporarily disable LA(Y)-> AGSI optimization in foldMemoryOperandImpl(), since this inroduces a def of the CC reg, which is illegal unless it is known to be dead. Reviewed by Ulrich Weigand. llvm-svn: 268215
This commit is contained in:
parent
6a0e0871db
commit
9028acf0b3
|
@ -216,7 +216,7 @@ SystemZElimCompare::convertToBRCT(MachineInstr *MI, MachineInstr *Compare,
|
|||
.addOperand(MI->getOperand(0))
|
||||
.addOperand(MI->getOperand(1))
|
||||
.addOperand(Target)
|
||||
.addReg(SystemZ::CC, RegState::ImplicitDefine);
|
||||
.addReg(SystemZ::CC, RegState::ImplicitDefine | RegState::Dead);
|
||||
MI->eraseFromParent();
|
||||
return true;
|
||||
}
|
||||
|
@ -448,7 +448,7 @@ fuseCompareAndBranch(MachineInstr *Compare,
|
|||
// to a non-fused branch because of a long displacement. Conditional
|
||||
// returns don't have that problem.
|
||||
MIB.addOperand(Target)
|
||||
.addReg(SystemZ::CC, RegState::ImplicitDefine);
|
||||
.addReg(SystemZ::CC, RegState::ImplicitDefine | RegState::Dead);
|
||||
}
|
||||
|
||||
if (Type == SystemZII::CompareAndSibcall)
|
||||
|
|
|
@ -737,6 +737,14 @@ static LogicOp interpretAndImmediate(unsigned Opcode) {
|
|||
}
|
||||
}
|
||||
|
||||
static void transferDeadCC(MachineInstr *OldMI, MachineInstr *NewMI) {
|
||||
if (OldMI->registerDefIsDead(SystemZ::CC)) {
|
||||
MachineOperand *CCDef = NewMI->findRegisterDefOperand(SystemZ::CC);
|
||||
if (CCDef != nullptr)
|
||||
CCDef->setIsDead(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Used to return from convertToThreeAddress after replacing two-address
|
||||
// instruction OldMI with three-address instruction NewMI.
|
||||
static MachineInstr *finishConvertToThreeAddress(MachineInstr *OldMI,
|
||||
|
@ -750,6 +758,7 @@ static MachineInstr *finishConvertToThreeAddress(MachineInstr *OldMI,
|
|||
LV->replaceKillInstruction(Op.getReg(), OldMI, NewMI);
|
||||
}
|
||||
}
|
||||
transferDeadCC(OldMI, NewMI);
|
||||
return NewMI;
|
||||
}
|
||||
|
||||
|
@ -842,19 +851,26 @@ MachineInstr *SystemZInstrInfo::foldMemoryOperandImpl(
|
|||
unsigned Size = MFI->getObjectSize(FrameIndex);
|
||||
unsigned Opcode = MI->getOpcode();
|
||||
|
||||
// XXX This is an introduction of a CC def and is illegal! Reactivate
|
||||
// with a check of liveness of CC reg.
|
||||
#if 0
|
||||
if (Ops.size() == 2 && Ops[0] == 0 && Ops[1] == 1) {
|
||||
if ((Opcode == SystemZ::LA || Opcode == SystemZ::LAY) &&
|
||||
isInt<8>(MI->getOperand(2).getImm()) &&
|
||||
!MI->getOperand(3).getReg()) {
|
||||
// LA(Y) %reg, CONST(%reg) -> AGSI %mem, CONST
|
||||
return BuildMI(*InsertPt->getParent(), InsertPt, MI->getDebugLoc(),
|
||||
MachineInstr *BuiltMI =
|
||||
BuildMI(*InsertPt->getParent(), InsertPt, MI->getDebugLoc(),
|
||||
get(SystemZ::AGSI))
|
||||
.addFrameIndex(FrameIndex)
|
||||
.addImm(0)
|
||||
.addImm(MI->getOperand(2).getImm());
|
||||
BuiltMI->findRegisterDefOperand(SystemZ::CC)->setIsDead(true);
|
||||
return BuiltMI;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
#endif
|
||||
|
||||
// All other cases require a single operand.
|
||||
if (Ops.size() != 1)
|
||||
|
@ -870,11 +886,14 @@ MachineInstr *SystemZInstrInfo::foldMemoryOperandImpl(
|
|||
isInt<8>(MI->getOperand(2).getImm())) {
|
||||
// A(G)HI %reg, CONST -> A(G)SI %mem, CONST
|
||||
Opcode = (Opcode == SystemZ::AHI ? SystemZ::ASI : SystemZ::AGSI);
|
||||
return BuildMI(*InsertPt->getParent(), InsertPt, MI->getDebugLoc(),
|
||||
MachineInstr *BuiltMI =
|
||||
BuildMI(*InsertPt->getParent(), InsertPt, MI->getDebugLoc(),
|
||||
get(Opcode))
|
||||
.addFrameIndex(FrameIndex)
|
||||
.addImm(0)
|
||||
.addImm(MI->getOperand(2).getImm());
|
||||
transferDeadCC(MI, BuiltMI);
|
||||
return BuiltMI;
|
||||
}
|
||||
|
||||
if (Opcode == SystemZ::LGDR || Opcode == SystemZ::LDGR) {
|
||||
|
@ -963,6 +982,7 @@ MachineInstr *SystemZInstrInfo::foldMemoryOperandImpl(
|
|||
MIB.addFrameIndex(FrameIndex).addImm(Offset);
|
||||
if (MemDesc.TSFlags & SystemZII::HasIndex)
|
||||
MIB.addReg(0);
|
||||
transferDeadCC(MI, MIB);
|
||||
return MIB;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -143,7 +143,7 @@ bool SystemZShortenInst::shortenOn001AddCC(MachineInstr &MI,
|
|||
unsigned Opcode) {
|
||||
if (!LiveRegs.contains(SystemZ::CC) && shortenOn001(MI, Opcode)) {
|
||||
MachineInstrBuilder(*MI.getParent()->getParent(), &MI)
|
||||
.addReg(SystemZ::CC, RegState::ImplicitDefine);
|
||||
.addReg(SystemZ::CC, RegState::ImplicitDefine | RegState::Dead);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
Loading…
Reference in New Issue