brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.2 KiB · 0ad1b55 Raw
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