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