|
@@ -163,7 +163,6 @@ class VirtRegRewriter : public MachineFunctionPass {
|
|
|
SlotIndexes *Indexes;
|
|
|
LiveIntervals *LIS;
|
|
|
VirtRegMap *VRM;
|
|
|
- SparseSet<unsigned> PhysRegs;
|
|
|
|
|
|
void rewrite();
|
|
|
void addMBBLiveIns();
|
|
@@ -319,54 +318,15 @@ void VirtRegRewriter::rewrite() {
|
|
|
SmallVector<unsigned, 8> SuperDeads;
|
|
|
SmallVector<unsigned, 8> SuperDefs;
|
|
|
SmallVector<unsigned, 8> SuperKills;
|
|
|
- SmallPtrSet<const MachineInstr *, 4> NoReturnInsts;
|
|
|
-
|
|
|
- // Here we have a SparseSet to hold which PhysRegs are actually encountered
|
|
|
- // in the MF we are about to iterate over so that later when we call
|
|
|
- // setPhysRegUsed, we are only doing it for physRegs that were actually found
|
|
|
- // in the program and not for all of the possible physRegs for the given
|
|
|
- // target architecture. If the target has a lot of physRegs, then for a small
|
|
|
- // program there will be a significant compile time reduction here.
|
|
|
- PhysRegs.clear();
|
|
|
- PhysRegs.setUniverse(TRI->getNumRegs());
|
|
|
-
|
|
|
- // The function with uwtable should guarantee that the stack unwinder
|
|
|
- // can unwind the stack to the previous frame. Thus, we can't apply the
|
|
|
- // noreturn optimization if the caller function has uwtable attribute.
|
|
|
- bool HasUWTable = MF->getFunction()->hasFnAttribute(Attribute::UWTable);
|
|
|
|
|
|
for (MachineFunction::iterator MBBI = MF->begin(), MBBE = MF->end();
|
|
|
MBBI != MBBE; ++MBBI) {
|
|
|
DEBUG(MBBI->print(dbgs(), Indexes));
|
|
|
- bool IsExitBB = MBBI->succ_empty();
|
|
|
for (MachineBasicBlock::instr_iterator
|
|
|
MII = MBBI->instr_begin(), MIE = MBBI->instr_end(); MII != MIE;) {
|
|
|
MachineInstr *MI = MII;
|
|
|
++MII;
|
|
|
|
|
|
- // Check if this instruction is a call to a noreturn function. If this
|
|
|
- // is a call to noreturn function and we don't need the stack unwinding
|
|
|
- // functionality (i.e. this function does not have uwtable attribute and
|
|
|
- // the callee function has the nounwind attribute), then we can ignore
|
|
|
- // the definitions set by this instruction.
|
|
|
- if (!HasUWTable && IsExitBB && MI->isCall()) {
|
|
|
- for (MachineInstr::mop_iterator MOI = MI->operands_begin(),
|
|
|
- MOE = MI->operands_end(); MOI != MOE; ++MOI) {
|
|
|
- MachineOperand &MO = *MOI;
|
|
|
- if (!MO.isGlobal())
|
|
|
- continue;
|
|
|
- const Function *Func = dyn_cast<Function>(MO.getGlobal());
|
|
|
- if (!Func || !Func->hasFnAttribute(Attribute::NoReturn) ||
|
|
|
- // We need to keep correct unwind information
|
|
|
- // even if the function will not return, since the
|
|
|
- // runtime may need it.
|
|
|
- !Func->hasFnAttribute(Attribute::NoUnwind))
|
|
|
- continue;
|
|
|
- NoReturnInsts.insert(MI);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
for (MachineInstr::mop_iterator MOI = MI->operands_begin(),
|
|
|
MOE = MI->operands_end(); MOI != MOE; ++MOI) {
|
|
|
MachineOperand &MO = *MOI;
|
|
@@ -375,15 +335,6 @@ void VirtRegRewriter::rewrite() {
|
|
|
if (MO.isRegMask())
|
|
|
MRI->addPhysRegsUsedFromRegMask(MO.getRegMask());
|
|
|
|
|
|
- // If we encounter a VirtReg or PhysReg then get at the PhysReg and add
|
|
|
- // it to the physreg bitset. Later we use only the PhysRegs that were
|
|
|
- // actually encountered in the MF to populate the MRI's used physregs.
|
|
|
- if (MO.isReg() && MO.getReg())
|
|
|
- PhysRegs.insert(
|
|
|
- TargetRegisterInfo::isVirtualRegister(MO.getReg()) ?
|
|
|
- VRM->getPhys(MO.getReg()) :
|
|
|
- MO.getReg());
|
|
|
-
|
|
|
if (!MO.isReg() || !TargetRegisterInfo::isVirtualRegister(MO.getReg()))
|
|
|
continue;
|
|
|
unsigned VirtReg = MO.getReg();
|
|
@@ -470,29 +421,5 @@ void VirtRegRewriter::rewrite() {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- // Tell MRI about physical registers in use.
|
|
|
- if (NoReturnInsts.empty()) {
|
|
|
- for (SparseSet<unsigned>::iterator
|
|
|
- RegI = PhysRegs.begin(), E = PhysRegs.end(); RegI != E; ++RegI)
|
|
|
- if (!MRI->reg_nodbg_empty(*RegI))
|
|
|
- MRI->setPhysRegUsed(*RegI);
|
|
|
- } else {
|
|
|
- for (SparseSet<unsigned>::iterator
|
|
|
- I = PhysRegs.begin(), E = PhysRegs.end(); I != E; ++I) {
|
|
|
- unsigned Reg = *I;
|
|
|
- if (MRI->reg_nodbg_empty(Reg))
|
|
|
- continue;
|
|
|
- // Check if this register has a use that will impact the rest of the
|
|
|
- // code. Uses in debug and noreturn instructions do not impact the
|
|
|
- // generated code.
|
|
|
- for (MachineInstr &It : MRI->reg_nodbg_instructions(Reg)) {
|
|
|
- if (!NoReturnInsts.count(&It)) {
|
|
|
- MRI->setPhysRegUsed(Reg);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
|