xref: /llvm-project/llvm/test/CodeGen/AArch64/GlobalISel/select-returnaddress-liveins.mir (revision 1ee315ae7964c8433b772e0b5d667834994ba753)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=aarch64 -global-isel -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
3
4--- |
5  define void @lr_other_block() { ret void }
6  define void @already_live_in() { ret void }
7  define void @multi_use() { ret void }
8  declare ptr @llvm.returnaddress(i32 immarg)
9...
10---
11name:            lr_other_block
12alignment:       4
13legalized:       true
14regBankSelected: true
15tracksRegLiveness: true
16body:             |
17  ; CHECK-LABEL: name: lr_other_block
18  ; CHECK: bb.0:
19  ; CHECK:   successors: %bb.1(0x80000000)
20  ; CHECK:   liveins: $w0, $x0, $lr
21  ; CHECK:   [[COPY:%[0-9]+]]:gpr64 = COPY $lr
22  ; CHECK: bb.1:
23  ; CHECK:   $lr = COPY [[COPY]]
24  ; CHECK:   XPACLRI implicit-def $lr, implicit $lr
25  ; CHECK:   [[COPY1:%[0-9]+]]:gpr64 = COPY $lr
26  ; CHECK:   $x0 = COPY [[COPY1]]
27  ; CHECK:   RET_ReallyLR implicit $x0
28  ; LR should be added as a livein to the entry block.
29
30  bb.0:
31    ; We should have lr as a livein to bb.0, and a copy from LR.
32    liveins: $w0, $x0
33    G_BR %bb.1
34  bb.1:
35    %4:gpr(p0) = G_INTRINSIC intrinsic(@llvm.returnaddress), 0
36    $x0 = COPY %4
37    RET_ReallyLR implicit $x0
38...
39---
40name:            already_live_in
41alignment:       4
42legalized:       true
43regBankSelected: true
44tracksRegLiveness: true
45body:             |
46  ; CHECK-LABEL: name: already_live_in
47  ; CHECK: bb.0:
48  ; CHECK:   successors: %bb.1(0x80000000)
49  ; CHECK:   liveins: $w0, $x0, $lr
50  ; CHECK:   [[COPY:%[0-9]+]]:gpr64 = COPY $lr
51  ; CHECK: bb.1:
52  ; CHECK:   $lr = COPY [[COPY]]
53  ; CHECK:   XPACLRI implicit-def $lr, implicit $lr
54  ; CHECK:   [[COPY1:%[0-9]+]]:gpr64 = COPY $lr
55  ; CHECK:   $x0 = COPY [[COPY1]]
56  ; CHECK:   RET_ReallyLR implicit $x0
57  ; We should not have LR listed as a livein twice.
58
59  bb.0:
60    liveins: $w0, $x0, $lr
61    G_BR %bb.1
62  bb.1:
63    %4:gpr(p0) = G_INTRINSIC intrinsic(@llvm.returnaddress), 0
64    $x0 = COPY %4
65    RET_ReallyLR implicit $x0
66...
67
68# Check copies are inserted in the right places when selecting
69# multiple uses in different blocks
70---
71name:            multi_use
72alignment:       4
73legalized:       true
74regBankSelected: true
75tracksRegLiveness: true
76body:             |
77  ; CHECK-LABEL: name: multi_use
78  ; CHECK: bb.0:
79  ; CHECK:   successors: %bb.1(0x80000000)
80  ; CHECK:   liveins: $w0, $x0, $lr
81  ; CHECK:   [[COPY:%[0-9]+]]:gpr64 = COPY $lr
82  ; CHECK:   $lr = COPY [[COPY]]
83  ; CHECK:   XPACLRI implicit-def $lr, implicit $lr
84  ; CHECK:   [[COPY1:%[0-9]+]]:gpr64 = COPY $lr
85  ; CHECK: bb.1:
86  ; CHECK:   $x0 = COPY [[COPY1]]
87  ; CHECK:   $lr = COPY [[COPY]]
88  ; CHECK:   XPACLRI implicit-def $lr, implicit $lr
89  ; CHECK:   [[COPY2:%[0-9]+]]:gpr64 = COPY $lr
90  ; CHECK:   RET_ReallyLR implicit [[COPY2]]
91  bb.0:
92    liveins: $w0, $x0, $lr
93    %0:gpr(p0) = G_INTRINSIC intrinsic(@llvm.returnaddress), 0
94    G_BR %bb.1
95  bb.1:
96    $x0 = COPY %0
97    %1:gpr(p0) = G_INTRINSIC intrinsic(@llvm.returnaddress), 0
98    RET_ReallyLR implicit %1
99...
100