[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / GlobalISel / builtin-return-address-pacret.ll
blobdbb86b086aa53f3e179fb1c07847218dd7435b73
1 ;; RUN: llc -mtriple aarch64               -global-isel -O0 %s -o - | FileCheck -enable-var-scope %s --check-prefixes=CHECK,CHECK-NOP
2 ;; RUN: llc -mtriple aarch64 -mattr=+v8.3a -global-isel -O0 %s -o - | FileCheck -enable-var-scope %s --check-prefixes=CHECK,CHECK-V83
3 declare void @g0() #1
4 declare void @g1(ptr) #1
5 declare void @g2(i32, ptr) #1
7 declare ptr @llvm.returnaddress(i32 immarg) #2
9 define ptr @f0() #0 {
10 entry:
11   %0 = call ptr @llvm.returnaddress(i32 0)
12   call void @g1(ptr %0)
13   %1 = call ptr @llvm.returnaddress(i32 1)
14   call void @g2(i32 1, ptr %1)
15   %2 = call ptr @llvm.returnaddress(i32 2)
16   ret ptr %2
18 ;; CHECK-LABEL:    f0:
19 ;; CHECK-NOT:      {{(mov|ldr)}} x30
20 ;; CHECK-NOP:      hint #7
21 ;; CHECK-V83:      mov [[COPY_X30:x[0-9]+]], x30
22 ;; CHECK-V83:      xpaci [[COPY_X30]]
23 ;; CHECK:          bl g1
24 ;; CHECK:          ldr x[[T0:[0-9]+]], [x29]
25 ;; CHECK-NOP-NEXT: ldr x30, [x[[T0]], #8]
26 ;; CHECK-NOP-NEXT: hint #7
27 ;; CHECK-V83-NEXT: ldr x[[LD0:[0-9]+]], [x[[T0]], #8]
28 ;; CHECK-V83-NEXT: xpaci x[[LD0]]
29 ;; CHECK:          bl g2
30 ;; CHECK:          ldr x[[T1:[0-9]+]], [x29]
31 ;; CHECK-NEXT:     ldr x[[T1]], [x[[T1]]]
32 ;; CHECK-NOP-NEXT: ldr x30, [x[[T1]], #8]
33 ;; CHECK-NOP-NEXT: hint #7
34 ;; CHECK-NOP-NEXT: mov x0, x30
35 ;; CHECK-V83-NEXT: ldr x0, [x[[T1]], #8]
36 ;; CHECK-V83-NEXT: xpaci x0
38 define ptr @f1() #0 {
39 entry:
40   %0 = call ptr @llvm.returnaddress(i32 1)
41   call void @g1(ptr %0)
42   %1 = call ptr @llvm.returnaddress(i32 2)
43   call void @g2(i32 1, ptr %1)
44   %2 = call ptr @llvm.returnaddress(i32 0)
45   ret ptr %2
47 ;; CHECK-LABEL:    f1:
48 ;; CHECK-DAG:      ldr x[[T0:[0-9]+]], [x29]
49 ;; CHECK-NOP-DAG:  str x30, [sp, #[[OFF:[0-9]+]]
50 ;; CHECK-NOP:      ldr x30, [x[[T0]], #8]
51 ;; CHECK-NOP-NEXT: hint #7
52 ;; CHECK-V83-DAG:  str x30, [sp, #[[OFF:[0-9]+]]
53 ;; CHECK-V83:      ldr x[[T1:[0-9]+]], [x[[T0]], #8]
54 ;; CHECK-V83-NEXT: xpaci x[[T1]]
56 ;; CHECK:          bl g1
57 ;; CHECK:          ldr x[[T2:[0-9]+]], [x29]
58 ;; CHECK-NEXT:     ldr x[[T2]], [x[[T2]]]
59 ;; CHECK-NOP-NEXT: ldr x30, [x[[T2]], #8]
60 ;; CHECK-NOP-NEXT: hint #7
61 ;; CHECK-V83-NEXT: ldr x[[T3:[0-9]+]], [x[[T2]], #8]
62 ;; CHECK-V83-NEXT: xpaci x[[T3]]
63 ;; CHECK:          bl g2
65 ;; CHECK-NOP:      ldr x30, [sp, #[[OFF]]]
66 ;; CHECK-NOP-NEXT: hint #7
67 ;; CHECK-NOP-NEXT: mov x0, x30
69 ;; CHECK-V83:      ldr x0, [sp, #[[OFF]]]
70 ;; CHECK-V83-NEXT: xpaci x0
71 ;; CHECK-NOT:      x0
72 ;; CHECK:          ret
74 define ptr @f2() #0 {
75 entry:
76   call void @g0()
77   %0 = call ptr @llvm.returnaddress(i32 0)
78   ret ptr %0
80 ;; CHECK-LABEL:    f2
81 ;; CHECK:          bl g0
82 ;; CHECK-NOP:      ldr x30, [sp,
83 ;; CHECK-NOP-NEXT: hint #7
84 ;; CHECK-NOP-NEXT: mov x0, x30
86 ;; CHECK-V83:      ldr x0, [sp,
87 ;; CHECK-V83-NEXT: xpaci x0
88 ;; CHECK-NOT:      x0
89 ;; CHECK:          ret
91 define ptr @f3() #0 {
92 entry:
93   %0 = call ptr @llvm.returnaddress(i32 0)
94   ret ptr %0
96 ;; CHECK-LABEL:    f3:
97 ;; CHECK-NOP:      str x30, [sp,
98 ;; CHECK-NOP-NEXT: hint #7
99 ;; CHECK-NOP-NEXT: mov x0, x30
101 ;; CHECK-V83:      mov x0, x30
102 ;; CHECK-V83-NEXT: xpaci x0
103 ;; CHECK-NOT:      x0
104 ;; CHECK:          ret
105 attributes #0 = { nounwind }
106 attributes #1 = { nounwind }
107 attributes #2 = { nounwind readnone }