aboutsummaryrefslogtreecommitdiff
path: root/llvm/test/CodeGen/AArch64/pauthlr-prologue-duplication.mir
blob: 7b107f8a240458d57a5f11b563e272193439e986 (plain)
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
...