[opaque pointer type] Store the value type of an alloca

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236175 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Blaikie
2015-04-29 23:00:35 +00:00
parent 85b9ebb7e8
commit 3453e8bfe1
3 changed files with 17 additions and 11 deletions

View File

@@ -73,6 +73,8 @@ return (Ord == Release ||
/// AllocaInst - an instruction to allocate memory on the stack /// AllocaInst - an instruction to allocate memory on the stack
/// ///
class AllocaInst : public UnaryInstruction { class AllocaInst : public UnaryInstruction {
Type *AllocatedType;
protected: protected:
AllocaInst *clone_impl() const override; AllocaInst *clone_impl() const override;
public: public:
@@ -113,7 +115,10 @@ public:
/// getAllocatedType - Return the type that is being allocated by the /// getAllocatedType - Return the type that is being allocated by the
/// instruction. /// instruction.
/// ///
Type *getAllocatedType() const; Type *getAllocatedType() const { return AllocatedType; }
/// \brief for use only in special circumstances that need to generically
/// transform a whole instruction (eg: IR linking and vectorization).
void setAllocatedType(Type *Ty) { AllocatedType = Ty; }
/// getAlignment - Return the alignment of the memory that is being allocated /// getAlignment - Return the alignment of the memory that is being allocated
/// by the instruction. /// by the instruction.

View File

@@ -864,8 +864,9 @@ AllocaInst::AllocaInst(Type *Ty, Value *ArraySize, const Twine &Name,
AllocaInst::AllocaInst(Type *Ty, Value *ArraySize, unsigned Align, AllocaInst::AllocaInst(Type *Ty, Value *ArraySize, unsigned Align,
const Twine &Name, Instruction *InsertBefore) const Twine &Name, Instruction *InsertBefore)
: UnaryInstruction(PointerType::getUnqual(Ty), Alloca, : UnaryInstruction(PointerType::getUnqual(Ty), Alloca,
getAISize(Ty->getContext(), ArraySize), InsertBefore) { getAISize(Ty->getContext(), ArraySize), InsertBefore),
AllocatedType(Ty) {
setAlignment(Align); setAlignment(Align);
assert(!Ty->isVoidTy() && "Cannot allocate void!"); assert(!Ty->isVoidTy() && "Cannot allocate void!");
setName(Name); setName(Name);
@@ -873,8 +874,9 @@ AllocaInst::AllocaInst(Type *Ty, Value *ArraySize, unsigned Align,
AllocaInst::AllocaInst(Type *Ty, Value *ArraySize, unsigned Align, AllocaInst::AllocaInst(Type *Ty, Value *ArraySize, unsigned Align,
const Twine &Name, BasicBlock *InsertAtEnd) const Twine &Name, BasicBlock *InsertAtEnd)
: UnaryInstruction(PointerType::getUnqual(Ty), Alloca, : UnaryInstruction(PointerType::getUnqual(Ty), Alloca,
getAISize(Ty->getContext(), ArraySize), InsertAtEnd) { getAISize(Ty->getContext(), ArraySize), InsertAtEnd),
AllocatedType(Ty) {
setAlignment(Align); setAlignment(Align);
assert(!Ty->isVoidTy() && "Cannot allocate void!"); assert(!Ty->isVoidTy() && "Cannot allocate void!");
setName(Name); setName(Name);
@@ -899,10 +901,6 @@ bool AllocaInst::isArrayAllocation() const {
return true; return true;
} }
Type *AllocaInst::getAllocatedType() const {
return getType()->getElementType();
}
/// isStaticAlloca - Return true if this alloca is in the entry block of the /// isStaticAlloca - Return true if this alloca is in the entry block of the
/// function and is a constant size. If so, the code generator will fold it /// function and is a constant size. If so, the code generator will fold it
/// into the prolog/epilog code, so it is basically free. /// into the prolog/epilog code, so it is basically free.

View File

@@ -396,6 +396,9 @@ void llvm::RemapInstruction(Instruction *I, ValueToValueMapTy &VMap,
Tys.push_back(TypeMapper->remapType(Ty)); Tys.push_back(TypeMapper->remapType(Ty));
CS.mutateFunctionType(FunctionType::get( CS.mutateFunctionType(FunctionType::get(
TypeMapper->remapType(I->getType()), Tys, FTy->isVarArg())); TypeMapper->remapType(I->getType()), Tys, FTy->isVarArg()));
} else return;
I->mutateType(TypeMapper->remapType(I->getType())); }
if (auto *AI = dyn_cast<AllocaInst>(I))
AI->setAllocatedType(TypeMapper->remapType(AI->getAllocatedType()));
I->mutateType(TypeMapper->remapType(I->getType()));
} }