diff options
| author | Adrian Prantl <aprantl@apple.com> | 2017-11-28 21:30:38 +0000 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2017-11-28 21:30:38 +0000 |
| commit | 77d90b0c39f079b8871c39772a5bad8b8bfac322 (patch) | |
| tree | bb4f0e3da1e4ca11a7753d425c305b12ae1f3159 /llvm/lib/Transforms/Scalar/SROA.cpp | |
| parent | bcf7f290ffc57ae6bc4ff7a14bbf90b83b47844c (diff) | |
| download | bcm5719-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.cpp | 9 |
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 = |

