summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/ConstantFolding.cpp
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2012-07-25 09:14:54 +0000
committerDuncan Sands <baldrick@free.fr>2012-07-25 09:14:54 +0000
commit0b875a0c29d5f97c8a5e09404e0de79c4fe49858 (patch)
tree873deaaecacc6a2df7e95e5a56d09f8ffde86dfb /llvm/lib/Analysis/ConstantFolding.cpp
parentff7ff3f30b4442e26e8f43970107dd5a8066d3ab (diff)
downloadbcm5719-llvm-0b875a0c29d5f97c8a5e09404e0de79c4fe49858.tar.gz
bcm5719-llvm-0b875a0c29d5f97c8a5e09404e0de79c4fe49858.zip
When folding a load from a global constant, if the load started in the middle
of an array element (rather than at the beginning of the element) and extended into the next element, then the load from the second element was being handled wrong due to incorrect updating of the notion of which byte to load next. This fixes PR13442. Thanks to Chris Smowton for reporting the problem, analyzing it and providing a fix. llvm-svn: 160711
Diffstat (limited to 'llvm/lib/Analysis/ConstantFolding.cpp')
-rw-r--r--llvm/lib/Analysis/ConstantFolding.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp
index 7ced848aa1b..a7c9e550432 100644
--- a/llvm/lib/Analysis/ConstantFolding.cpp
+++ b/llvm/lib/Analysis/ConstantFolding.cpp
@@ -358,17 +358,20 @@ static bool ReadDataFromGlobal(Constant *C, uint64_t ByteOffset,
NumElts = AT->getNumElements();
else
NumElts = cast<VectorType>(C->getType())->getNumElements();
-
+
for (; Index != NumElts; ++Index) {
if (!ReadDataFromGlobal(C->getAggregateElement(Index), Offset, CurPtr,
BytesLeft, TD))
return false;
- if (EltSize >= BytesLeft)
+
+ uint64_t BytesWritten = EltSize - Offset;
+ assert(BytesWritten <= EltSize && "Not indexing into this element?");
+ if (BytesWritten >= BytesLeft)
return true;
-
+
Offset = 0;
- BytesLeft -= EltSize;
- CurPtr += EltSize;
+ BytesLeft -= BytesWritten;
+ CurPtr += BytesWritten;
}
return true;
}
OpenPOWER on IntegriCloud