390 lines · plain
1# RUN: llc -mtriple=amdgcn -run-pass si-fold-operands -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s2 3# GCN-LABEL: name: fold-imm-readfirstlane{{$}}4# GCN: %1:sreg_32_xm0 = S_MOV_B32 1235---6name: fold-imm-readfirstlane7tracksRegLiveness: true8body: |9 bb.0:10 %0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec11 %1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec12 S_NOP 0, implicit %113...14 15# GCN-LABEL: name: fold-imm-readfirstlane-dbgvalue{{$}}16# GCN: %1:sreg_32_xm0 = S_MOV_B32 12317# GCN: DBG_VALUE %0:vgpr_32, 0, 018---19name: fold-imm-readfirstlane-dbgvalue20tracksRegLiveness: true21body: |22 bb.0:23 %0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec24 %1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec25 DBG_VALUE %0, 0, 026 S_NOP 0, implicit %127...28 29# GCN-LABEL: name: fold-imm-readfirstlane-readfirstlane{{$}}30# GCN: %3:sreg_32_xm0 = S_MOV_B32 12331 32---33name: fold-imm-readfirstlane-readfirstlane34tracksRegLiveness: true35body: |36 bb.0:37 %0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec38 %1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec39 %2:vgpr_32 = COPY %140 %3:sreg_32_xm0 = V_READFIRSTLANE_B32 %2, implicit $exec41 S_NOP 0, implicit %342...43 44 45# GCN-LABEL: name: fold-copy-readfirstlane{{$}}46# GCN: %0:sreg_32_xm0 = COPY $sgpr1047# GCN: %2:sreg_32_xm0 = COPY %048---49name: fold-copy-readfirstlane50tracksRegLiveness: true51body: |52 bb.0:53 liveins: $sgpr1054 %0:sreg_32_xm0 = COPY $sgpr1055 %1:vgpr_32 = COPY %056 %2:sreg_32_xm0 = V_READFIRSTLANE_B32 %1, implicit $exec57 S_NOP 0, implicit %258...59 60# GCN-LABEL: name: no-fold-copy-readfirstlane-physreg0{{$}}61# GCN: %0:vgpr_32 = COPY $sgpr1062# GCN-NEXT: %1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec63---64name: no-fold-copy-readfirstlane-physreg065tracksRegLiveness: true66body: |67 bb.0:68 liveins: $sgpr1069 %0:vgpr_32 = COPY $sgpr1070 %1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec71 72...73 74# GCN-LABEL: name: no-fold-copy-readfirstlane-physreg1{{$}}75# GCN: $vgpr0 = COPY $sgpr1076# GCN-NEXT: %0:sreg_32_xm0 = V_READFIRSTLANE_B32 $vgpr0, implicit $exec77---78name: no-fold-copy-readfirstlane-physreg179tracksRegLiveness: true80body: |81 bb.0:82 liveins: $sgpr1083 $vgpr0 = COPY $sgpr1084 %0:sreg_32_xm0 = V_READFIRSTLANE_B32 $vgpr0, implicit $exec85 86...87 88# GCN-LABEL: name: no-fold-imm-readfirstlane-physreg{{$}}89# GCN: $vgpr0 = V_MOV_B32_e32 123, implicit $exec90# GCN-NEXT: V_READFIRSTLANE_B32 $vgpr0, implicit $exec91 92---93name: no-fold-imm-readfirstlane-physreg94tracksRegLiveness: true95body: |96 bb.0:97 $vgpr0 = V_MOV_B32_e32 123, implicit $exec98 %0:sreg_32_xm0 = V_READFIRSTLANE_B32 $vgpr0, implicit $exec99...100 101# TODO: This could be folded, if the search for exec modifications was102# smarter.103 104# GCN-LABEL: name: fold-imm-readfirstlane-cross-block{{$}}105# GCN: V_MOV_B32106# GCN: V_READFIRSTLANE_B32107---108name: fold-imm-readfirstlane-cross-block109tracksRegLiveness: true110body: |111 bb.0:112 %0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec113 114 bb.1:115 %1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec116...117 118# TODO: This could be folded, if the search for exec modifications was119# smarter.120 121# GCN-LABEL: name: fold-copy-readfirstlane-cross-block{{$}}122# GCN: V_MOV_B32123# GCN: V_READFIRSTLANE_B32124---125name: fold-copy-readfirstlane-cross-block126tracksRegLiveness: true127body: |128 bb.0:129 liveins: $sgpr12130 %0:sreg_32_xm0 = COPY $sgpr12131 %1:vgpr_32 = V_MOV_B32_e32 %0, implicit $exec132 133 bb.1:134 %2:sreg_32_xm0 = V_READFIRSTLANE_B32 %1, implicit $exec135...136 137# GCN-LABEL: name: fold-copy-readfirstlane-cross-block-exec-def{{$}}138# GCN: V_MOV_B32139# GCN: $exec = S_MOV_B64_term140# GCN: V_READFIRSTLANE_B32141---142name: fold-copy-readfirstlane-cross-block-exec-def143tracksRegLiveness: true144body: |145 bb.0:146 liveins: $sgpr10_sgpr11, $sgpr12147 %0:sreg_32_xm0 = COPY $sgpr12148 %1:vgpr_32 = V_MOV_B32_e32 %0, implicit $exec149 $exec = S_MOV_B64_term $sgpr10_sgpr11150 151 bb.1:152 %2:sreg_32_xm0 = V_READFIRSTLANE_B32 %1, implicit $exec153...154 155# GCN-LABEL: name: fold-copy-readfirstlane-same-block-exec-def{{$}}156# GCN: COPY157# GCN-NEXT: %1:vgpr_32 = COPY %0158# GCN-NEXT: $exec = S_MOV_B64159# GCN-NEXT: V_READFIRSTLANE_B32160---161name: fold-copy-readfirstlane-same-block-exec-def162tracksRegLiveness: true163body: |164 bb.0:165 liveins: $sgpr10_sgpr11, $sgpr12166 %0:sreg_32_xm0 = COPY $sgpr12167 %1:vgpr_32 = COPY %0, implicit $exec168 $exec = S_MOV_B64 $sgpr10_sgpr11169 %2:sreg_32_xm0 = V_READFIRSTLANE_B32 %1, implicit $exec170 171...172 173# GCN-LABEL: name: fold-imm-readfirstlane-cross-block-exec-def{{$}}174# GCN: V_MOV_B32175# GCN: $exec = S_MOV_B64176# GCN: V_READFIRSTLANE_B32177 178---179name: fold-imm-readfirstlane-cross-block-exec-def180tracksRegLiveness: true181body: |182 bb.0:183 liveins: $sgpr10_sgpr11, $sgpr12_sgpr13184 %0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec185 $exec = S_MOV_B64_term $sgpr10_sgpr11186 187 bb.1:188 %1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec189...190 191# GCN-LABEL: name: fold-imm-readfirstlane-same-block-exec-def{{$}}192# GCN: V_MOV_B32193# GCN-NEXT: $exec = S_MOV_B64194# GCN-NEXT: V_READFIRSTLANE_B32195---196name: fold-imm-readfirstlane-same-block-exec-def197tracksRegLiveness: true198body: |199 bb.0:200 liveins: $sgpr10_sgpr11201 %0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec202 $exec = S_MOV_B64 $sgpr10_sgpr11203 %1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec204 205...206 207# GCN-LABEL: name: fold-sgpr-copy-readfirstlane-same-block-exec-def{{$}}208# GCN: COPY209# GCN-NEXT: $exec = S_MOV_B64210# GCN-NEXT: V_READFIRSTLANE_B32211---212name: fold-sgpr-copy-readfirstlane-same-block-exec-def213tracksRegLiveness: true214body: |215 bb.0:216 liveins: $sgpr10_sgpr11, $sgpr12217 %0:vgpr_32 = COPY $sgpr12218 $exec = S_MOV_B64 $sgpr10_sgpr11219 %1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec220...221 222# GCN-LABEL: name: fold-imm-readfirstlane-user{{$}}223# GCN: %3:sreg_32_xm0 = S_MOV_B32 123224---225name: fold-imm-readfirstlane-user226tracksRegLiveness: true227body: |228 bb.0:229 liveins: $vgpr0, $sgpr0_sgpr1230 %0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec231 %1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec232 %2:sreg_32_xm0 = COPY %1233 %3:sreg_32_xm0 = COPY %2234 S_ENDPGM 0, implicit %3235...236 237# GCN-LABEL: name: fold-imm-readlane{{$}}238# GCN: %1:sreg_32_xm0 = S_MOV_B32 123239---240name: fold-imm-readlane241tracksRegLiveness: true242body: |243 bb.0:244 liveins: $vgpr0, $sgpr0_sgpr1245 %0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec246 %1:sreg_32_xm0 = V_READLANE_B32 %0, 0, implicit $exec247 S_NOP 0, implicit %1248...249 250# GCN-LABEL: name: fold-imm-readlane-src1{{$}}251# GCN: %0:vgpr_32 = COPY $vgpr0252# GCN: V_READLANE_B32 %0, 12, implicit $exec253---254name: fold-imm-readlane-src1255tracksRegLiveness: true256body: |257 bb.0:258 liveins: $vgpr0259 %0:vgpr_32 = COPY $vgpr0260 %1:sreg_32_xm0 = S_MOV_B32 12261 %2:sreg_32_xm0 = V_READLANE_B32 %0, %1, implicit $exec262...263 264# Constant for subreg0265# GCN-LABEL: name: fold-imm-readfirstlane-regsequence0{{$}}266 267# GCN: %0:vgpr_32 = COPY $vgpr0268# GCN-NEXT: %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec269# GCN-NEXT: %2:vreg_64 = REG_SEQUENCE %0, %subreg.sub0, killed %1, %subreg.sub1270# GCN-NEXT: %3:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub0, implicit $exec271# GCN-NEXT: %4:sreg_32_xm0 = S_MOV_B32 0272---273name: fold-imm-readfirstlane-regsequence0274tracksRegLiveness: true275body: |276 bb.0:277 liveins: $vgpr0278 %0:vgpr_32 = COPY $vgpr0279 %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec280 %2:vreg_64 = REG_SEQUENCE %0:vgpr_32, %subreg.sub0, killed %1:vgpr_32, %subreg.sub1281 %3:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub0:vreg_64, implicit $exec282 %4:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub1:vreg_64, implicit $exec283 S_NOP 0, implicit %3, implicit %4284...285 286# Constant for subreg1287# GCN-LABEL: name: fold-imm-readfirstlane-regsequence1{{$}}288# GCN: %0:vgpr_32 = COPY $vgpr0289# GCN-NEXT: %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec290# GCN-NEXT: %2:vreg_64 = REG_SEQUENCE %1, %subreg.sub0, killed %0, %subreg.sub1291# GCN-NEXT: %3:sreg_32_xm0 = S_MOV_B32 0292# GCN-NEXT: %4:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub1, implicit $exec293 294---295name: fold-imm-readfirstlane-regsequence1296tracksRegLiveness: true297body: |298 bb.0:299 liveins: $vgpr0300 %0:vgpr_32 = COPY $vgpr0301 %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec302 %2:vreg_64 = REG_SEQUENCE %1:vgpr_32, %subreg.sub0, killed %0:vgpr_32, %subreg.sub1303 %3:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub0:vreg_64, implicit $exec304 %4:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub1:vreg_64, implicit $exec305 S_NOP 0, implicit %3, implicit %4306...307 308# Different constant regs for each subreg309# GCN-LABEL: name: fold-imm-readfirstlane-regsequence2{{$}}310# GCN: %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec311# GCN-NEXT: %1:vgpr_32 = V_MOV_B32_e32 1, implicit $exec312# GCN-NEXT: %2:vreg_64 = REG_SEQUENCE %0, %subreg.sub0, killed %1, %subreg.sub1313# GCN-NEXT: %3:sreg_32_xm0 = S_MOV_B32 0314# GCN-NEXT: %4:sreg_32_xm0 = S_MOV_B32 1315---316name: fold-imm-readfirstlane-regsequence2317tracksRegLiveness: true318body: |319 bb.0:320 %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec321 %1:vgpr_32 = V_MOV_B32_e32 1, implicit $exec322 %2:vreg_64 = REG_SEQUENCE %0:vgpr_32, %subreg.sub0, killed %1:vgpr_32, %subreg.sub1323 %3:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub0:vreg_64, implicit $exec324 %4:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub1:vreg_64, implicit $exec325 S_NOP 0, implicit %3, implicit %4326...327 328# Same constant reg for each subreg, so there are multiple constant uses329# GCN-LABEL: name: fold-imm-readfirstlane-regsequence3{{$}}330# GCN: %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec331# GCN-NEXT: %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec332# GCN-NEXT: %2:vreg_64 = REG_SEQUENCE %0, %subreg.sub0, killed %1, %subreg.sub1333# GCN-NEXT: %3:sreg_32_xm0 = S_MOV_B32 0334# GCN-NEXT: %4:sreg_32_xm0 = S_MOV_B32 0335---336name: fold-imm-readfirstlane-regsequence3337tracksRegLiveness: true338body: |339 bb.0:340 %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec341 %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec342 %2:vreg_64 = REG_SEQUENCE %0:vgpr_32, %subreg.sub0, killed %1:vgpr_32, %subreg.sub1343 %3:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub0:vreg_64, implicit $exec344 %4:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub1:vreg_64, implicit $exec345 S_NOP 0, implicit %3, implicit %4346...347 348# FIXME: This should fold349# GCN-LABEL: name: fold-copy-readfirstlane-regsequence0{{$}}350# GCN: %0:vgpr_32 = COPY $sgpr10351# GCN-NEXT: %1:vgpr_32 = COPY $sgpr11352# GCN-NEXT: %2:vreg_64 = REG_SEQUENCE %0, %subreg.sub0, killed %1, %subreg.sub1353# GCN-NEXT: %3:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub0, implicit $exec354# GCN-NEXT: %4:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub1, implicit $exec355---356name: fold-copy-readfirstlane-regsequence0357tracksRegLiveness: true358body: |359 bb.0:360 liveins: $sgpr10, $sgpr11361 %0:vgpr_32 = COPY $sgpr10362 %1:vgpr_32 = COPY $sgpr11363 %2:vreg_64 = REG_SEQUENCE %0:vgpr_32, %subreg.sub0, killed %1:vgpr_32, %subreg.sub1364 %3:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub0:vreg_64, implicit $exec365 %4:sreg_32_xm0 = V_READFIRSTLANE_B32 %2.sub1:vreg_64, implicit $exec366...367 368# GCN-LABEL: name: fold-copy-readfirstlane-regsequence1{{$}}369# GCN: %0:sreg_32_xm0 = COPY $sgpr10370# GCN-NEXT: %1:sreg_32_xm0 = COPY $sgpr11371# GCN-NEXT: %2:vgpr_32 = COPY %0372# GCN-NEXT: %3:vgpr_32 = COPY %1373# GCN-NEXT: %4:vreg_64 = REG_SEQUENCE %2, %subreg.sub0, killed %3, %subreg.sub1374# GCN-NEXT: %5:sreg_32_xm0 = V_READFIRSTLANE_B32 %4.sub0, implicit $exec375# GCN-NEXT: %6:sreg_32_xm0 = V_READFIRSTLANE_B32 %4.sub1, implicit $exec376---377name: fold-copy-readfirstlane-regsequence1378tracksRegLiveness: true379body: |380 bb.0:381 liveins: $sgpr10, $sgpr11382 %0:sreg_32_xm0 = COPY $sgpr10383 %1:sreg_32_xm0 = COPY $sgpr11384 %2:vgpr_32 = COPY %0385 %3:vgpr_32 = COPY %1386 %4:vreg_64 = REG_SEQUENCE %2:vgpr_32, %subreg.sub0, killed %3:vgpr_32, %subreg.sub1387 %5:sreg_32_xm0 = V_READFIRSTLANE_B32 %4.sub0:vreg_64, implicit $exec388 %6:sreg_32_xm0 = V_READFIRSTLANE_B32 %4.sub1:vreg_64, implicit $exec389...390