203 lines · plain
1# RUN: llc -o /dev/null %s -mtriple=aarch64-apple-ios -run-pass=aarch64-collect-loh -debug-only=aarch64-collect-loh 2>&1 | FileCheck %s2# RUN: llc -debugify-and-strip-all-safe -o /dev/null %s -mtriple=aarch64-apple-ios -run-pass=aarch64-collect-loh -debug-only=aarch64-collect-loh 2>&1 | FileCheck %s3# REQUIRES: asserts4--- |5 define void @func0() { ret void }6 7 declare void @extfunc()8 9 @g0 = external global i3210 @g1 = external global i3211 @g2 = external global i3212 @g3 = external global i3213 @g4 = external global i3214 @g5 = external global i3215...16---17# Check various LOH variants. Remember that the algorithms walks the basic18# blocks backwards.19# CHECK-LABEL: ********** AArch64 Collect LOH **********20# CHECK-LABEL: Looking in function func021name: func022tracksRegLiveness: true23body: |24 bb.0:25 ; CHECK: Adding MCLOH_AdrpAdrp:26 ; CHECK-NEXT: $x1 = ADRP target-flags(aarch64-page) @g327 ; CHECK-NEXT: $x1 = ADRP target-flags(aarch64-page) @g428 ; CHECK-NEXT: Adding MCLOH_AdrpAdrp:29 ; CHECK-NEXT: $x1 = ADRP target-flags(aarch64-page) @g230 ; CHECK-NEXT: $x1 = ADRP target-flags(aarch64-page) @g331 ; CHECK-NEXT: Adding MCLOH_AdrpAdrp:32 ; CHECK-NEXT: $x0 = ADRP target-flags(aarch64-page) @g033 ; CHECK-NEXT: $x0 = ADRP target-flags(aarch64-page) @g134 $x0 = ADRP target-flags(aarch64-page) @g035 $x0 = ADRP target-flags(aarch64-page) @g136 $x1 = ADRP target-flags(aarch64-page) @g237 $x1 = ADRP target-flags(aarch64-page) @g338 $x1 = ADRP target-flags(aarch64-page) @g439 40 bb.1:41 ; CHECK-NEXT: Adding MCLOH_AdrpAdd:42 ; CHECK-NEXT: $x20 = ADRP target-flags(aarch64-page) @g043 ; CHECK-NEXT: $x3 = ADDXri $x20, target-flags(aarch64-pageoff) @g044 ; CHECK-NEXT: Adding MCLOH_AdrpAdd:45 ; CHECK-NEXT: $x1 = ADRP target-flags(aarch64-page) @g046 ; CHECK-NEXT: $x1 = ADDXri $x1, target-flags(aarch64-pageoff) @g047 $x1 = ADRP target-flags(aarch64-page) @g048 $x9 = SUBXri undef $x11, 5, 0 ; should not affect MCLOH formation49 $x1 = ADDXri $x1, target-flags(aarch64-pageoff) @g0, 050 $x20 = ADRP target-flags(aarch64-page) @g051 BL @extfunc, csr_aarch64_aapcs ; should not clobber X2052 $x3 = ADDXri $x20, target-flags(aarch64-pageoff) @g0, 053 54 bb.2:55 ; CHECK-NOT: MCLOH_AdrpAdd56 $x9 = ADRP target-flags(aarch64-page) @g057 BL @extfunc, csr_aarch64_aapcs ; clobbers x958 ; Verification requires the use of 'undef' in front of the clobbered $x959 $x9 = ADDXri undef $x9, target-flags(aarch64-pageoff) @g0, 060 61 bb.3:62 ; CHECK-NOT: MCLOH_AdrpAdd63 $x10 = ADRP target-flags(aarch64-page) @g064 HINT 0, implicit def $x10 ; clobbers x1065 $x10 = ADDXri $x10, target-flags(aarch64-pageoff) @g0, 066 67 bb.4:68 ; Cannot produce a LOH for multiple users69 ; CHECK-NOT: MCLOH_AdrpAdd70 $x10 = ADRP target-flags(aarch64-page) @g071 HINT 0, implicit def $x10 ; clobbers x1072 $x11 = ADDXri $x10, target-flags(aarch64-pageoff) @g0, 073 $x12 = ADDXri $x10, target-flags(aarch64-pageoff) @g0, 074 75 bb.5:76 ; CHECK-NEXT: Adding MCLOH_AdrpLdr:77 ; CHECK-NEXT: $x5 = ADRP target-flags(aarch64-page) @g278 ; CHECK-NEXT: $s6 = LDRSui $x5, target-flags(aarch64-pageoff) @g279 ; CHECK-NEXT: Adding MCLOH_AdrpLdr:80 ; CHECK-NEXT: $x4 = ADRP target-flags(aarch64-page) @g281 ; CHECK-NEXT: $x4 = LDRXui $x4, target-flags(aarch64-pageoff) @g282 $x4 = ADRP target-flags(aarch64-page) @g283 $x4 = LDRXui $x4, target-flags(aarch64-pageoff) @g284 $x5 = ADRP target-flags(aarch64-page) @g285 $s6 = LDRSui $x5, target-flags(aarch64-pageoff) @g286 87 bb.6:88 ; CHECK-NEXT: Adding MCLOH_AdrpLdrGot:89 ; CHECK-NEXT: $x5 = ADRP target-flags(aarch64-page, aarch64-got) @g290 ; CHECK-NEXT: $x6 = LDRXui $x5, target-flags(aarch64-pageoff, aarch64-got) @g291 ; CHECK-NEXT: Adding MCLOH_AdrpLdrGot:92 ; CHECK-NEXT: $x4 = ADRP target-flags(aarch64-page, aarch64-got) @g293 ; CHECK-NEXT: $x4 = LDRXui $x4, target-flags(aarch64-pageoff, aarch64-got) @g294 $x4 = ADRP target-flags(aarch64-page, aarch64-got) @g295 $x4 = LDRXui $x4, target-flags(aarch64-pageoff, aarch64-got) @g296 $x5 = ADRP target-flags(aarch64-page, aarch64-got) @g297 $x6 = LDRXui $x5, target-flags(aarch64-pageoff, aarch64-got) @g298 99 bb.7:100 ; CHECK-NOT: Adding MCLOH_AdrpLdrGot:101 ; Loading a float value from a GOT table makes no sense so this should not102 ; produce an LOH.103 $x11 = ADRP target-flags(aarch64-page, aarch64-got) @g5104 $s11 = LDRSui $x11, target-flags(aarch64-pageoff, aarch64-got) @g5105 106 bb.8:107 ; CHECK-NEXT: Adding MCLOH_AdrpAddLdr:108 ; CHECK-NEXT: $x7 = ADRP target-flags(aarch64-page) @g3109 ; CHECK-NEXT: $x8 = ADDXri $x7, target-flags(aarch64-pageoff) @g3110 ; CHECK-NEXT: $d1 = LDRDui $x8, 8111 $x7 = ADRP target-flags(aarch64-page) @g3112 $x8 = ADDXri $x7, target-flags(aarch64-pageoff) @g3, 0113 $d1 = LDRDui $x8, 8114 115 bb.9:116 ; CHECK-NEXT: Adding MCLOH_AdrpAdd:117 ; CHECK-NEXT: $x3 = ADRP target-flags(aarch64-page) @g3118 ; CHECK-NEXT: $x3 = ADDXri $x3, target-flags(aarch64-pageoff) @g3119 ; CHECK-NEXT: Adding MCLOH_AdrpAdd:120 ; CHECK-NEXT: $x5 = ADRP target-flags(aarch64-page) @g3121 ; CHECK-NEXT: $x2 = ADDXri $x5, target-flags(aarch64-pageoff) @g3122 ; CHECK-NEXT: Adding MCLOH_AdrpAddStr:123 ; CHECK-NEXT: $x1 = ADRP target-flags(aarch64-page) @g3124 ; CHECK-NEXT: $x1 = ADDXri $x1, target-flags(aarch64-pageoff) @g3125 ; CHECK-NEXT: STRXui $xzr, $x1, 16126 $x1 = ADRP target-flags(aarch64-page) @g3127 $x1 = ADDXri $x1, target-flags(aarch64-pageoff) @g3, 0128 STRXui $xzr, $x1, 16129 130 ; This sequence should just produce an AdrpAdd (not AdrpAddStr)131 $x5 = ADRP target-flags(aarch64-page) @g3132 $x2 = ADDXri $x5, target-flags(aarch64-pageoff) @g3, 0133 STRXui $x2, undef $x11, 16134 135 ; This sequence should just produce an AdrpAdd (not AdrpAddStr)136 $x3 = ADRP target-flags(aarch64-page) @g3137 $x3 = ADDXri $x3, target-flags(aarch64-pageoff) @g3, 0138 STRXui $x3, $x3, 16139 140 bb.10:141 ; CHECK-NEXT: Adding MCLOH_AdrpLdr:142 ; CHECK-NEXT: $x2 = ADRP target-flags(aarch64-page) @g3143 ; CHECK-NEXT: $x2 = LDRXui $x2, target-flags(aarch64-pageoff) @g3144 ; CHECK-NEXT: Adding MCLOH_AdrpLdrGotLdr:145 ; CHECK-NEXT: $x1 = ADRP target-flags(aarch64-page, aarch64-got) @g4146 ; CHECK-NEXT: $x1 = LDRXui $x1, target-flags(aarch64-pageoff, aarch64-got) @g4147 ; CHECK-NEXT: $x1 = LDRXui $x1, 24148 $x1 = ADRP target-flags(aarch64-page, aarch64-got) @g4149 $x1 = LDRXui $x1, target-flags(aarch64-pageoff, aarch64-got) @g4150 $x1 = LDRXui $x1, 24151 ; Should just produce a MCLOH_AdrpLdr (not MCLOH_AdrpLdrGotLdr)152 $x2 = ADRP target-flags(aarch64-page) @g3153 $x2 = LDRXui $x2, target-flags(aarch64-pageoff) @g3154 $x2 = LDRXui $x2, 24155 156 bb.11:157 ; CHECK-NEXT: Adding MCLOH_AdrpLdr158 ; CHECK-NEXT: $x5 = ADRP target-flags(aarch64-page) @g1159 ; CHECK-NEXT: $x5 = LDRXui $x5, target-flags(aarch64-pageoff) @g1160 ; CHECK-NEXT: Adding MCLOH_AdrpLdrGotStr:161 ; CHECK-NEXT: $x1 = ADRP target-flags(aarch64-page, aarch64-got) @g4162 ; CHECK-NEXT: $x1 = LDRXui $x1, target-flags(aarch64-pageoff, aarch64-got) @g4163 ; CHECK-NEXT: STRXui $xzr, $x1, 32164 $x1 = ADRP target-flags(aarch64-page, aarch64-got) @g4165 $x1 = LDRXui $x1, target-flags(aarch64-pageoff, aarch64-got) @g4166 STRXui $xzr, $x1, 32167 ; Should just produce a MCLOH_AdrpLdr (not MCLOH_AdrpLdrGotStr)168 $x5 = ADRP target-flags(aarch64-page) @g1169 $x5 = LDRXui $x5, target-flags(aarch64-pageoff) @g1170 STRXui undef $x11, $x5, 32171 172 bb.12:173 ; CHECK-NOT: MCLOH_AdrpAdrp174 ; CHECK: Adding MCLOH_AdrpAddLdr175 ; $x9 = ADRP @g4176 ; $x9 = ADDXri $x9, @g4177 ; $x5 = LDRXui $x9, 0178 $x9 = ADRP target-flags(aarch64-page, aarch64-got) @g4179 $x9 = ADDXri $x9, target-flags(aarch64-pageoff, aarch64-got) @g4, 0180 $x5 = LDRXui $x9, 0181 $x9 = ADRP target-flags(aarch64-page, aarch64-got) @g5182 183 bb.13:184 ; Cannot produce a LOH for multiple users185 ; CHECK-NOT: MCLOH_AdrpAdd186 $x10 = ADRP target-flags(aarch64-page) @g0187 $x11 = ADDXri $x10, target-flags(aarch64-pageoff) @g0, 0188 B %bb.14189 190 bb.14:191 liveins: $x10192 $x12 = ADDXri $x10, target-flags(aarch64-pageoff) @g0, 0193 194 bb.15:195 ; Should not produce a LOH when reg is clobbered by bundled regmask196 ; CHECK-NOT: MCLOH_AdrpAdrp197 $x8 = ADRP target-flags(aarch64-page) @g0198 BUNDLE {199 BL @extfunc, csr_aarch64_aapcs200 }201 $x8 = ADRP target-flags(aarch64-page) @g1202...203