teach ipsccp and ipconstprop that a blockaddress doesn't 'take the address' of a function

in a way that should prevent ip constprop.  This allows clang/test/CodeGen/indirect-goto.c
to pass with the new indirect goto lowering.

llvm-svn: 85709
This commit is contained in:
Chris Lattner 2009-11-01 06:11:53 +00:00
parent a1dc101f66
commit 1a8b80ed5a
2 changed files with 7 additions and 2 deletions

View File

@ -86,6 +86,9 @@ bool IPCP::PropagateConstantsIntoArguments(Function &F) {
unsigned NumNonconstant = 0;
for (Value::use_iterator UI = F.use_begin(), E = F.use_end(); UI != E; ++UI) {
// Ignore blockaddress uses.
if (isa<BlockAddress>(*UI)) continue;
// Used by a non-instruction, or not the callee of a function, do not
// transform.
if (!isa<CallInst>(*UI) && !isa<InvokeInst>(*UI))

View File

@ -1680,12 +1680,14 @@ static bool AddressIsTaken(GlobalValue *GV) {
return true; // Storing addr of GV.
} else if (isa<InvokeInst>(*UI) || isa<CallInst>(*UI)) {
// Make sure we are calling the function, not passing the address.
CallSite CS = CallSite::get(cast<Instruction>(*UI));
if (CS.hasArgument(GV))
if (UI.getOperandNo() != 0)
return true;
} else if (LoadInst *LI = dyn_cast<LoadInst>(*UI)) {
if (LI->isVolatile())
return true;
} else if (isa<BlockAddress>(*UI)) {
// blockaddress doesn't take the address of the function, it takes addr
// of label.
} else {
return true;
}