Skip to content

Commit

Permalink
[opaque pointer types] Pass function type for CallBase::setCalledFunc…
Browse files Browse the repository at this point in the history
…tion.

Differential Revision: https://reviews.llvm.org/D57174

llvm-svn: 352914
  • Loading branch information
jyknight committed Feb 1, 2019
1 parent 7716075 commit 291f791
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 19 deletions.
6 changes: 5 additions & 1 deletion llvm/include/llvm/IR/CallSite.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,9 +121,13 @@ class CallSiteBase {
return true;
}

/// Set the callee to the specified value.
/// Set the callee to the specified value. Unlike the function of the same
/// name on CallBase, does not modify the type!
void setCalledFunction(Value *V) {
assert(getInstruction() && "Not a call or invoke instruction!");
assert(cast<PointerType>(V->getType())->getElementType() ==
cast<CallBase>(getInstruction())->getFunctionType() &&
"New callee type does not match FunctionType on call");
*getCallee() = V;
}

Expand Down
10 changes: 6 additions & 4 deletions llvm/include/llvm/IR/InstrTypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
#include "llvm/IR/CallingConv.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/OperandTraits.h"
Expand Down Expand Up @@ -1226,10 +1227,8 @@ class CallBase : public Instruction {
void setCalledOperand(Value *V) { Op<CalledOperandOpEndIdx>() = V; }

/// Sets the function called, including updating the function type.
void setCalledFunction(Value *Fn) {
setCalledFunction(
cast<FunctionType>(cast<PointerType>(Fn->getType())->getElementType()),
Fn);
void setCalledFunction(Function *Fn) {
setCalledFunction(Fn->getFunctionType(), Fn);
}

/// Sets the function called, including updating the function type.
Expand All @@ -1243,6 +1242,9 @@ class CallBase : public Instruction {
this->FTy = FTy;
assert(FTy == cast<FunctionType>(
cast<PointerType>(Fn->getType())->getElementType()));
// This function doesn't mutate the return type, only the function
// type. Seems broken, but I'm just gonna stick an assert in for now.
assert(getType() == FTy->getReturnType());
setCalledOperand(Fn);
}

Expand Down
15 changes: 7 additions & 8 deletions llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4214,7 +4214,8 @@ Instruction *InstCombiner::visitCallBase(CallBase &Call) {
// We cannot remove an invoke, because it would change the CFG, just
// change the callee to a null pointer.
cast<InvokeInst>(OldCall)->setCalledFunction(
Constant::getNullValue(CalleeF->getType()));
CalleeF->getFunctionType(),
Constant::getNullValue(CalleeF->getType()));
return nullptr;
}
}
Expand Down Expand Up @@ -4555,8 +4556,8 @@ Instruction *
InstCombiner::transformCallThroughTrampoline(CallBase &Call,
IntrinsicInst &Tramp) {
Value *Callee = Call.getCalledValue();
PointerType *PTy = cast<PointerType>(Callee->getType());
FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
Type *CalleeTy = Callee->getType();
FunctionType *FTy = Call.getFunctionType();
AttributeList Attrs = Call.getAttributes();

// If the call already has the 'nest' attribute somewhere then give up -
Expand All @@ -4565,7 +4566,7 @@ InstCombiner::transformCallThroughTrampoline(CallBase &Call,
return nullptr;

Function *NestF = cast<Function>(Tramp.getArgOperand(1)->stripPointerCasts());
FunctionType *NestFTy = cast<FunctionType>(NestF->getValueType());
FunctionType *NestFTy = NestF->getFunctionType();

AttributeList NestAttrs = NestF->getAttributes();
if (!NestAttrs.isEmpty()) {
Expand Down Expand Up @@ -4689,9 +4690,7 @@ InstCombiner::transformCallThroughTrampoline(CallBase &Call,
// Replace the trampoline call with a direct call. Since there is no 'nest'
// parameter, there is no need to adjust the argument list. Let the generic
// code sort out any function type mismatches.
Constant *NewCallee =
NestF->getType() == PTy ? NestF :
ConstantExpr::getBitCast(NestF, PTy);
Call.setCalledFunction(NewCallee);
Constant *NewCallee = ConstantExpr::getBitCast(NestF, CalleeTy);
Call.setCalledFunction(FTy, NewCallee);
return &Call;
}
4 changes: 2 additions & 2 deletions llvm/lib/Transforms/ObjCARC/ObjCARCContract.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ bool ObjCARCContract::optimizeRetainCall(Function &F, Instruction *Retain) {

// We do not have to worry about tail calls/does not throw since
// retain/retainRV have the same properties.
Constant *Decl = EP.get(ARCRuntimeEntryPointKind::RetainRV);
Function *Decl = EP.get(ARCRuntimeEntryPointKind::RetainRV);
cast<CallInst>(Retain)->setCalledFunction(Decl);

LLVM_DEBUG(dbgs() << "New: " << *Retain << "\n");
Expand Down Expand Up @@ -188,7 +188,7 @@ bool ObjCARCContract::contractAutorelease(
" Retain: "
<< *Retain << "\n");

Constant *Decl = EP.get(Class == ARCInstKind::AutoreleaseRV
Function *Decl = EP.get(Class == ARCInstKind::AutoreleaseRV
? ARCRuntimeEntryPointKind::RetainAutoreleaseRV
: ARCRuntimeEntryPointKind::RetainAutorelease);
Retain->setCalledFunction(Decl);
Expand Down
4 changes: 2 additions & 2 deletions llvm/lib/Transforms/ObjCARC/ObjCARCOpts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,7 @@ ObjCARCOpt::OptimizeRetainRVCall(Function &F, Instruction *RetainRV) {
"Old = "
<< *RetainRV << "\n");

Constant *NewDecl = EP.get(ARCRuntimeEntryPointKind::Retain);
Function *NewDecl = EP.get(ARCRuntimeEntryPointKind::Retain);
cast<CallInst>(RetainRV)->setCalledFunction(NewDecl);

LLVM_DEBUG(dbgs() << "New = " << *RetainRV << "\n");
Expand Down Expand Up @@ -690,7 +690,7 @@ void ObjCARCOpt::OptimizeAutoreleaseRVCall(Function &F,
<< *AutoreleaseRV << "\n");

CallInst *AutoreleaseRVCI = cast<CallInst>(AutoreleaseRV);
Constant *NewDecl = EP.get(ARCRuntimeEntryPointKind::Autorelease);
Function *NewDecl = EP.get(ARCRuntimeEntryPointKind::Autorelease);
AutoreleaseRVCI->setCalledFunction(NewDecl);
AutoreleaseRVCI->setTailCall(false); // Never tail call objc_autorelease.
Class = ARCInstKind::Autorelease;
Expand Down
5 changes: 3 additions & 2 deletions llvm/lib/Transforms/Utils/CallPromotionUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -366,8 +366,9 @@ Instruction *llvm::promoteCall(CallSite CS, Function *Callee,
CastInst **RetBitCast) {
assert(!CS.getCalledFunction() && "Only indirect call sites can be promoted");

// Set the called function of the call site to be the given callee.
CS.setCalledFunction(Callee);
// Set the called function of the call site to be the given callee (but don't
// change the type).
cast<CallBase>(CS.getInstruction())->setCalledOperand(Callee);

// Since the call site will no longer be direct, we must clear metadata that
// is only appropriate for indirect calls. This includes !prof and !callees
Expand Down

0 comments on commit 291f791

Please sign in to comment.