summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/SROA.cpp
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2017-11-28 21:30:38 +0000
committerAdrian Prantl <aprantl@apple.com>2017-11-28 21:30:38 +0000
commit77d90b0c39f079b8871c39772a5bad8b8bfac322 (patch)
treebb4f0e3da1e4ca11a7753d425c305b12ae1f3159 /llvm/lib/Transforms/Scalar/SROA.cpp
parentbcf7f290ffc57ae6bc4ff7a14bbf90b83b47844c (diff)
downloadbcm5719-llvm-77d90b0c39f079b8871c39772a5bad8b8bfac322.tar.gz
bcm5719-llvm-77d90b0c39f079b8871c39772a5bad8b8bfac322.zip
SROA: Don't create variable fragments that are outside of the variable.
An alloca may be larger than a variable that is described to be stored there. Don't create a dbg.value for fragments that are outside of the variable. This fixes PR35447. https://bugs.llvm.org/show_bug.cgi?id=35447 llvm-svn: 319230
Diffstat (limited to 'llvm/lib/Transforms/Scalar/SROA.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/SROA.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp
index b430d07406c..bd064978b64 100644
--- a/llvm/lib/Transforms/Scalar/SROA.cpp
+++ b/llvm/lib/Transforms/Scalar/SROA.cpp
@@ -4134,6 +4134,15 @@ bool SROA::splitAlloca(AllocaInst &AI, AllocaSlices &AS) {
"new fragment is outside of original fragment");
Start -= OrigFragment->OffsetInBits;
}
+
+ // The alloca may be larger than the variable.
+ if (VarSize) {
+ if (Size > *VarSize)
+ Size = *VarSize;
+ if (Size == 0 || Start + Size > *VarSize)
+ continue;
+ }
+
// Avoid creating a fragment expression that covers the entire variable.
if (!VarSize || *VarSize != Size) {
if (auto E =
OpenPOWER on IntegriCloud