If there's more than one function operand to a call instruction, be conservative

and don't assume that the call doesn't throw. It would be nice if there were a
way to determine which is the callee and which is a parameter. In practice, the
architecture we care about normally only have one operand for a call instruction
(x86 and arm).


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@87023 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2009-11-12 20:51:53 +00:00
parent 3f2bf85d14
commit ac18929801

View File

@ -494,15 +494,26 @@ ComputeCallSiteTable(SmallVectorImpl<CallSiteEntry> &CallSites,
// Don't mark a call as potentially throwing if the function it's
// calling is marked "nounwind".
bool DoesNotThrow = false;
bool SawFunc = false;
for (unsigned OI = 0, OE = MI->getNumOperands(); OI != OE; ++OI) {
const MachineOperand &MO = MI->getOperand(OI);
if (MO.isGlobal()) {
if (Function *F = dyn_cast<Function>(MO.getGlobal())) {
if (F->doesNotThrow()) {
DoesNotThrow = true;
if (SawFunc) {
// Be conservative. If we have more than one function operand
// for this call, then we can't make the assumption that it's
// the callee and not a parameter to the call.
//
// FIXME: Determine if there's a way to say that `F' is the
// callee or parameter.
DoesNotThrow = false;
break;
}
if (F->doesNotThrow()) {
SawFunc = true;
DoesNotThrow = true;
}
}
}
}