diff options
Diffstat (limited to 'llvm/test/Transforms/Inline/inline-tail.ll')
-rw-r--r-- | llvm/test/Transforms/Inline/inline-tail.ll | 219 |
1 files changed, 0 insertions, 219 deletions
diff --git a/llvm/test/Transforms/Inline/inline-tail.ll b/llvm/test/Transforms/Inline/inline-tail.ll deleted file mode 100644 index 10b486c5154..00000000000 --- a/llvm/test/Transforms/Inline/inline-tail.ll +++ /dev/null @@ -1,219 +0,0 @@ -; RUN: opt < %s -inline -S | FileCheck %s -; RUN: opt < %s -passes='cgscc(inline)' -S | FileCheck %s - -; We have to apply the less restrictive TailCallKind of the call site being -; inlined and any call sites cloned into the caller. - -; No tail marker after inlining, since test_capture_c captures an alloca. -; CHECK: define void @test_capture_a( -; CHECK-NOT: tail -; CHECK: call void @test_capture_c( - -declare void @test_capture_c(i32*) -define internal void @test_capture_b(i32* %P) { - tail call void @test_capture_c(i32* %P) - ret void -} -define void @test_capture_a() { - %A = alloca i32 ; captured by test_capture_b - call void @test_capture_b(i32* %A) - ret void -} - -; No musttail marker after inlining, since the prototypes don't match. -; CHECK: define void @test_proto_mismatch_a( -; CHECK-NOT: musttail -; CHECK: call void @test_proto_mismatch_c( - -declare void @test_proto_mismatch_c(i32*) -define internal void @test_proto_mismatch_b(i32* %p) { - musttail call void @test_proto_mismatch_c(i32* %p) - ret void -} -define void @test_proto_mismatch_a() { - call void @test_proto_mismatch_b(i32* null) - ret void -} - -; After inlining through a musttail call site, we need to keep musttail markers -; to prevent unbounded stack growth. -; CHECK: define void @test_musttail_basic_a( -; CHECK: musttail call void @test_musttail_basic_c( - -declare void @test_musttail_basic_c(i32* %p) -define internal void @test_musttail_basic_b(i32* %p) { - musttail call void @test_musttail_basic_c(i32* %p) - ret void -} -define void @test_musttail_basic_a(i32* %p) { - musttail call void @test_musttail_basic_b(i32* %p) - ret void -} - -; Don't insert lifetime end markers here, the lifetime is trivially over due -; the return. -; CHECK: define void @test_byval_a( -; CHECK: musttail call void @test_byval_c( -; CHECK-NEXT: ret void - -declare void @test_byval_c(i32* byval %p) -define internal void @test_byval_b(i32* byval %p) { - musttail call void @test_byval_c(i32* byval %p) - ret void -} -define void @test_byval_a(i32* byval %p) { - musttail call void @test_byval_b(i32* byval %p) - ret void -} - -; Don't insert a stack restore, we're about to return. -; CHECK: define void @test_dynalloca_a( -; CHECK: call i8* @llvm.stacksave( -; CHECK: alloca i8, i32 %n -; CHECK: musttail call void @test_dynalloca_c( -; CHECK-NEXT: ret void - -declare void @escape(i8* %buf) -declare void @test_dynalloca_c(i32* byval %p, i32 %n) -define internal void @test_dynalloca_b(i32* byval %p, i32 %n) alwaysinline { - %buf = alloca i8, i32 %n ; dynamic alloca - call void @escape(i8* %buf) ; escape it - musttail call void @test_dynalloca_c(i32* byval %p, i32 %n) - ret void -} -define void @test_dynalloca_a(i32* byval %p, i32 %n) { - musttail call void @test_dynalloca_b(i32* byval %p, i32 %n) - ret void -} - -; We can't merge the returns. -; CHECK: define void @test_multiret_a( -; CHECK: musttail call void @test_multiret_c( -; CHECK-NEXT: ret void -; CHECK: musttail call void @test_multiret_d( -; CHECK-NEXT: ret void - -declare void @test_multiret_c(i1 zeroext %b) -declare void @test_multiret_d(i1 zeroext %b) -define internal void @test_multiret_b(i1 zeroext %b) { - br i1 %b, label %c, label %d -c: - musttail call void @test_multiret_c(i1 zeroext %b) - ret void -d: - musttail call void @test_multiret_d(i1 zeroext %b) - ret void -} -define void @test_multiret_a(i1 zeroext %b) { - musttail call void @test_multiret_b(i1 zeroext %b) - ret void -} - -; We have to avoid bitcast chains. -; CHECK: define i32* @test_retptr_a( -; CHECK: musttail call i8* @test_retptr_c( -; CHECK-NEXT: bitcast i8* {{.*}} to i32* -; CHECK-NEXT: ret i32* - -declare i8* @test_retptr_c() -define internal i16* @test_retptr_b() { - %rv = musttail call i8* @test_retptr_c() - %v = bitcast i8* %rv to i16* - ret i16* %v -} -define i32* @test_retptr_a() { - %rv = musttail call i16* @test_retptr_b() - %v = bitcast i16* %rv to i32* - ret i32* %v -} - -; Combine the last two cases: multiple returns with pointer bitcasts. -; CHECK: define i32* @test_multiptrret_a( -; CHECK: musttail call i8* @test_multiptrret_c( -; CHECK-NEXT: bitcast i8* {{.*}} to i32* -; CHECK-NEXT: ret i32* -; CHECK: musttail call i8* @test_multiptrret_d( -; CHECK-NEXT: bitcast i8* {{.*}} to i32* -; CHECK-NEXT: ret i32* - -declare i8* @test_multiptrret_c(i1 zeroext %b) -declare i8* @test_multiptrret_d(i1 zeroext %b) -define internal i16* @test_multiptrret_b(i1 zeroext %b) { - br i1 %b, label %c, label %d -c: - %c_rv = musttail call i8* @test_multiptrret_c(i1 zeroext %b) - %c_v = bitcast i8* %c_rv to i16* - ret i16* %c_v -d: - %d_rv = musttail call i8* @test_multiptrret_d(i1 zeroext %b) - %d_v = bitcast i8* %d_rv to i16* - ret i16* %d_v -} -define i32* @test_multiptrret_a(i1 zeroext %b) { - %rv = musttail call i16* @test_multiptrret_b(i1 zeroext %b) - %v = bitcast i16* %rv to i32* - ret i32* %v -} - -; Inline a musttail call site which contains a normal return and a musttail call. -; CHECK: define i32 @test_mixedret_a( -; CHECK: br i1 %b -; CHECK: musttail call i32 @test_mixedret_c( -; CHECK-NEXT: ret i32 -; CHECK: call i32 @test_mixedret_d(i1 zeroext %b) -; CHECK: add i32 1, -; CHECK-NOT: br -; CHECK: ret i32 - -declare i32 @test_mixedret_c(i1 zeroext %b) -declare i32 @test_mixedret_d(i1 zeroext %b) -define internal i32 @test_mixedret_b(i1 zeroext %b) { - br i1 %b, label %c, label %d -c: - %c_rv = musttail call i32 @test_mixedret_c(i1 zeroext %b) - ret i32 %c_rv -d: - %d_rv = call i32 @test_mixedret_d(i1 zeroext %b) - %d_rv1 = add i32 1, %d_rv - ret i32 %d_rv1 -} -define i32 @test_mixedret_a(i1 zeroext %b) { - %rv = musttail call i32 @test_mixedret_b(i1 zeroext %b) - ret i32 %rv -} - -declare i32 @donttailcall() - -define i32 @notail() { - %rv = notail call i32 @donttailcall() - ret i32 %rv -} - -; CHECK: @test_notail -; CHECK: notail call i32 @donttailcall -; CHECK: ret -define i32 @test_notail() { - %rv = tail call i32 @notail() - ret i32 %rv -} - -; PR31014: Inlining a musttail call through a notail call site should remove -; any tail marking, otherwise we break verifier invariants. - -declare void @do_ret(i32) - -define void @test_notail_inline_musttail(i32 %a) { - notail call void @inline_musttail(i32 %a) - musttail call void @do_ret(i32 %a) - ret void -} - -define internal void @inline_musttail(i32 %a) { - musttail call void @do_ret(i32 %a) - ret void -} - -; CHECK-LABEL: define void @test_notail_inline_musttail(i32 %a) -; CHECK: {{^ *}}call void @do_ret(i32 %a) -; CHECK: musttail call void @do_ret(i32 %a) -; CHECK: ret void |