From c9277f40fddadc0d6fc727dffdd7dc7742c0aadc Mon Sep 17 00:00:00 2001 From: Arnold Schwaighofer Date: Fri, 9 Sep 2016 22:40:27 +0000 Subject: [PATCH] Inliner: Don't mark swifterror allocas with lifetime markers This would create a bitcast use which fails the verifier: swifterror values may only be used by loads, stores, and as function arguments. rdar://28233244 llvm-svn: 281114 --- llvm/lib/Transforms/Utils/InlineFunction.cpp | 3 +++ llvm/test/Transforms/Inline/lifetime.ll | 17 +++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index e001f6d2863e..383010f0f9d1 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -1789,6 +1789,9 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI, IRBuilder<> builder(&FirstNewBlock->front()); for (unsigned ai = 0, ae = IFI.StaticAllocas.size(); ai != ae; ++ai) { AllocaInst *AI = IFI.StaticAllocas[ai]; + // Don't mark swifterror allocas. They can't have bitcast uses. + if (AI->isSwiftError()) + continue; // If the alloca is already scoped to something smaller than the whole // function then there's no need to add redundant, less accurate markers. diff --git a/llvm/test/Transforms/Inline/lifetime.ll b/llvm/test/Transforms/Inline/lifetime.ll index 12c433b9e626..fc209ccc50f1 100644 --- a/llvm/test/Transforms/Inline/lifetime.ll +++ b/llvm/test/Transforms/Inline/lifetime.ll @@ -98,3 +98,20 @@ define void @test_arrays_alloca() { ; CHECK: ret void ret void } + +%swift.error = type opaque + +define void @helper_swifterror_alloca() { +entry: + %swifterror = alloca swifterror %swift.error*, align 8 + store %swift.error* null, %swift.error** %swifterror, align 8 + ret void +} + +define void @test_swifterror_alloca() { +; CHECK-LABEL: @test_swifterror_alloca( +; CHECK-NOT: lifetime + call void @helper_swifterror_alloca() +; CHECK: ret void + ret void +}