diff options
author | Dan Gohman <gohman@apple.com> | 2009-09-15 16:14:44 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-09-15 16:14:44 +0000 |
commit | 94262db4d4ced0eff8ff3533b3441539d0efb50a (patch) | |
tree | d46f5654c009afa628fb40e580484467271db1d8 /llvm/lib/Analysis | |
parent | 01ccf998d59f6190ea1ec92565125cbeb4ba8b0f (diff) | |
download | bcm5719-llvm-94262db4d4ced0eff8ff3533b3441539d0efb50a.tar.gz bcm5719-llvm-94262db4d4ced0eff8ff3533b3441539d0efb50a.zip |
Teach ValueTracking how to look through GlobalAliases. GlobalAliases are
not folded in the constant folder because the constant folder doesn't
simplify ConstantExpr operands.
llvm-svn: 81864
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 1782edee7bf..9494a2f4c53 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -16,6 +16,7 @@ #include "llvm/Constants.h" #include "llvm/Instructions.h" #include "llvm/GlobalVariable.h" +#include "llvm/GlobalAlias.h" #include "llvm/IntrinsicInst.h" #include "llvm/LLVMContext.h" #include "llvm/Operator.h" @@ -105,6 +106,17 @@ void llvm::ComputeMaskedBits(Value *V, const APInt &Mask, KnownOne.clear(); return; } + // A weak GlobalAlias is totally unknown. A non-weak GlobalAlias has + // the bits of its aliasee. + if (GlobalAlias *GA = dyn_cast<GlobalAlias>(V)) { + if (GA->mayBeOverridden()) { + KnownZero.clear(); KnownOne.clear(); + } else { + ComputeMaskedBits(GA->getAliasee(), Mask, KnownZero, KnownOne, + TD, Depth+1); + } + return; + } KnownZero.clear(); KnownOne.clear(); // Start out not knowing anything. |