diff options
author | Duncan Sands <baldrick@free.fr> | 2010-11-17 04:30:22 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2010-11-17 04:30:22 +0000 |
commit | ff10341183adf74760e6118a55cbd1debf50f90f (patch) | |
tree | 8ddc7145851c25d25499846ae47e84636c2660b6 /lib/Analysis/Lint.cpp | |
parent | a0c5244e8575ae91af318af09353ff34ac6bca1e (diff) |
Fix a layering violation: hasConstantValue, which is part of the PHINode
class, uses DominatorTree which is an analysis. This change moves all of
the tricky hasConstantValue logic to SimplifyInstruction, and replaces it
with a very simple literal implementation. I already taught users of
hasConstantValue that need tricky stuff to use SimplifyInstruction instead.
I didn't update InlineFunction because the IR looks like it might be in a
funky state at the point it calls hasConstantValue, which makes calling
SimplifyInstruction dangerous since it can in theory do a lot of tricky
reasoning. This may be a pessimization, for example in the case where
all phi node operands are either undef or a fixed constant.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@119459 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/Lint.cpp')
-rw-r--r-- | lib/Analysis/Lint.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/lib/Analysis/Lint.cpp b/lib/Analysis/Lint.cpp index 4318a30fa6..8b76b87337 100644 --- a/lib/Analysis/Lint.cpp +++ b/lib/Analysis/Lint.cpp @@ -582,7 +582,7 @@ Value *Lint::findValueImpl(Value *V, bool OffsetOk, BBI = BB->end(); } } else if (PHINode *PN = dyn_cast<PHINode>(V)) { - if (Value *W = PN->hasConstantValue(DT)) + if (Value *W = PN->hasConstantValue()) return findValueImpl(W, OffsetOk, Visited); } else if (CastInst *CI = dyn_cast<CastInst>(V)) { if (CI->isNoopCast(TD ? TD->getIntPtrType(V->getContext()) : @@ -615,7 +615,7 @@ Value *Lint::findValueImpl(Value *V, bool OffsetOk, // As a last resort, try SimplifyInstruction or constant folding. if (Instruction *Inst = dyn_cast<Instruction>(V)) { - if (Value *W = SimplifyInstruction(Inst, TD)) + if (Value *W = SimplifyInstruction(Inst, TD, DT)) if (W != Inst) return findValueImpl(W, OffsetOk, Visited); } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { |