diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2016-08-08 01:30:53 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2016-08-08 01:30:53 +0000 |
commit | 2a65dd1ba608aa2477a397f58194c505ba69cf83 (patch) | |
tree | 9ae2a0c0515b4b8a2aacb6725aa35f0a778a91f1 /llvm/lib/Transforms/Scalar/SROA.cpp | |
parent | 2fdf202493fcef9a3cf7c1b14843090d9eef2539 (diff) | |
download | bcm5719-llvm-2a65dd1ba608aa2477a397f58194c505ba69cf83.tar.gz bcm5719-llvm-2a65dd1ba608aa2477a397f58194c505ba69cf83.zip |
[SROA] Fix crash with lifetime intrinsic partially covering alloca.
Summary:
PromoteMemToReg looks specifically for the pattern
bitcast+lifetime.start (or a bitcast-equivalent GEP); any offset
will lead to an assertion failure.
Fixes https://llvm.org/bugs/show_bug.cgi?id=27999 .
Differential Revision: https://reviews.llvm.org/D22737
llvm-svn: 277969
Diffstat (limited to 'llvm/lib/Transforms/Scalar/SROA.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/SROA.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp index 7d33259c030..67d90a346f2 100644 --- a/llvm/lib/Transforms/Scalar/SROA.cpp +++ b/llvm/lib/Transforms/Scalar/SROA.cpp @@ -2890,7 +2890,13 @@ private: (void)New; DEBUG(dbgs() << " to: " << *New << "\n"); - return true; + + // Lifetime intrinsics are only promotable if they cover the whole alloca. + // (In theory, intrinsics which partially cover an alloca could be + // promoted, but PromoteMemToReg doesn't handle that case.) + bool IsWholeAlloca = NewBeginOffset == NewAllocaBeginOffset && + NewEndOffset == NewAllocaEndOffset; + return IsWholeAlloca; } bool visitPHINode(PHINode &PN) { |