393 lines · plain
1# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs -run-pass=si-peephole-sdwa -o - %s | FileCheck -check-prefix=GFX9 %s2# RUN: llc -mtriple=amdgcn -mcpu=fiji -verify-machineinstrs -run-pass=si-peephole-sdwa -o - %s | FileCheck -check-prefix=GFX9 %s3# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -passes=si-peephole-sdwa -o - %s | FileCheck -check-prefix=GFX9 %s4# RUN: llc -mtriple=amdgcn -mcpu=fiji -passes=si-peephole-sdwa -o - %s | FileCheck -check-prefix=GFX9 %s5 6# test for 3 consecutive _sdwa's7# GFX9-LABEL: name: test1_add_co_sdwa8# GFX9: = nsw V_ADD_CO_U32_sdwa9# GFX9-NEXT: = nuw V_ADDC_U32_e6410# GFX9: V_ADD_CO_U32_sdwa11# GFX9-NEXT: V_ADDC_U32_e6412# GFX9: V_ADD_CO_U32_sdwa13# GFX9-NEXT: V_ADDC_U32_e6414---15name: test1_add_co_sdwa16tracksRegLiveness: true17registers:18 - { id: 0, class: vgpr_32, preferred-register: '' }19liveins:20 - { reg: '$vgpr0', virtual-reg: '%0' }21 - { reg: '$sgpr0_sgpr1', virtual-reg: '%1' }22body: |23 bb.0:24 liveins: $vgpr0, $sgpr0_sgpr125 26 %1:sgpr_64 = COPY $sgpr0_sgpr127 %0:vgpr_32 = COPY $vgpr028 %22:sreg_32_xm0 = S_MOV_B32 25529 %23:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec30 %30:vreg_64 = COPY $sgpr0_sgpr131 %63:vgpr_32, %65:sreg_64_xexec = nsw V_ADD_CO_U32_e64 %30.sub0, %23, 0, implicit $exec32 %64:vgpr_32, dead %66:sreg_64_xexec = nuw V_ADDC_U32_e64 %30.sub1, %0, killed %65, 0, implicit $exec33 %62:vreg_64 = REG_SEQUENCE %63, %subreg.sub0, %64, %subreg.sub134 GLOBAL_STORE_DWORDX2_SADDR %30.sub0, %62, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))35 36 %161:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec37 %163:vgpr_32, %165:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %161, 0, implicit $exec38 %164:vgpr_32, dead %166:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, killed %165, 0, implicit $exec39 %162:vreg_64 = REG_SEQUENCE %163, %subreg.sub0, %164, %subreg.sub140 GLOBAL_STORE_DWORDX2_SADDR %30.sub0, %162, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))41 42 %171:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec43 %173:vgpr_32, %175:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %171, 0, implicit $exec44 %174:vgpr_32, dead %176:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, killed %175, 0, implicit $exec45 %172:vreg_64 = REG_SEQUENCE %173, %subreg.sub0, %174, %subreg.sub146 GLOBAL_STORE_DWORDX2_SADDR %30.sub0, %172, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))47 48...49 50# test for VCC interference on sdwa, should generate 1 xform only51# GFX9-LABEL: name: test2_add_co_sdwa52# GFX9: V_ADD_CO_U32_sdwa53# GFX9: V_ADDC_U32_e6454# GFX9-NOT: V_ADD_CO_U32_sdwa55# GFX9-NOT: V_ADDC_U32_e3256---57name: test2_add_co_sdwa58tracksRegLiveness: true59registers:60 - { id: 0, class: vgpr_32, preferred-register: '' }61liveins:62 - { reg: '$vgpr0', virtual-reg: '%0' }63 - { reg: '$sgpr0_sgpr1', virtual-reg: '%1' }64body: |65 bb.0:66 liveins: $vgpr0, $sgpr0_sgpr167 68 %1:sgpr_64 = COPY $sgpr0_sgpr169 %0:vgpr_32 = COPY $vgpr070 %22:sreg_32_xm0 = S_MOV_B32 25571 %23:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec72 %30:vreg_64 = COPY $sgpr0_sgpr173 %63:vgpr_32, %65:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %23, 0, implicit $exec74 75 %161:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec76 %163:vgpr_32, %165:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %161, 0, implicit $exec77 %164:vgpr_32, dead %166:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, killed %165, 0, implicit $exec78 %162:vreg_64 = REG_SEQUENCE %163, %subreg.sub0, %164, %subreg.sub179 80 %64:vgpr_32, dead %66:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, killed %65, 0, implicit $exec81 %62:vreg_64 = REG_SEQUENCE %63, %subreg.sub0, %64, %subreg.sub182 GLOBAL_STORE_DWORDX2_SADDR %30.sub0, %62, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))83 84 %161:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec85 %163:vgpr_32, %165:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %161, 0, implicit $exec86 %164:vgpr_32, dead %166:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, killed %165, 0, implicit $exec87 %162:vreg_64 = REG_SEQUENCE %163, %subreg.sub0, %164, %subreg.sub188 GLOBAL_STORE_DWORDX2_SADDR %30.sub0, %162, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))89 90...91 92# test for CarryOut used, should reject93# GFX9-LABEL: name: test3_add_co_sdwa94# GFX9: V_ADD_CO_U32_e6495# GFX9: V_ADDC_U32_e6496# GFX9-NOT: V_ADD_CO_U32_sdwa97# GFX9-NOT: V_ADDC_U32_e3298---99name: test3_add_co_sdwa100tracksRegLiveness: true101registers:102 - { id: 0, class: vgpr_32, preferred-register: '' }103liveins:104 - { reg: '$vgpr0', virtual-reg: '%0' }105 - { reg: '$sgpr0_sgpr1', virtual-reg: '%1' }106body: |107 bb.0:108 liveins: $vgpr0, $sgpr0_sgpr1109 110 %1:sgpr_64 = COPY $sgpr0_sgpr1111 %0:vgpr_32 = COPY $vgpr0112 %22:sreg_32_xm0 = S_MOV_B32 255113 %23:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec114 %30:vreg_64 = COPY $sgpr0_sgpr1115 %63:vgpr_32, %65:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %23, 0, implicit $exec116 %64:vgpr_32, %66:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, killed %65, 0, implicit $exec117 %62:vreg_64 = REG_SEQUENCE %63, %subreg.sub0, %66, %subreg.sub1118 GLOBAL_STORE_DWORDX2_SADDR %30.sub0, %62, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))119 120...121 122# test for CarryIn used more than once, should reject123# GFX9-LABEL: name: test4_add_co_sdwa124# GFX9: V_ADD_CO_U32_e64125# GFX9: V_ADDC_U32_e64126# GFX9-NOT: V_ADD_CO_U32_sdwa127# GFX9-NOT: V_ADDC_U32_e32128---129name: test4_add_co_sdwa130tracksRegLiveness: true131registers:132 - { id: 0, class: vgpr_32, preferred-register: '' }133liveins:134 - { reg: '$vgpr0', virtual-reg: '%0' }135 - { reg: '$sgpr0_sgpr1', virtual-reg: '%1' }136body: |137 bb.0:138 liveins: $vgpr0, $sgpr0_sgpr1139 140 %1:sgpr_64 = COPY $sgpr0_sgpr1141 %0:vgpr_32 = COPY $vgpr0142 %22:sreg_32_xm0 = S_MOV_B32 255143 %23:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec144 %30:vreg_64 = COPY $sgpr0_sgpr1145 %63:vgpr_32, %65:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %23, 0, implicit $exec146 %64:vgpr_32, %66:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, %65, 0, implicit $exec147 %62:vreg_64 = REG_SEQUENCE %63, %subreg.sub0, %65, %subreg.sub1148 GLOBAL_STORE_DWORDX2_SADDR %30.sub0, %62, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))149 150 151...152 153# test for simple example, should generate sdwa154# GFX9-LABEL: name: test5_add_co_sdwa155# GFX9: V_ADD_CO_U32_sdwa156# GFX9: V_ADDC_U32_e64157---158name: test5_add_co_sdwa159tracksRegLiveness: true160registers:161 - { id: 0, class: vgpr_32, preferred-register: '' }162liveins:163 - { reg: '$vgpr0', virtual-reg: '%0' }164 - { reg: '$sgpr0_sgpr1', virtual-reg: '%1' }165body: |166 bb.0:167 liveins: $vgpr0, $sgpr0_sgpr1168 169 %1:sgpr_64 = COPY $sgpr0_sgpr1170 %0:vgpr_32 = COPY $vgpr0171 %22:sreg_32_xm0 = S_MOV_B32 255172 %23:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec173 %30:vreg_64 = COPY $sgpr0_sgpr1174 %63:vgpr_32, %65:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %23, 0, implicit $exec175 %64:vgpr_32, %66:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, %65, 0, implicit $exec176 %62:vreg_64 = REG_SEQUENCE %63, %subreg.sub0, %64, %subreg.sub1177 GLOBAL_STORE_DWORDX2_SADDR %30.sub0, %62, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))178 179 180...181 182# test for V_ADD_CO_U32_e64 only, should reject183# GFX9-LABEL: name: test6_add_co_sdwa184# GFX9: V_ADD_CO_U32_e64185# GFX9-NOT: V_ADD_CO_U32_sdwa186# GFX9-NOT: V_ADDC_U32_e32187---188name: test6_add_co_sdwa189tracksRegLiveness: true190registers:191 - { id: 0, class: vgpr_32, preferred-register: '' }192liveins:193 - { reg: '$vgpr0', virtual-reg: '%0' }194 - { reg: '$sgpr0_sgpr1', virtual-reg: '%1' }195body: |196 bb.0:197 liveins: $vgpr0, $sgpr0_sgpr1198 199 %1:sgpr_64 = COPY $sgpr0_sgpr1200 %0:vgpr_32 = COPY $vgpr0201 %22:sreg_32_xm0 = S_MOV_B32 255202 %23:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec203 %30:vreg_64 = COPY $sgpr0_sgpr1204 %63:vgpr_32, %65:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %23, 0, implicit $exec205 %62:vreg_64 = REG_SEQUENCE %63, %subreg.sub0, %23, %subreg.sub1206 GLOBAL_STORE_DWORDX2_SADDR %30.sub0, %62, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))207 208 209...210 211# test for V_ADDC_U32_e64 only, should reject212# GFX9-LABEL: name: test7_add_co_sdwa213# GFX9: V_ADDC_U32_e64214# GFX9-NOT: V_ADD_CO_U32_sdwa215# GFX9-NOT: V_ADDC_U32_e32216---217name: test7_add_co_sdwa218tracksRegLiveness: true219registers:220 - { id: 0, class: vgpr_32, preferred-register: '' }221liveins:222 - { reg: '$vgpr0', virtual-reg: '%0' }223 - { reg: '$sgpr0_sgpr1', virtual-reg: '%1' }224body: |225 bb.0:226 liveins: $vgpr0, $sgpr0_sgpr1227 228 %1:sgpr_64 = COPY $sgpr0_sgpr1229 %0:vgpr_32 = COPY $vgpr0230 %22:sreg_32_xm0 = S_MOV_B32 255231 %23:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec232 %24:sreg_64_xexec = COPY $sgpr0_sgpr1233 234 %30:vreg_64 = COPY $sgpr0_sgpr1235 %64:vgpr_32, %66:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, %24, 0, implicit $exec236 %62:vreg_64 = REG_SEQUENCE %23, %subreg.sub0, %23, %subreg.sub1237 GLOBAL_STORE_DWORDX2_SADDR %30.sub0, %62, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))238 239 240...241 242# test for $vcc defined between two adds, should not generate243# GFX9-LABEL: name: test8_add_co_sdwa244# GFX9-NOT: V_ADD_CO_U32_sdwa245# GFX9: V_ADDC_U32_e64246---247name: test8_add_co_sdwa248tracksRegLiveness: true249registers:250 - { id: 0, class: vgpr_32, preferred-register: '' }251liveins:252 - { reg: '$vgpr0', virtual-reg: '%0' }253 - { reg: '$sgpr0_sgpr1', virtual-reg: '%1' }254body: |255 bb.0:256 liveins: $vgpr0, $sgpr0_sgpr1257 258 %1:sgpr_64 = COPY $sgpr0_sgpr1259 %0:vgpr_32 = COPY $vgpr0260 %22:sreg_32_xm0 = S_MOV_B32 255261 %23:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec262 %30:vreg_64 = COPY $sgpr0_sgpr1263 %63:vgpr_32, %65:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %23, 0, implicit $exec264 $vcc = COPY %30265 %64:vgpr_32, %66:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, %65, 0, implicit $exec266 %31:vreg_64 = COPY $vcc267 %62:vreg_64 = REG_SEQUENCE %63, %subreg.sub0, %64, %subreg.sub1268 GLOBAL_STORE_DWORDX2_SADDR %31.sub0, %62, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))269 270 271...272 273# test for non dead $vcc, should not generate274# GFX9-LABEL: name: test9_add_co_sdwa275# GFX9-NOT: V_ADD_CO_U32_sdwa276# GFX9: V_ADDC_U32_e64277---278name: test9_add_co_sdwa279tracksRegLiveness: true280registers:281 - { id: 0, class: vgpr_32, preferred-register: '' }282liveins:283 - { reg: '$vgpr0', virtual-reg: '%0' }284 - { reg: '$sgpr0_sgpr1', virtual-reg: '%1' }285body: |286 bb.0:287 liveins: $vgpr0, $sgpr0_sgpr1288 289 %1:sgpr_64 = COPY $sgpr0_sgpr1290 %0:vgpr_32 = COPY $vgpr0291 %22:sreg_32_xm0 = S_MOV_B32 255292 %30:vreg_64 = COPY $sgpr0_sgpr1293 $vcc = COPY %30294 %23:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec295 %63:vgpr_32, %65:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %23, 0, implicit $exec296 %64:vgpr_32, %66:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, %65, 0, implicit $exec297 %31:vreg_64 = COPY $vcc298 %62:vreg_64 = REG_SEQUENCE %63, %subreg.sub0, %64, %subreg.sub1299 GLOBAL_STORE_DWORDX2_SADDR %31.sub0, %62, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))300 301 302...303 304# test for def $vcc_lo, should not generate305# GFX9-LABEL: name: test10_add_co_sdwa306# GFX9-NOT: V_ADD_CO_U32_sdwa307# GFX9: V_ADDC_U32_e64308---309name: test10_add_co_sdwa310tracksRegLiveness: true311registers:312 - { id: 0, class: vgpr_32, preferred-register: '' }313liveins:314 - { reg: '$vgpr0', virtual-reg: '%0' }315 - { reg: '$sgpr0_sgpr1', virtual-reg: '%1' }316body: |317 bb.0:318 liveins: $vgpr0, $sgpr0_sgpr1319 320 %1:sgpr_64 = COPY $sgpr0_sgpr1321 %0:vgpr_32 = COPY $vgpr0322 %22:sreg_32_xm0 = S_MOV_B32 255323 %30:vreg_64 = COPY $sgpr0_sgpr1324 $vcc_lo = COPY %30.sub0325 %23:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec326 %63:vgpr_32, %65:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %23, 0, implicit $exec327 %31:vgpr_32 = COPY $vcc_lo328 %32:vreg_64 = REG_SEQUENCE %31, %subreg.sub0, %23, %subreg.sub1329 %64:vgpr_32, %66:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, %65, 0, implicit $exec330 %62:vreg_64 = REG_SEQUENCE %63, %subreg.sub0, %64, %subreg.sub1331 GLOBAL_STORE_DWORDX2_SADDR %32.sub0, %62, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))332 333...334 335# test for read $vcc_hi, should not generate336# GFX9-LABEL: name: test11_add_co_sdwa337# GFX9-NOT: V_ADD_CO_U32_sdwa338# GFX9: V_ADDC_U32_e64339---340name: test11_add_co_sdwa341tracksRegLiveness: true342registers:343 - { id: 0, class: vgpr_32, preferred-register: '' }344liveins:345 - { reg: '$vgpr0', virtual-reg: '%0' }346 - { reg: '$sgpr0_sgpr1', virtual-reg: '%1' }347body: |348 bb.0:349 liveins: $vgpr0, $sgpr0_sgpr1350 351 %1:sgpr_64 = COPY $sgpr0_sgpr1352 %0:vgpr_32 = COPY $vgpr0353 %22:sreg_32_xm0 = S_MOV_B32 255354 %30:vreg_64 = COPY $sgpr0_sgpr1355 $vcc_hi = COPY %30.sub0356 %23:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec357 %63:vgpr_32, %65:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %23, 0, implicit $exec358 %31:vgpr_32 = COPY $vcc_hi359 %32:vreg_64 = REG_SEQUENCE %31, %subreg.sub0, %23, %subreg.sub1360 %64:vgpr_32, %66:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, %65, 0, implicit $exec361 %62:vreg_64 = REG_SEQUENCE %63, %subreg.sub0, %64, %subreg.sub1362 GLOBAL_STORE_DWORDX2_SADDR %32.sub0, %62, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))363 364...365 366# test for $vcc defined and used between adds, should not generate367# GFX9-LABEL: name: test12_add_co_sdwa368# GFX9-NOT: V_ADD_CO_U32_sdwa369# GFX9: V_ADDC_U32_e64370---371name: test12_add_co_sdwa372tracksRegLiveness: true373registers:374 - { id: 0, class: vgpr_32, preferred-register: '' }375liveins:376 - { reg: '$vgpr0', virtual-reg: '%0' }377 - { reg: '$sgpr0_sgpr1', virtual-reg: '%1' }378body: |379 bb.0:380 liveins: $vgpr0, $sgpr0_sgpr1381 382 %1:sgpr_64 = COPY $sgpr0_sgpr1383 %0:vgpr_32 = COPY $vgpr0384 %22:sreg_32_xm0 = S_MOV_B32 255385 %30:vreg_64 = COPY $sgpr0_sgpr1386 %23:vgpr_32 = V_AND_B32_e32 %22, %0, implicit $exec387 %63:vgpr_32, %65:sreg_64_xexec = V_ADD_CO_U32_e64 %30.sub0, %23, 0, implicit $exec388 $vcc = COPY %30389 %31:vreg_64 = COPY killed $vcc390 %64:vgpr_32, %66:sreg_64_xexec = V_ADDC_U32_e64 %30.sub1, %0, %65, 0, implicit $exec391 %62:vreg_64 = REG_SEQUENCE %63, %subreg.sub0, %64, %subreg.sub1392 GLOBAL_STORE_DWORDX2_SADDR %31.sub0, %62, %1, 0, 0, implicit $exec, implicit $exec :: (store (s64))393