- Set the "HasCalls" flag after instruction selection is finished.

- Change the logic DisableFramePointerElim() to check for the
  -disable-non-leaf-fp-elim before -disable-fp-elim.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103990 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2010-05-17 23:09:50 +00:00
parent ebe7fcd041
commit 53f7602b61
2 changed files with 23 additions and 16 deletions

View File

@ -233,6 +233,24 @@ bool SelectionDAGISel::runOnMachineFunction(MachineFunction &mf) {
}
}
// Determine if there are any calls in this machine function.
MachineFrameInfo *MFI = MF->getFrameInfo();
if (!MFI->hasCalls()) {
for (MachineFunction::const_iterator
I = MF->begin(), E = MF->end(); I != E; ++I) {
const MachineBasicBlock *MBB = I;
for (MachineBasicBlock::const_iterator
II = MBB->begin(), IE = MBB->end(); II != IE; ++II) {
const TargetInstrDesc &TID = TM.getInstrInfo()->get(II->getOpcode());
if (II->isInlineAsm() || (TID.isCall() && !TID.isReturn())) {
MFI->setHasCalls(true);
goto done;
}
}
}
done:;
}
// Release function-specific state. SDB and CurDAG are already cleared
// at this point.
FuncInfo->clear();
@ -606,19 +624,6 @@ MachineBasicBlock *SelectionDAGISel::CodeGenAndEmitDAG(MachineBasicBlock *BB) {
delete Scheduler;
}
// Determine if there are any calls in this machine function.
MachineFrameInfo *MFI = MF->getFrameInfo();
if (!MFI->hasCalls()) {
for (MachineBasicBlock::iterator
I = BB->begin(), E = BB->end(); I != E; ++I) {
const TargetInstrDesc &TID = TM.getInstrInfo()->get(I->getOpcode());
if (I->isInlineAsm() || (TID.isCall() && !TID.isReturn())) {
MFI->setHasCalls(true);
break;
}
}
}
// Free the SelectionDAG state, now that we're finished with it.
CurDAG->clear();
@ -676,6 +681,7 @@ void SelectionDAGISel::DoInstructionSelection() {
CurDAG->setRoot(Dummy.getValue());
}
DEBUG(errs() << "===== Instruction selection ends:\n");
PostprocessISelDAG();

View File

@ -273,13 +273,14 @@ namespace llvm {
/// DisableFramePointerElim - This returns true if frame pointer elimination
/// optimization should be disabled for the given machine function.
bool DisableFramePointerElim(const MachineFunction &MF) {
if (NoFramePointerElim)
return true;
// Check to see if we should eliminate non-leaf frame pointers and then
// check to see if we should eliminate all frame pointers.
if (NoFramePointerElimNonLeaf) {
const MachineFrameInfo *MFI = MF.getFrameInfo();
return MFI->hasCalls();
}
return false;
return NoFramePointerElim;
}
/// LessPreciseFPMAD - This flag return true when -enable-fp-mad option