1# RUN: llc -ppc-asm-full-reg-names -mtriple=powerpc64le-unknown-linux-gnu \ 2# RUN: -run-pass=ppc-ctrloops %s -o - -verify-machineinstrs | FileCheck %s 3# RUN: llc -ppc-asm-full-reg-names -mtriple=powerpc64-ibm-aix-xcoff \ 4# RUN: -run-pass=ppc-ctrloops %s -o - -verify-machineinstrs | FileCheck %s 5 6--- 7name: test_success1 8# CHECK: test_success1 9 10tracksRegLiveness: true 11body: | 12 bb.0.entry: 13 14 %0:g8rc = LI8 2048 15 ; CHECK: MTCTR8loop 16 ; CHECK: BDNZ8 17 ; CHECK-NOT: ADDI8 18 ; CHECK-NOT: CMPLDI 19 ; CHECK-NOT: BC 20 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 21 22 bb.1: 23 24 %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 25 BC killed %1:crbitrc, %bb.1 26 B %bb.2 27 28 bb.2: 29 30 BLR8 implicit $lr8, implicit $rm 31... 32--- 33name: test_fail_clobber 34# CHECK: test_fail_clobber 35tracksRegLiveness: true 36body: | 37 bb.0.entry: 38 39 %0:g8rc = LI8 2048 40 ; CHECK-NOT: MTCTR8loop 41 ; CHECK-NOT: BDNZ8 42 ; CHECK: ADDI8 43 ; CHECK: CMPLDI 44 ; CHECK: BC 45 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 46 47 bb.1: 48 49 INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def early-clobber $ctr8 50 %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 51 BC killed %1:crbitrc, %bb.1 52 B %bb.2 53 54 bb.2: 55 56 BLR8 implicit $lr8, implicit $rm 57... 58--- 59name: test_fail_use_in_loop 60# CHECK: test_fail_use_in_loop 61tracksRegLiveness: true 62body: | 63 bb.0.entry: 64 65 %0:g8rc = LI8 2048 66 ; CHECK-NOT: MTCTR8loop 67 ; CHECK-NOT: BDNZ8 68 ; CHECK: ADDI8 69 ; CHECK: CMPLDI 70 ; CHECK: BC 71 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 72 73 bb.1: 74 75 %1:g8rc = MFCTR8 implicit $ctr8 76 %2:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 77 BC killed %2:crbitrc, %bb.1 78 B %bb.2 79 80 bb.2: 81 82 BLR8 implicit $lr8, implicit $rm 83... 84--- 85name: test_fail_call_in_preheader_after_mtctr 86# CHECK: test_fail_call_in_preheader_after_mtctr 87tracksRegLiveness: true 88body: | 89 bb.0.entry: 90 91 %0:g8rc = LI8 2048 92 ; CHECK-NOT: MTCTR8 93 ; CHECK-NOT: BDNZ8 94 ; CHECK: ADDI8 95 ; CHECK: CMPLDI 96 ; CHECK: BC 97 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 98 BL8 @test_fail_use_in_loop, csr_ppc64, implicit-def dead $lr8, implicit $rm 99 100 bb.1: 101 102 %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 103 BC killed %1:crbitrc, %bb.1 104 B %bb.2 105 106 bb.2: 107 108 BLR8 implicit $lr8, implicit $rm 109... 110--- 111name: test_succ_call_in_preheader_before_mtctr 112# CHECK: test_succ_call_in_preheader_before_mtctr 113tracksRegLiveness: true 114body: | 115 bb.0.entry: 116 117 %0:g8rc = LI8 2048 118 BL8 @test_fail_use_in_loop, csr_ppc64, implicit-def dead $lr8, implicit $rm 119 ; CHECK: MTCTR8 120 ; CHECK: BDNZ8 121 ; CHECK-NOT: ADDI8 122 ; CHECK-NOT: CMPLDI 123 ; CHECK-NOT: BC 124 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 125 126 bb.1: 127 128 %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 129 BC killed %1:crbitrc, %bb.1 130 B %bb.2 131 132 bb.2: 133 134 BLR8 implicit $lr8, implicit $rm 135... 136--- 137name: test_fail_call_in_loop 138# CHECK: test_fail_call_in_loop 139tracksRegLiveness: true 140body: | 141 bb.0.entry: 142 143 %0:g8rc = LI8 2048 144 ; CHECK-NOT: MTCTR8 145 ; CHECK-NOT: BDNZ8 146 ; CHECK: ADDI8 147 ; CHECK: CMPLDI 148 ; CHECK: BC 149 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 150 151 bb.1: 152 153 BL8 @test_fail_use_in_loop, csr_ppc64, implicit-def dead $lr8, implicit $rm 154 %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 155 BC killed %1:crbitrc, %bb.1 156 B %bb.2 157 158 bb.2: 159 160 BLR8 implicit $lr8, implicit $rm 161... 162--- 163name: test_fail_indirect_call_in_loop 164# CHECK: test_fail_indirect_call_in_loop 165tracksRegLiveness: true 166body: | 167 bb.0.entry: 168 liveins: $x3, $x4 169 170 %0:g8rc = LI8 2048 171 ; CHECK-NOT: MTCTR8 172 ; CHECK-NOT: BDNZ8 173 ; CHECK: ADDI8 174 ; CHECK: CMPLDI 175 ; CHECK: BC 176 renamable %1:crrc = CMPLD killed renamable $x3, killed renamable $x4 177 renamable %2:crbitrc = COPY %1.sub_gt 178 MTLR8 %0:g8rc, implicit-def $lr8 179 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 180 181 bb.1: 182 183 BCLRL renamable %2, implicit $lr, implicit $rm 184 %3:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 185 BC killed %3:crbitrc, %bb.1 186 B %bb.2 187 188 bb.2: 189 190 BLR8 implicit $lr8, implicit $rm 191... 192--- 193name: test_fail_livein_preheader 194# CHECK: test_fail_livein_preheader 195tracksRegLiveness: true 196body: | 197 bb.0.entry: 198 liveins: $ctr8 199 200 %0:g8rc = LI8 2048 201 ; CHECK-NOT: MTCTR8loop 202 ; CHECK-NOT: BDNZ8 203 ; CHECK: ADDI8 204 ; CHECK: CMPLDI 205 ; CHECK: BC 206 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 207 208 bb.1: 209 210 %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 211 BC killed %1:crbitrc, %bb.1 212 B %bb.2 213 214 bb.2: 215 216 BLR8 implicit $lr8, implicit $rm 217... 218--- 219name: test_fail_def_preheader 220# CHECK: test_fail_def_preheader 221tracksRegLiveness: true 222body: | 223 bb.0.entry: 224 225 INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def early-clobber $ctr8 226 %0:g8rc = LI8 2048 227 ; CHECK-NOT: MTCTR8loop 228 ; CHECK-NOT: BDNZ8 229 ; CHECK: ADDI8 230 ; CHECK: CMPLDI 231 ; CHECK: BC 232 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 233 234 bb.1: 235 236 %1:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 237 BC killed %1:crbitrc, %bb.1 238 B %bb.2 239 240 bb.2: 241 242 BLR8 implicit $lr8, implicit $rm 243... 244--- 245name: test_success_only_use_preheader 246# CHECK: test_success_only_use_preheader 247tracksRegLiveness: true 248body: | 249 bb.0.entry: 250 251 %0:g8rc = MFCTR8 implicit $ctr8 252 %1:g8rc = LI8 2048 253 ; CHECK: MTCTR8loop 254 ; CHECK: BDNZ8 255 ; CHECK-NOT: ADDI8 256 ; CHECK-NOT: CMPLDI 257 ; CHECK-NOT: BC 258 MTCTR8loop killed %1:g8rc, implicit-def dead $ctr8 259 260 bb.1: 261 262 %2:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 263 BC killed %2:crbitrc, %bb.1 264 B %bb.2 265 266 bb.2: 267 268 BLR8 implicit $lr8, implicit $rm 269... 270--- 271name: test_fail_use_after_mtctr 272# CHECK: test_fail_use_after_mtctr 273tracksRegLiveness: true 274body: | 275 bb.0.entry: 276 277 %0:g8rc = LI8 2048 278 ; CHECK-NOT: MTCTR8loop 279 ; CHECK-NOT: BDNZ8 280 ; CHECK: ADDI8 281 ; CHECK: CMPLDI 282 ; CHECK: BC 283 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 284 %1:g8rc = MFCTR8 implicit $ctr8 285 286 bb.1: 287 288 %2:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 289 BC killed %2:crbitrc, %bb.1 290 B %bb.2 291 292 bb.2: 293 294 BLR8 implicit $lr8, implicit $rm 295... 296--- 297name: test_fail_def_after_mtctr 298# CHECK: test_fail_def_after_mtctr 299tracksRegLiveness: true 300body: | 301 bb.0.entry: 302 303 %0:g8rc = LI8 2048 304 ; CHECK-NOT: MTCTR8loop 305 ; CHECK-NOT: BDNZ8 306 ; CHECK: ADDI8 307 ; CHECK: CMPLDI 308 ; CHECK: BC 309 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 310 INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def early-clobber $ctr8 311 312 bb.1: 313 314 %2:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 315 BC killed %2:crbitrc, %bb.1 316 B %bb.2 317 318 bb.2: 319 320 BLR8 implicit $lr8, implicit $rm 321... 322--- 323name: test_success_def_after_loop 324# CHECK: test_success_def_after_loop 325tracksRegLiveness: true 326body: | 327 bb.0.entry: 328 329 %0:g8rc = LI8 2048 330 ; CHECK: MTCTR8loop 331 ; CHECK: BDNZ8 332 ; CHECK-NOT: ADDI8 333 ; CHECK-NOT: CMPLDI 334 ; CHECK-NOT: BC 335 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 336 337 bb.1: 338 339 %2:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 340 BC killed %2:crbitrc, %bb.1 341 B %bb.2 342 343 bb.2: 344 INLINEASM &"", 1 /* sideeffect attdialect */, 12 /* clobber */, implicit-def early-clobber $ctr8 345 346 BLR8 implicit $lr8, implicit $rm 347... 348--- 349name: test_fail_dead_def_in_preheader 350# CHECK: test_fail_dead_def_in_preheader 351tracksRegLiveness: true 352body: | 353 bb.0.entry: 354 355 %0:g8rc = LI8 2048 356 %1:g8rc = LI8 1024 357 MTCTR8loop killed %0:g8rc, implicit-def dead $ctr8 358 MTCTR8 killed %1:g8rc, implicit-def dead $ctr8 359 ; CHECK-NOT: MTCTR8loop 360 ; CHECK-NOT: BDNZ8 361 ; CHECK: ADDI8 362 ; CHECK: CMPLDI 363 ; CHECK: BC 364 365 bb.1: 366 367 %2:crbitrc = DecreaseCTR8loop 1, implicit-def dead $ctr8, implicit $ctr8 368 BC killed %2:crbitrc, %bb.1 369 B %bb.2 370 371 bb.2: 372 373 BLR8 implicit $lr8, implicit $rm 374... 375