introduce a useful abstraction to find out if a Use is in the call position of an instruction

llvm-svn: 62788
This commit is contained in:
Gabor Greif 2009-01-22 21:35:57 +00:00
parent 11d2325f0a
commit d56b0a8c03
5 changed files with 12 additions and 9 deletions

View File

@ -180,6 +180,10 @@ public:
return getInstruction() < CS.getInstruction();
}
bool isCallee(Value::use_iterator UI) const {
return getInstruction()->op_begin() == &UI.getUse();
}
private:
/// Returns the operand number of the first argument
unsigned getArgumentOffset() const {

View File

@ -126,7 +126,8 @@ private:
// Loop over all of the users of the function, looking for non-call uses.
for (Value::use_iterator I = F->use_begin(), E = F->use_end(); I != E; ++I)
if ((!isa<CallInst>(*I) && !isa<InvokeInst>(*I)) || I.getOperandNo()) {
if ((!isa<CallInst>(I) && !isa<InvokeInst>(I))
|| !CallSite(cast<Instruction>(I)).isCallee(I)) {
// Not a call, or being used as a parameter rather than as the callee.
ExternalCallingNode->addCalledFunction(CallSite(), Node);
break;

View File

@ -135,7 +135,7 @@ bool ArgPromotion::PromoteArguments(CallGraphNode *CGN) {
// Ensure that this call site is CALLING the function, not passing it as
// an argument.
if (UI.getOperandNo() != 0)
if (!CS.isCallee(UI))
return false;
}

View File

@ -88,11 +88,12 @@ bool IPCP::PropagateConstantsIntoArguments(Function &F) {
for (Value::use_iterator UI = F.use_begin(), E = F.use_end(); UI != E; ++UI) {
// Used by a non-instruction, or not the callee of a function, do not
// transform.
if (UI.getOperandNo() != 0 ||
(!isa<CallInst>(*UI) && !isa<InvokeInst>(*UI)))
if (!isa<CallInst>(*UI) && !isa<InvokeInst>(*UI))
return false;
CallSite CS = CallSite::get(cast<Instruction>(*UI));
if (!CS.isCallee(UI))
return false;
// Check out all of the potentially constant arguments. Note that we don't
// inspect varargs here.
@ -219,7 +220,7 @@ bool IPCP::PropagateConstantReturn(Function &F) {
// Not a call instruction or a call instruction that's not calling F
// directly?
if (!Call || UI.getOperandNo() != 0)
if (!Call || !CS.isCallee(UI))
continue;
// Call result not used?

View File

@ -149,14 +149,11 @@ bool SRETPromotion::isSafeToUpdateAllCallers(Function *F) {
FnUseI != FnUseE; ++FnUseI) {
// The function is passed in as an argument to (possibly) another function,
// we can't change it!
if (FnUseI.getOperandNo() != 0)
return false;
CallSite CS = CallSite::get(*FnUseI);
Instruction *Call = CS.getInstruction();
// The function is used by something else than a call or invoke instruction,
// we can't change it!
if (!Call)
if (!Call || !CS.isCallee(FnUseI))
return false;
CallSite::arg_iterator AI = CS.arg_begin();
Value *FirstArg = *AI;