1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
# RUN: llc -mtriple aarch64-none-elf -run-pass=block-placement -O3 -o - %s | FileCheck %s
# RUN: llc -mtriple aarch64-none-elf -passes='require<profile-summary>,function(machine-function(block-placement))' -O3 -o - %s | FileCheck %s
## Check that block-placement does not perform tail duplication on the
## PAUTH_EPILOGUE instruction. If that happened, the two prologues would use
## different addresses while calculating the return address signature, so the
## epilogue could only be correct for (at most) one of them.
--- |
define void @test() "frame-pointer"="non-leaf" {
entry:
ret void
}
declare void @f()
...
---
name: test
body: |
; CHECK-LABEL: name: test
; CHECK: bb.0.entry:
; CHECK-NEXT: successors: %bb.1(0x30000000), %bb.2(0x50000000)
; CHECK-NEXT: liveins: $w0, $w1, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: CBZW renamable $w0, %bb.1
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.2:
; CHECK-NEXT: successors: %bb.3(0x80000000)
; CHECK-NEXT: liveins: $w0, $w1, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: B %bb.3
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.1:
; CHECK-NEXT: successors: %bb.3(0x80000000)
; CHECK-NEXT: liveins: $w1, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: renamable $w8 = MOVZWi 1, 0
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.3:
; CHECK-NEXT: successors: %bb.5(0x30000000), %bb.4(0x50000000)
; CHECK-NEXT: liveins: $w1, $w8, $lr
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: frame-setup PAUTH_PROLOGUE implicit-def $lr, implicit killed $lr, implicit $sp
; CHECK-NEXT: CBZW killed renamable $w1, %bb.5
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.4:
; CHECK-NEXT: successors: %bb.5(0x80000000)
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: BL @f, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: bb.5:
; CHECK-NEXT: BL @f, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
; CHECK-NEXT: frame-destroy PAUTH_EPILOGUE implicit-def $lr, implicit killed $lr, implicit $sp
; CHECK-NEXT: TCRETURNdi @f, 0, csr_aarch64_aapcs, implicit $sp
bb.0.entry:
successors: %bb.1(0x30000000), %bb.2(0x50000000)
liveins: $w0, $w1, $lr
CBNZW renamable $w0, %bb.2
bb.1:
successors: %bb.3(0x80000000)
liveins: $w1, $lr
renamable $w8 = MOVZWi 1, 0
B %bb.3
bb.2:
successors: %bb.3(0x80000000)
liveins: $w0, $w1, $lr
bb.3:
successors: %bb.5(0x30000000), %bb.4(0x50000000)
liveins: $w1, $w8, $lr
frame-setup PAUTH_PROLOGUE implicit-def $lr, implicit killed $lr, implicit $sp
CBZW killed renamable $w1, %bb.5
bb.4:
successors: %bb.5(0x80000000)
BL @f, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
bb.5:
BL @f, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
frame-destroy PAUTH_EPILOGUE implicit-def $lr, implicit killed $lr, implicit $sp
TCRETURNdi @f, 0, csr_aarch64_aapcs, implicit $sp
...
|