From d4748bbd497b550a4e5db246c6708fcd6de542da Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Thu, 7 Aug 2014 21:07:35 +0000 Subject: [PATCH] Fix a case in SROA where lifetime intrinsics could inhibit alloca promotion. In this case, the code path dealing with vector promotion was missing the explicit checks for lifetime intrinsics that were present on the corresponding integer promotion path. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215148 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/SROA.cpp | 4 +++ .../SROA/vector-lifetime-intrinsic.ll | 31 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 test/Transforms/SROA/vector-lifetime-intrinsic.ll diff --git a/lib/Transforms/Scalar/SROA.cpp b/lib/Transforms/Scalar/SROA.cpp index 735dd632f01..2ed4c371618 100644 --- a/lib/Transforms/Scalar/SROA.cpp +++ b/lib/Transforms/Scalar/SROA.cpp @@ -1659,6 +1659,10 @@ static bool isVectorPromotionViableForSlice( return false; if (!I->isSplittable()) return false; // Skip any unsplittable intrinsics. + } else if (IntrinsicInst *II = dyn_cast(U->getUser())) { + if (II->getIntrinsicID() != Intrinsic::lifetime_start && + II->getIntrinsicID() != Intrinsic::lifetime_end) + return false; } else if (U->get()->getType()->getPointerElementType()->isStructTy()) { // Disable vector promotion when there are loads or stores of an FCA. return false; diff --git a/test/Transforms/SROA/vector-lifetime-intrinsic.ll b/test/Transforms/SROA/vector-lifetime-intrinsic.ll new file mode 100644 index 00000000000..30c93b054ec --- /dev/null +++ b/test/Transforms/SROA/vector-lifetime-intrinsic.ll @@ -0,0 +1,31 @@ +; RUN: opt -sroa -S < %s | FileCheck %s + +target datalayout = "e-p:64:32-i64:32-v32:32-n32-S64" + +; Function Attrs: nounwind +declare void @llvm.lifetime.start(i64, i8* nocapture) #0 + +; Function Attrs: nounwind +declare void @llvm.lifetime.end(i64, i8* nocapture) #0 + +; CHECK: @wombat +; CHECK-NOT: alloca +; CHECK: ret void +define void @wombat(<4 x float> %arg1) { +bb: + %tmp = alloca <4 x float>, align 16 + %tmp8 = bitcast <4 x float>* %tmp to i8* + call void @llvm.lifetime.start(i64 16, i8* %tmp8) + store <4 x float> %arg1, <4 x float>* %tmp, align 16 + %tmp17 = bitcast <4 x float>* %tmp to <3 x float>* + %tmp18 = load <3 x float>* %tmp17 + %tmp20 = bitcast <4 x float>* %tmp to i8* + call void @llvm.lifetime.end(i64 16, i8* %tmp20) + call void @wombat3(<3 x float> %tmp18) + ret void +} + +; Function Attrs: nounwind +declare void @wombat3(<3 x float>) #0 + +attributes #0 = { nounwind } -- 2.34.1