diff options
-rw-r--r-- | llvm/lib/Transforms/Scalar/SROA.cpp | 4 | ||||
-rw-r--r-- | llvm/test/Transforms/SROA/vector-lifetime-intrinsic.ll | 31 |
2 files changed, 35 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp index 735dd632f01..2ed4c371618 100644 --- a/llvm/lib/Transforms/Scalar/SROA.cpp +++ b/llvm/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<IntrinsicInst>(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/llvm/test/Transforms/SROA/vector-lifetime-intrinsic.ll b/llvm/test/Transforms/SROA/vector-lifetime-intrinsic.ll new file mode 100644 index 00000000000..30c93b054ec --- /dev/null +++ b/llvm/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 } |