Finally land the InvokeInst operand reordering.

I have audited all getOperandNo calls now, fixing
hidden assumptions. CallSite related uglyness will
be eliminated successively.

Note this patch has a long and griveous history,
for all the back-and-forths have a look at
CallSite.h's log.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99399 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Gabor Greif
2010-03-24 13:21:49 +00:00
parent 6d6aaeca4f
commit c9f7500d17
14 changed files with 80 additions and 47 deletions

View File

@ -676,17 +676,13 @@ void Verifier::visitFunction(Function &F) {
"blockaddress may not be used with the entry block!", Entry);
}
}
// If this function is actually an intrinsic, verify that it is only used in
// direct call/invokes, never having its "address taken".
if (F.getIntrinsicID()) {
for (Value::use_iterator UI = F.use_begin(), E = F.use_end(); UI != E;++UI){
User *U = cast<User>(UI);
if ((isa<CallInst>(U) || isa<InvokeInst>(U)) && UI.getOperandNo() == 0)
continue; // Direct calls/invokes are ok.
const User *U;
if (F.hasAddressTaken(&U))
Assert1(0, "Invalid user of intrinsic instruction!", U);
}
}
}
@ -1483,7 +1479,7 @@ void Verifier::visitInstruction(Instruction &I) {
"Instruction does not dominate all uses!", Op, &I);
}
} else if (isa<InlineAsm>(I.getOperand(i))) {
Assert1(i == 0 && (isa<CallInst>(I) || isa<InvokeInst>(I)),
Assert1((i == 0 && isa<CallInst>(I)) || (i + 3 == e && isa<InvokeInst>(I)),
"Cannot take the address of an inline asm!", &I);
}
}