From 2a65dd1ba608aa2477a397f58194c505ba69cf83 Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Mon, 8 Aug 2016 01:30:53 +0000 Subject: [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 --- llvm/lib/Transforms/Scalar/SROA.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'llvm/lib/Transforms/Scalar') 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) { -- cgit v1.2.3