summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-01-16 22:59:24 +0000
committerReid Kleckner <reid@kleckner.net>2014-01-16 22:59:24 +0000
commit60d3a835ff1821f6c42a20a88b79ebc5cd12aac3 (patch)
tree1762815f673e9fe30c2d8fb83dcfbb40a7d4cc53 /llvm/lib/IR
parent5ec012d4ded5434e011e6f68b1e13b82ec120c4b (diff)
downloadbcm5719-llvm-60d3a835ff1821f6c42a20a88b79ebc5cd12aac3.tar.gz
bcm5719-llvm-60d3a835ff1821f6c42a20a88b79ebc5cd12aac3.zip
Change inalloca rules to make it only apply to the last parameter
This makes things a lot easier, because we can now talk about the "argument allocation", which allocates all the memory for the call in one shot. The only functional change is to the verifier for a feature that hasn't shipped yet. llvm-svn: 199434
Diffstat (limited to 'llvm/lib/IR')
-rw-r--r--llvm/lib/IR/Verifier.cpp33
1 files changed, 9 insertions, 24 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index d8e5c89598e..002460e53d4 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -910,6 +910,11 @@ void Verifier::VerifyFunctionAttrs(FunctionType *FT, AttributeSet Attrs,
if (Attrs.hasAttribute(Idx, Attribute::StructRet))
Assert1(Idx == 1, "Attribute sret is not on first parameter!", V);
+
+ if (Attrs.hasAttribute(Idx, Attribute::InAlloca)) {
+ Assert1(Idx == FT->getNumParams(),
+ "inalloca isn't on the last parameter!", V);
+ }
}
if (!Attrs.hasAttributes(AttributeSet::FunctionIndex))
@@ -1541,15 +1546,6 @@ void Verifier::VerifyCallSite(CallSite CS) {
// Verify call attributes.
VerifyFunctionAttrs(FTy, Attrs, I);
- // Verify that values used for inalloca parameters are in fact allocas.
- for (unsigned i = 0, e = CS.arg_size(); i != e; ++i) {
- if (!Attrs.hasAttribute(1 + i, Attribute::InAlloca))
- continue;
- Value *Arg = CS.getArgument(i);
- Assert2(isa<AllocaInst>(Arg), "Inalloca argument is not an alloca!", I,
- Arg);
- }
-
if (FTy->isVarArg()) {
// FIXME? is 'nest' even legal here?
bool SawNest = false;
@@ -1583,6 +1579,10 @@ void Verifier::VerifyCallSite(CallSite CS) {
Assert1(!Attrs.hasAttribute(Idx, Attribute::StructRet),
"Attribute 'sret' cannot be used for vararg call arguments!", I);
+
+ if (Attrs.hasAttribute(Idx, Attribute::InAlloca))
+ Assert1(Idx == CS.arg_size(), "inalloca isn't on the last argument!",
+ I);
}
}
@@ -1888,21 +1888,6 @@ void Verifier::visitAllocaInst(AllocaInst &AI) {
Assert1(AI.getArraySize()->getType()->isIntegerTy(),
"Alloca array size must have integer type", &AI);
- // Verify that an alloca instruction is not used with inalloca more than once.
- unsigned InAllocaUses = 0;
- for (User::use_iterator UI = AI.use_begin(), UE = AI.use_end(); UI != UE;
- ++UI) {
- CallSite CS(*UI);
- if (!CS)
- continue;
- unsigned ArgNo = CS.getArgumentNo(UI);
- if (CS.isInAllocaArgument(ArgNo)) {
- InAllocaUses++;
- Assert1(InAllocaUses <= 1,
- "Allocas can be used at most once with inalloca!", &AI);
- }
- }
-
visitInstruction(AI);
}
OpenPOWER on IntegriCloud