[RISCV] Match vcompress during shuffle lowering (#117748)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / call-translator-tail-call-sret.ll
blob0ff6ae28279f8cd193dfee1a1359fa0a26a295bb
1 ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 ; RUN: llc < %s -mtriple arm64-apple-darwin -global-isel -stop-after=irtranslator -verify-machineinstrs | FileCheck %s
4 ; Check that we don't try to tail-call with a non-forwarded sret parameter.
5 declare void @test_explicit_sret(ptr sret(i64))
7 ; Forwarded explicit sret pointer => we can tail call.
8 define void @can_tail_call_forwarded_explicit_sret_ptr(ptr sret(i64) %arg) {
9   ; CHECK-LABEL: name: can_tail_call_forwarded_explicit_sret_ptr
10   ; CHECK: bb.1 (%ir-block.0):
11   ; CHECK-NEXT:   liveins: $x8
12   ; CHECK-NEXT: {{  $}}
13   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(p0) = COPY $x8
14   ; CHECK-NEXT:   $x8 = COPY [[COPY]](p0)
15   ; CHECK-NEXT:   TCRETURNdi @test_explicit_sret, 0, csr_darwin_aarch64_aapcs, implicit $sp, implicit $x8
16   tail call void @test_explicit_sret(ptr %arg)
17   ret void
20 ; Not marked as tail, so don't tail call.
21 define void @test_call_explicit_sret(ptr sret(i64) %arg) {
22   ; CHECK-LABEL: name: test_call_explicit_sret
23   ; CHECK: bb.1 (%ir-block.0):
24   ; CHECK-NEXT:   liveins: $x8
25   ; CHECK-NEXT: {{  $}}
26   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(p0) = COPY $x8
27   ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
28   ; CHECK-NEXT:   $x8 = COPY [[COPY]](p0)
29   ; CHECK-NEXT:   BL @test_explicit_sret, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $x8
30   ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
31   ; CHECK-NEXT:   RET_ReallyLR
32   call void @test_explicit_sret(ptr %arg)
33   ret void
36 define void @dont_tail_call_explicit_sret_alloca_unused() {
37   ; CHECK-LABEL: name: dont_tail_call_explicit_sret_alloca_unused
38   ; CHECK: bb.1 (%ir-block.0):
39   ; CHECK-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0.l
40   ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
41   ; CHECK-NEXT:   $x8 = COPY [[FRAME_INDEX]](p0)
42   ; CHECK-NEXT:   BL @test_explicit_sret, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $x8
43   ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
44   ; CHECK-NEXT:   RET_ReallyLR
45   %l = alloca i64, align 8
46   tail call void @test_explicit_sret(ptr %l)
47   ret void
50 define void @dont_tail_call_explicit_sret_alloca_dummyusers(ptr %ptr) {
51   ; CHECK-LABEL: name: dont_tail_call_explicit_sret_alloca_dummyusers
52   ; CHECK: bb.1 (%ir-block.0):
53   ; CHECK-NEXT:   liveins: $x0
54   ; CHECK-NEXT: {{  $}}
55   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(p0) = COPY $x0
56   ; CHECK-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0.l
57   ; CHECK-NEXT:   [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[COPY]](p0) :: (load (s64) from %ir.ptr)
58   ; CHECK-NEXT:   G_STORE [[LOAD]](s64), [[FRAME_INDEX]](p0) :: (store (s64) into %ir.l)
59   ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
60   ; CHECK-NEXT:   $x8 = COPY [[FRAME_INDEX]](p0)
61   ; CHECK-NEXT:   BL @test_explicit_sret, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $x8
62   ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
63   ; CHECK-NEXT:   RET_ReallyLR
64   %l = alloca i64, align 8
65   %r = load i64, ptr %ptr, align 8
66   store i64 %r, ptr %l, align 8
67   tail call void @test_explicit_sret(ptr %l)
68   ret void
71 define void @dont_tail_call_tailcall_explicit_sret_gep(ptr %ptr) {
72   ; CHECK-LABEL: name: dont_tail_call_tailcall_explicit_sret_gep
73   ; CHECK: bb.1 (%ir-block.0):
74   ; CHECK-NEXT:   liveins: $x0
75   ; CHECK-NEXT: {{  $}}
76   ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(p0) = COPY $x0
77   ; CHECK-NEXT:   [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 8
78   ; CHECK-NEXT:   [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s64)
79   ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
80   ; CHECK-NEXT:   $x8 = COPY [[PTR_ADD]](p0)
81   ; CHECK-NEXT:   BL @test_explicit_sret, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $x8
82   ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
83   ; CHECK-NEXT:   RET_ReallyLR
84   %ptr2 = getelementptr i64, ptr %ptr, i32 1
85   tail call void @test_explicit_sret(ptr %ptr2)
86   ret void
89 define i64 @dont_tail_call_sret_alloca_returned() {
90   ; CHECK-LABEL: name: dont_tail_call_sret_alloca_returned
91   ; CHECK: bb.1 (%ir-block.0):
92   ; CHECK-NEXT:   [[FRAME_INDEX:%[0-9]+]]:_(p0) = G_FRAME_INDEX %stack.0.l
93   ; CHECK-NEXT:   ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
94   ; CHECK-NEXT:   $x8 = COPY [[FRAME_INDEX]](p0)
95   ; CHECK-NEXT:   BL @test_explicit_sret, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $x8
96   ; CHECK-NEXT:   ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
97   ; CHECK-NEXT:   [[LOAD:%[0-9]+]]:_(s64) = G_LOAD [[FRAME_INDEX]](p0) :: (dereferenceable load (s64) from %ir.l)
98   ; CHECK-NEXT:   $x0 = COPY [[LOAD]](s64)
99   ; CHECK-NEXT:   RET_ReallyLR implicit $x0
100   %l = alloca i64, align 8
101   tail call void @test_explicit_sret(ptr %l)
102   %r = load i64, ptr %l, align 8
103   ret i64 %r