diff options
author | Dale Johannesen <dalej@apple.com> | 2009-05-13 20:55:30 +0000 |
---|---|---|
committer | Dale Johannesen <dalej@apple.com> | 2009-05-13 20:55:30 +0000 |
commit | 556d0a0d15689531f2b203575a3fe55e00713777 (patch) | |
tree | a61ba38b01c980b9bee6695890a86cd29a3905bc | |
parent | f3cc96e1f3645aa4c4cae37f87d2ece3b9d35f80 (diff) | |
download | external_llvm-556d0a0d15689531f2b203575a3fe55e00713777.zip external_llvm-556d0a0d15689531f2b203575a3fe55e00713777.tar.gz external_llvm-556d0a0d15689531f2b203575a3fe55e00713777.tar.bz2 |
Handle some additonal cases of external weak globals.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71717 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/Utils/SimplifyCFG.cpp | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index 4834591..79b92ea 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -348,6 +348,20 @@ static Value *GetIfCondition(BasicBlock *BB, return 0; } +/// findGlobalVariableBase - Recurse into a ConstantExpr to find the underlying +/// GlobalVariable, if there is one. +static GlobalVariable* findGlobalVariableBase(ConstantExpr* CE) { + if (isa<GlobalVariable>(CE)) + return dyn_cast<GlobalVariable>(CE); + if (CE->getOpcode()==Instruction::GetElementPtr || + CE->getOpcode()==Instruction::BitCast) { + if (isa<GlobalVariable>(CE->getOperand(0))) + return dyn_cast<GlobalVariable>(CE->getOperand(0)); + if (ConstantExpr *CE2 = dyn_cast<ConstantExpr>(CE->getOperand(0))) + return findGlobalVariableBase(CE2); + } + return NULL; +} /// DominatesMergePoint - If we have a merge point of an "if condition" as /// accepted above, return true if the specified value dominates the block. We @@ -395,10 +409,14 @@ static bool DominatesMergePoint(Value *V, BasicBlock *BB, !isa<Constant>(I->getOperand(0))) return false; // External weak globals may have address 0, so we can't load them. - if (GlobalVariable* GV= dyn_cast<GlobalVariable>(I->getOperand(0))) { - if (GV->hasExternalWeakLinkage()) - return false; - } + GlobalVariable* GV = dyn_cast<GlobalVariable>(I->getOperand(0)); + if (GV && GV->hasExternalWeakLinkage()) + return false; + // The global may be buried within a ConstantExpr. + if (ConstantExpr *CE = dyn_cast<ConstantExpr>(I->getOperand(0))) + GV = findGlobalVariableBase(CE); + if (GV && GV->hasExternalWeakLinkage()) + return false; // Finally, we have to check to make sure there are no instructions // before the load in its basic block, as we are going to hoist the loop |