diff options
author | Nuno Lopes <nunoplopes@sapo.pt> | 2012-07-27 18:21:15 +0000 |
---|---|---|
committer | Nuno Lopes <nunoplopes@sapo.pt> | 2012-07-27 18:21:15 +0000 |
commit | 85591f899d7c2a7f3209be88bbeaae96aa755a60 (patch) | |
tree | 2f83a0f1692cd03035500912c17de5854a66cc7c /llvm/lib/Analysis/MemoryBuiltins.cpp | |
parent | 55253100be1d82d1f780cfc1b3757af5d6309a01 (diff) | |
download | bcm5719-llvm-85591f899d7c2a7f3209be88bbeaae96aa755a60.tar.gz bcm5719-llvm-85591f899d7c2a7f3209be88bbeaae96aa755a60.zip |
fix PR13390: do not loop forever with self-referencing self instructions
llvm-svn: 160876
Diffstat (limited to 'llvm/lib/Analysis/MemoryBuiltins.cpp')
-rw-r--r-- | llvm/lib/Analysis/MemoryBuiltins.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/MemoryBuiltins.cpp b/llvm/lib/Analysis/MemoryBuiltins.cpp index 4833b5212be..c0cc27b6ec5 100644 --- a/llvm/lib/Analysis/MemoryBuiltins.cpp +++ b/llvm/lib/Analysis/MemoryBuiltins.cpp @@ -506,6 +506,10 @@ SizeOffsetType ObjectSizeOffsetVisitor::visitPHINode(PHINode&) { } SizeOffsetType ObjectSizeOffsetVisitor::visitSelectInst(SelectInst &I) { + // ignore malformed self-looping selects + if (I.getTrueValue() == &I || I.getFalseValue() == &I) + return unknown(); + SizeOffsetType TrueSide = compute(I.getTrueValue()); SizeOffsetType FalseSide = compute(I.getFalseValue()); if (bothKnown(TrueSide) && bothKnown(FalseSide) && TrueSide == FalseSide) @@ -711,6 +715,10 @@ SizeOffsetEvalType ObjectSizeOffsetEvaluator::visitPHINode(PHINode &PHI) { } SizeOffsetEvalType ObjectSizeOffsetEvaluator::visitSelectInst(SelectInst &I) { + // ignore malformed self-looping selects + if (I.getTrueValue() == &I || I.getFalseValue() == &I) + return unknown(); + SizeOffsetEvalType TrueSide = compute_(I.getTrueValue()); SizeOffsetEvalType FalseSide = compute_(I.getFalseValue()); |