1 # RUN: llc -o /dev/null %s -mtriple=aarch64-apple-ios -run-pass=aarch64-collect-loh -debug-only=aarch64-collect-loh 2>&1 | FileCheck %s
3 define void @func0() { ret void }
5 declare void @extfunc()
7 @g0 = external global i32
8 @g1 = external global i32
9 @g2 = external global i32
10 @g3 = external global i32
11 @g4 = external global i32
12 @g5 = external global i32
15 # Check various LOH variants. Remember that the algorithms walks the basic
17 # CHECK-LABEL: ********** AArch64 Collect LOH **********
18 # CHECK-LABEL: Looking in function func0
22 ; CHECK: Adding MCLOH_AdrpAdrp:
23 ; CHECK-NEXT: %X1<def> = ADRP <ga:@g3>
24 ; CHECK-NEXT: %X1<def> = ADRP <ga:@g4>
25 ; CHECK-NEXT: Adding MCLOH_AdrpAdrp:
26 ; CHECK-NEXT: %X1<def> = ADRP <ga:@g2>
27 ; CHECK-NEXT: %X1<def> = ADRP <ga:@g3>
28 ; CHECK-NEXT: Adding MCLOH_AdrpAdrp:
29 ; CHECK-NEXT: %X0<def> = ADRP <ga:@g0>
30 ; CHECK-NEXT: %X0<def> = ADRP <ga:@g1>
31 %x0 = ADRP target-flags(aarch64-page) @g0
32 %x0 = ADRP target-flags(aarch64-page) @g1
33 %x1 = ADRP target-flags(aarch64-page) @g2
34 %x1 = ADRP target-flags(aarch64-page) @g3
35 %x1 = ADRP target-flags(aarch64-page) @g4
38 ; CHECK-NEXT: Adding MCLOH_AdrpAdd:
39 ; CHECK-NEXT: %X20<def> = ADRP <ga:@g0>
40 ; CHECK-NEXT: %X3<def> = ADDXri %X20, <ga:@g0>
41 ; CHECK-NEXT: Adding MCLOH_AdrpAdd:
42 ; CHECK-NEXT: %X1<def> = ADRP <ga:@g0>
43 ; CHECK-NEXT: %X1<def> = ADDXri %X1, <ga:@g0>
44 %x1 = ADRP target-flags(aarch64-page) @g0
45 %x9 = SUBXri %x11, 5, 0 ; should not affect MCLOH formation
46 %x1 = ADDXri %x1, target-flags(aarch64-pageoff) @g0, 0
47 %x20 = ADRP target-flags(aarch64-page) @g0
48 BL @extfunc, csr_aarch64_aapcs ; should not clobber X20
49 %x3 = ADDXri %x20, target-flags(aarch64-pageoff) @g0, 0
52 ; CHECK-NOT: MCLOH_AdrpAdd
53 %x9 = ADRP target-flags(aarch64-page) @g0
54 BL @extfunc, csr_aarch64_aapcs ; clobbers x9
55 %x9 = ADDXri %x9, target-flags(aarch64-pageoff) @g0, 0
58 ; CHECK-NOT: MCLOH_AdrpAdd
59 %x10 = ADRP target-flags(aarch64-page) @g0
60 HINT 0, implicit def dead %x10 ; clobbers x10
61 %x10 = ADDXri %x10, target-flags(aarch64-pageoff) @g0, 0
64 ; Cannot produce a LOH for multiple users
65 ; CHECK-NOT: MCLOH_AdrpAdd
66 %x10 = ADRP target-flags(aarch64-page) @g0
67 HINT 0, implicit def dead %x10 ; clobbers x10
68 %x11 = ADDXri %x10, target-flags(aarch64-pageoff) @g0, 0
69 %x12 = ADDXri %x10, target-flags(aarch64-pageoff) @g0, 0
72 ; CHECK-NEXT: Adding MCLOH_AdrpLdr:
73 ; CHECK-NEXT: %X5<def> = ADRP <ga:@g2>
74 ; CHECK-NEXT: %S6<def> = LDRSui %X5, <ga:@g2>
75 ; CHECK-NEXT: Adding MCLOH_AdrpLdr:
76 ; CHECK-NEXT: %X4<def> = ADRP <ga:@g2>
77 ; CHECK-NEXT: %X4<def> = LDRXui %X4, <ga:@g2>
78 %x4 = ADRP target-flags(aarch64-page) @g2
79 %x4 = LDRXui %x4, target-flags(aarch64-pageoff) @g2
80 %x5 = ADRP target-flags(aarch64-page) @g2
81 %s6 = LDRSui %x5, target-flags(aarch64-pageoff) @g2
84 ; CHECK-NEXT: Adding MCLOH_AdrpLdrGot:
85 ; CHECK-NEXT: %X5<def> = ADRP <ga:@g2>
86 ; CHECK-NEXT: %X6<def> = LDRXui %X5, <ga:@g2>
87 ; CHECK-NEXT: Adding MCLOH_AdrpLdrGot:
88 ; CHECK-NEXT: %X4<def> = ADRP <ga:@g2>
89 ; CHECK-NEXT: %X4<def> = LDRXui %X4, <ga:@g2>
90 %x4 = ADRP target-flags(aarch64-page, aarch64-got) @g2
91 %x4 = LDRXui %x4, target-flags(aarch64-pageoff, aarch64-got) @g2
92 %x5 = ADRP target-flags(aarch64-page, aarch64-got) @g2
93 %x6 = LDRXui %x5, target-flags(aarch64-pageoff, aarch64-got) @g2
96 ; CHECK-NOT: Adding MCLOH_AdrpLdrGot:
97 ; This sequence makes no sense and should not produce a LdrGot
98 %x11 = ADRP target-flags(aarch64-page, aarch64-got) @g5
99 %s11 = LDRSui %x4, target-flags(aarch64-pageoff, aarch64-got) @g5
102 ; CHECK-NEXT: Adding MCLOH_AdrpAddLdr:
103 ; CHECK-NEXT: %X7<def> = ADRP <ga:@g3>[TF=1]
104 ; CHECK-NEXT: %X8<def> = ADDXri %X7, <ga:@g3>
105 ; CHECK-NEXT: %D1<def> = LDRDui %X8, 8
106 %x7 = ADRP target-flags(aarch64-page) @g3
107 %x8 = ADDXri %x7, target-flags(aarch64-pageoff) @g3, 0
111 ; CHECK-NEXT: Adding MCLOH_AdrpAdd:
112 ; CHECK-NEXT: %X3<def> = ADRP <ga:@g3>
113 ; CHECK-NEXT: %X3<def> = ADDXri %X3, <ga:@g3>
114 ; CHECK-NEXT: Adding MCLOH_AdrpAdd:
115 ; CHECK-NEXT: %X5<def> = ADRP <ga:@g3>
116 ; CHECK-NEXT: %X2<def> = ADDXri %X5, <ga:@g3>
117 ; CHECK-NEXT: Adding MCLOH_AdrpAddStr:
118 ; CHECK-NEXT: %X1<def> = ADRP <ga:@g3>
119 ; CHECK-NEXT: %X1<def> = ADDXri %X1, <ga:@g3>
120 ; CHECK-NEXT: STRXui %X2, %X1, 16
121 %x1 = ADRP target-flags(aarch64-page) @g3
122 %x1 = ADDXri %x1, target-flags(aarch64-pageoff) @g3, 0
125 ; This sequence should just produce an AdrpAdd (not AdrpAddStr)
126 %x5 = ADRP target-flags(aarch64-page) @g3
127 %x2 = ADDXri %x5, target-flags(aarch64-pageoff) @g3, 0
130 ; This sequence should just produce an AdrpAdd (not AdrpAddStr)
131 %x3 = ADRP target-flags(aarch64-page) @g3
132 %x3 = ADDXri %x3, target-flags(aarch64-pageoff) @g3, 0
136 ; CHECK-NEXT: Adding MCLOH_AdrpLdr:
137 ; CHECK-NEXT: %X2<def> = ADRP <ga:@g3>
138 ; CHECK-NEXT: %X2<def> = LDRXui %X2, <ga:@g3>
139 ; CHECK-NEXT: Adding MCLOH_AdrpLdrGotLdr:
140 ; CHECK-NEXT: %X1<def> = ADRP <ga:@g4>
141 ; CHECK-NEXT: %X1<def> = LDRXui %X1, <ga:@g4>
142 ; CHECK-NEXT: %X1<def> = LDRXui %X1, 24
143 %x1 = ADRP target-flags(aarch64-page, aarch64-got) @g4
144 %x1 = LDRXui %x1, target-flags(aarch64-pageoff, aarch64-got) @g4
146 ; Should just produce a MCLOH_AdrpLdr (not MCLOH_AdrpLdrGotLdr)
147 %x2 = ADRP target-flags(aarch64-page) @g3
148 %x2 = LDRXui %x2, target-flags(aarch64-pageoff) @g3
152 ; CHECK-NEXT: Adding MCLOH_AdrpLdr
153 ; CHECK-NEXT: %X5<def> = ADRP <ga:@g1>
154 ; CHECK-NEXT: %X5<def> = LDRXui %X5, <ga:@g1>
155 ; CHECK-NEXT: Adding MCLOH_AdrpLdrGotStr:
156 ; CHECK-NEXT: %X1<def> = ADRP <ga:@g4>
157 ; CHECK-NEXT: %X1<def> = LDRXui %X1, <ga:@g4>
158 ; CHECK-NEXT: STRXui %X4, %X1, 32
159 %x1 = ADRP target-flags(aarch64-page, aarch64-got) @g4
160 %x1 = LDRXui %x1, target-flags(aarch64-pageoff, aarch64-got) @g4
162 ; Should just produce a MCLOH_AdrpLdr (not MCLOH_AdrpLdrGotStr)
163 %x5 = ADRP target-flags(aarch64-page) @g1
164 %x5 = LDRXui %x5, target-flags(aarch64-pageoff) @g1
169 ; Cannot produce a LOH for multiple users
170 ; CHECK-NOT: MCLOH_AdrpAdd
171 %x10 = ADRP target-flags(aarch64-page) @g0
172 HINT 0, implicit def dead %x10 ; clobbers x10
173 %x11 = ADDXri %x10, target-flags(aarch64-pageoff) @g0, 0
178 %x12 = ADDXri %x10, target-flags(aarch64-pageoff) @g0, 0