summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/MemoryBuiltins.cpp
diff options
context:
space:
mode:
authorNuno Lopes <nunoplopes@sapo.pt>2012-12-31 13:52:36 +0000
committerNuno Lopes <nunoplopes@sapo.pt>2012-12-31 13:52:36 +0000
commit7ab7c02d23d2bd00eb145c1ed561974e1841dea9 (patch)
treef1810822a55413eeb24d6e9e2831f99aa50f3eec /llvm/lib/Analysis/MemoryBuiltins.cpp
parentf50ea7109d843492a1d6b0b20ad2acf4fcf2229b (diff)
downloadbcm5719-llvm-7ab7c02d23d2bd00eb145c1ed561974e1841dea9.tar.gz
bcm5719-llvm-7ab7c02d23d2bd00eb145c1ed561974e1841dea9.zip
add support for PHI nodes to ObjectSizeOffsetVisitor
llvm-svn: 171298
Diffstat (limited to 'llvm/lib/Analysis/MemoryBuiltins.cpp')
-rw-r--r--llvm/lib/Analysis/MemoryBuiltins.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/MemoryBuiltins.cpp b/llvm/lib/Analysis/MemoryBuiltins.cpp
index cfd8fcfdb71..2503bfa2161 100644
--- a/llvm/lib/Analysis/MemoryBuiltins.cpp
+++ b/llvm/lib/Analysis/MemoryBuiltins.cpp
@@ -535,9 +535,20 @@ SizeOffsetType ObjectSizeOffsetVisitor::visitLoadInst(LoadInst&) {
return unknown();
}
-SizeOffsetType ObjectSizeOffsetVisitor::visitPHINode(PHINode&) {
- // too complex to analyze statically.
- return unknown();
+SizeOffsetType ObjectSizeOffsetVisitor::visitPHINode(PHINode &PHI) {
+ if (PHI.getNumIncomingValues() == 0)
+ return unknown();
+
+ SizeOffsetType Ret = compute(PHI.getIncomingValue(0));
+ if (!bothKnown(Ret))
+ return unknown();
+
+ // verify that all PHI incoming pointers have the same size and offset
+ for (unsigned i = 1, e = PHI.getNumIncomingValues(); i != e; ++i) {
+ if (compute(PHI.getIncomingValue(i)) != Ret)
+ return unknown();
+ }
+ return Ret;
}
SizeOffsetType ObjectSizeOffsetVisitor::visitSelectInst(SelectInst &I) {
OpenPOWER on IntegriCloud