add assert in argpromotion, which cannot trigger

if Function::hasAddressTaken works as advertised

also included some cosmetic cleanups

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99276 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Gabor Greif 2010-03-23 14:40:20 +00:00
parent 050560e535
commit 0054c7a867
2 changed files with 7 additions and 6 deletions

View File

@ -623,6 +623,7 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
SmallVector<Value*, 16> Args; SmallVector<Value*, 16> Args;
while (!F->use_empty()) { while (!F->use_empty()) {
CallSite CS = CallSite::get(F->use_back()); CallSite CS = CallSite::get(F->use_back());
assert(CS.getCalledFunction() == F);
Instruction *Call = CS.getInstruction(); Instruction *Call = CS.getInstruction();
const AttrListPtr &CallPAL = CS.getAttributes(); const AttrListPtr &CallPAL = CS.getAttributes();
@ -660,7 +661,7 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
// Non-dead argument: insert GEPs and loads as appropriate. // Non-dead argument: insert GEPs and loads as appropriate.
ScalarizeTable &ArgIndices = ScalarizedElements[I]; ScalarizeTable &ArgIndices = ScalarizedElements[I];
// Store the Value* version of the indices in here, but declare it now // Store the Value* version of the indices in here, but declare it now
// for reuse // for reuse.
std::vector<Value*> Ops; std::vector<Value*> Ops;
for (ScalarizeTable::iterator SI = ArgIndices.begin(), for (ScalarizeTable::iterator SI = ArgIndices.begin(),
E = ArgIndices.end(); SI != E; ++SI) { E = ArgIndices.end(); SI != E; ++SI) {
@ -677,10 +678,10 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
Type::getInt32Ty(F->getContext()) : Type::getInt32Ty(F->getContext()) :
Type::getInt64Ty(F->getContext())); Type::getInt64Ty(F->getContext()));
Ops.push_back(ConstantInt::get(IdxTy, *II)); Ops.push_back(ConstantInt::get(IdxTy, *II));
// Keep track of the type we're currently indexing // Keep track of the type we're currently indexing.
ElTy = cast<CompositeType>(ElTy)->getTypeAtIndex(*II); ElTy = cast<CompositeType>(ElTy)->getTypeAtIndex(*II);
} }
// And create a GEP to extract those indices // And create a GEP to extract those indices.
V = GetElementPtrInst::Create(V, Ops.begin(), Ops.end(), V = GetElementPtrInst::Create(V, Ops.begin(), Ops.end(),
V->getName()+".idx", Call); V->getName()+".idx", Call);
Ops.clear(); Ops.clear();
@ -694,7 +695,7 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
if (ExtraArgHack) if (ExtraArgHack)
Args.push_back(Constant::getNullValue(Type::getInt32Ty(F->getContext()))); Args.push_back(Constant::getNullValue(Type::getInt32Ty(F->getContext())));
// Push any varargs arguments on the list // Push any varargs arguments on the list.
for (; AI != CS.arg_end(); ++AI, ++ArgIndex) { for (; AI != CS.arg_end(); ++AI, ++ArgIndex) {
Args.push_back(*AI); Args.push_back(*AI);
if (Attributes Attrs = CallPAL.getParamAttributes(ArgIndex)) if (Attributes Attrs = CallPAL.getParamAttributes(ArgIndex))

View File

@ -400,8 +400,8 @@ Function *Intrinsic::getDeclaration(Module *M, ID id, const Type **Tys,
#include "llvm/Intrinsics.gen" #include "llvm/Intrinsics.gen"
#undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN #undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN
/// hasAddressTaken - returns true if there are any uses of this function /// hasAddressTaken - returns true if there are any uses of this function
/// other than direct calls or invokes to it. /// other than direct calls or invokes to it.
bool Function::hasAddressTaken() const { bool Function::hasAddressTaken() const {
for (Value::use_const_iterator I = use_begin(), E = use_end(); I != E; ++I) { for (Value::use_const_iterator I = use_begin(), E = use_end(); I != E; ++I) {
if (I.getOperandNo() != 0 || if (I.getOperandNo() != 0 ||