mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-03 10:54:42 +00:00
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:
parent
11d2325f0a
commit
d56b0a8c03
@ -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 {
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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?
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user