513 lines · plain
1# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -run-pass si-mode-register %s -o - | FileCheck %s2# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -passes=si-mode-register %s -o - | FileCheck %s3 4---5# check that the mode is changed to rtz from default rtn for interp f166# CHECK-LABEL: name: interp_f16_default7# CHECK-LABEL: bb.0:8# CHECK: S_SETREG_IMM32_B32 3, 21779# CHECK-NEXT: V_INTERP_P1LL_F1610# CHECK: S_SETREG_IMM32_B32 0, 217711# CHECK-NEXT: V_ADD_F16_e3212# CHECK-NOT: S_SETREG_IMM32_B3213 14name: interp_f16_default15 16body: |17 bb.0:18 liveins: $sgpr0, $sgpr1, $sgpr219 $m0 = S_MOV_B32 killed $sgpr220 $vgpr0 = V_MOV_B32_e32 killed $sgpr0, implicit $exec, implicit $exec21 $vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $mode, implicit $m0, implicit $exec22 $vgpr2 = V_MOV_B32_e32 killed $sgpr1, implicit $exec23 $vgpr0 = V_INTERP_P1LL_F16 0, killed $vgpr0, 2, 1, -1, 0, 0, implicit $mode, implicit $m0, implicit $exec24 $vgpr1 = V_INTERP_P2_F16 0, $vgpr2, 2, 1, 0, killed $vgpr1, 0, 0, implicit $mode, implicit $m0, implicit $exec25 $vgpr0 = V_INTERP_P2_F16 0, killed $vgpr2, 2, 1, 0, killed $vgpr0, -1, 0, implicit $mode, implicit $m0, implicit $exec26 $vgpr0 = V_ADD_F16_e32 killed $vgpr1, killed $vgpr0, implicit $mode, implicit $exec27 S_ENDPGM 028...29---30# check that the mode is not changed for interp f16 when the mode is already RTZ31# CHECK-LABEL: name: interp_f16_explicit_rtz32# CHECK-LABEL: bb.0:33# CHECK: S_SETREG_IMM32_B32 3, 217734# CHECK-NEXT: V_MOV_B32_e3235# CHECK: S_SETREG_IMM32_B32 0, 217736# CHECK-NEXT: V_ADD_F16_e3237# CHECK-NOT: S_SETREG_IMM32_B3238 39name: interp_f16_explicit_rtz40 41body: |42 bb.0:43 liveins: $sgpr0, $sgpr1, $sgpr244 $m0 = S_MOV_B32 killed $sgpr245 S_SETREG_IMM32_B32 3, 2177, implicit-def $mode, implicit $mode46 $vgpr0 = V_MOV_B32_e32 killed $sgpr0, implicit $exec, implicit $exec47 $vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $mode, implicit $m0, implicit $exec48 $vgpr2 = V_MOV_B32_e32 killed $sgpr1, implicit $exec49 $vgpr0 = V_INTERP_P1LL_F16 0, killed $vgpr0, 2, 1, -1, 0, 0, implicit $mode, implicit $m0, implicit $exec50 $vgpr1 = V_INTERP_P2_F16 0, $vgpr2, 2, 1, 0, killed $vgpr1, 0, 0, implicit $mode, implicit $m0, implicit $exec51 $vgpr0 = V_INTERP_P2_F16 0, killed $vgpr2, 2, 1, 0, killed $vgpr0, -1, 0, implicit $mode, implicit $m0, implicit $exec52 $vgpr0 = V_ADD_F16_e32 killed $vgpr1, killed $vgpr0, implicit $mode, implicit $exec53 S_ENDPGM 054...55---56# check that explicit RTN mode change is registered57# CHECK-LABEL: name: explicit_rtn58# CHECK-LABEL: bb.0:59# CHECK: S_SETREG_IMM32_B32 3, 217760# CHECK-NEXT: V_INTERP_P1LL_F1661# CHECK: S_SETREG_IMM32_B32 0, 217762# CHECK-NEXT: V_ADD_F16_e3263# CHECK-NOT: S_SETREG_IMM32_B3264 65name: explicit_rtn66 67body: |68 bb.0:69 liveins: $sgpr0, $sgpr1, $sgpr270 $m0 = S_MOV_B32 killed $sgpr271 $vgpr0 = V_MOV_B32_e32 killed $sgpr0, implicit $exec, implicit $exec72 $vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $mode, implicit $m0, implicit $exec73 $vgpr2 = V_MOV_B32_e32 killed $sgpr1, implicit $exec74 $vgpr0 = V_INTERP_P1LL_F16 0, killed $vgpr0, 2, 1, -1, 0, 0, implicit $mode, implicit $m0, implicit $exec75 $vgpr1 = V_INTERP_P2_F16 0, $vgpr2, 2, 1, 0, killed $vgpr1, 0, 0, implicit $mode, implicit $m0, implicit $exec76 $vgpr0 = V_INTERP_P2_F16 0, killed $vgpr2, 2, 1, 0, killed $vgpr0, -1, 0, implicit $mode, implicit $m0, implicit $exec77 S_SETREG_IMM32_B32 0, 2177, implicit-def $mode, implicit $mode78 $vgpr0 = V_ADD_F16_e32 killed $vgpr1, killed $vgpr0, implicit $mode, implicit $exec79 S_ENDPGM 080...81---82# check that the mode is unchanged from RTN for F64 instruction83# CHECK-LABEL: name: rtn_default84# CHECK-LABEL: bb.0:85# CHECK-NOT: S_SETREG_IMM32_B3286# CHECK: V_FRACT_F6487 88name: rtn_default89 90body: |91 bb.0:92 liveins: $vgpr1_vgpr293 $vgpr1_vgpr2 = V_FRACT_F64_e32 killed $vgpr1_vgpr2, implicit $mode, implicit $exec94 S_ENDPGM 095...96---97# check that the mode is changed from RTZ to RTN for F64 instruction98# CHECK-LABEL: name: rtn_from_rtz99# CHECK-LABEL: bb.0:100# CHECK: S_SETREG_IMM32_B32 3, 2177101# CHECK-NEXT: S_SETREG_IMM32_B32 0, 2177102# CHECK-NEXT: V_FRACT_F64103# CHECK-NOT: S_SETREG_IMM32_B32104 105name: rtn_from_rtz106 107body: |108 bb.0:109 liveins: $vgpr1_vgpr2110 S_SETREG_IMM32_B32 3, 2177, implicit-def $mode, implicit $mode111 $vgpr1_vgpr2 = V_FRACT_F64_e32 killed $vgpr1_vgpr2, implicit $mode, implicit $exec112 S_ENDPGM 0113...114---115# CHECK-LABEL: name: rtz_from_rtn116# CHECK-LABEL: bb.1:117# CHECK: S_SETREG_IMM32_B32 3, 2177118# CHECK-NOT: S_SETREG_IMM32_B32119 120name: rtz_from_rtn121 122body: |123 bb.0:124 successors: %bb.1125 liveins: $vgpr1_vgpr2126 $vgpr1_vgpr2 = V_FRACT_F64_e32 killed $vgpr1_vgpr2, implicit $mode, implicit $exec127 S_BRANCH %bb.1128 129 bb.1:130 $vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $mode, implicit $m0, implicit $exec131 S_ENDPGM 0132...133---134# check that the mode is changed from RTZ to RTN for F64 instruction135# and back again for remaining interp instruction136# CHECK-LABEL: name: interp_f16_plus_sqrt_f64137# CHECK-LABEL: bb.0:138# CHECK: S_SETREG_IMM32_B32 3, 2177139# CHECK: V_INTERP_P1LL_F16140# CHECK: V_INTERP_P1LL_F16141# CHECK: V_INTERP_P2_F16142# CHECK: S_SETREG_IMM32_B32 0, 2177143# CHECK: V_FRACT_F64144# CHECK: S_SETREG_IMM32_B32 3, 2177145# CHECK: V_INTERP_P2_F16146 147name: interp_f16_plus_sqrt_f64148 149body: |150 bb.0:151 liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4152 $m0 = S_MOV_B32 killed $sgpr2153 $vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit $exec154 $vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $mode, implicit $m0, implicit $exec155 $vgpr2 = V_MOV_B32_e32 $sgpr1, implicit $exec, implicit $exec156 $vgpr0 = V_INTERP_P1LL_F16 0, killed $vgpr0, 2, 1, -1, 0, 0, implicit $mode, implicit $m0, implicit $exec157 $vgpr1 = V_INTERP_P2_F16 0, $vgpr2, 2, 1, 0, killed $vgpr1, 0, 0, implicit $mode, implicit $m0, implicit $exec158 $vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $mode, implicit $exec159 $vgpr0 = V_INTERP_P2_F16 0, killed $vgpr2, 2, 1, 0, killed $vgpr0, -1, 0, implicit $mode, implicit $m0, implicit $exec160 $vgpr0 = V_ADD_F16_e32 killed $sgpr0, killed $vgpr0, implicit $mode, implicit $exec161 S_ENDPGM 0162...163---164# check that an explicit change to the single precision mode has no effect165# CHECK-LABEL: name: single_precision_mode_change166# CHECK-LABEL: bb.0:167# CHECK: S_SETREG_IMM32_B32 3, 2177168# CHECK: V_INTERP_P1LL_F16169# CHECK: V_INTERP_P1LL_F16170# CHECK: V_INTERP_P2_F16171# CHECK: S_SETREG_IMM32_B32 0, 2177172# CHECK: V_FRACT_F64173# CHECK: S_SETREG_IMM32_B32 3, 2177174# CHECK: V_INTERP_P2_F16175 176name: single_precision_mode_change177 178body: |179 bb.0:180 liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4181 $m0 = S_MOV_B32 killed $sgpr2182 $vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit $exec183 $vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $mode, implicit $m0, implicit $exec184 S_SETREG_IMM32_B32 2, 2049, implicit-def $mode, implicit $mode185 $vgpr2 = V_MOV_B32_e32 $sgpr1, implicit $exec186 $vgpr0 = V_INTERP_P1LL_F16 0, killed $vgpr0, 2, 1, -1, 0, 0, implicit $mode, implicit $m0, implicit $exec187 $vgpr1 = V_INTERP_P2_F16 0, $vgpr2, 2, 1, 0, killed $vgpr1, 0, 0, implicit $mode, implicit $m0, implicit $exec188 $vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $mode, implicit $exec189 $vgpr0 = V_INTERP_P2_F16 0, killed $vgpr2, 2, 1, 0, killed $vgpr0, -1, 0, implicit $mode, implicit $m0, implicit $exec190 $vgpr0 = V_ADD_F16_e32 killed $sgpr0, killed $vgpr0, implicit $mode, implicit $exec191 S_ENDPGM 0192...193---194# check that mode is propagated back to start of loop - first instruction is RTN but needs195# setreg as RTZ is set in loop196# CHECK-LABEL: name: loop197# CHECK-LABEL: bb.1:198# CHECK: S_SETREG_IMM32_B32 0, 2177199# CHECK: V_FRACT_F64200# CHECK-LABEL: bb.2:201# CHECK: S_SETREG_IMM32_B32 3, 2177202# CHECK: V_INTERP_P1LL_F16203# CHECK-NOT: S_SETREG_IMM32_B32204 205name: loop206 207body: |208 bb.0:209 liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4210 successors: %bb.1211 $m0 = S_MOV_B32 killed $sgpr2212 S_BRANCH %bb.1213 214 bb.1:215 successors: %bb.2216 $vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $mode, implicit $exec217 S_BRANCH %bb.2218 219 bb.2:220 successors: %bb.1, %bb.3221 $vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec222 $vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $mode, implicit $m0, implicit $exec223 S_CBRANCH_VCCZ %bb.1, implicit $vcc224 S_BRANCH %bb.3225 226 bb.3:227 S_ENDPGM 0228...229---230# two back-edges to same node with different modes231# CHECK-LABEL: name: double_loop232# CHECK-NOT: S_SETREG_IMM32_B32233# CHECK-LABEL: bb.2:234# CHECK: S_SETREG_IMM32_B32 0, 2177235# CHECK: V_FRACT_F64_e32236# CHECK-LABEL: bb.4:237# CHECK: S_SETREG_IMM32_B32 3, 2177238 239name: double_loop240 241body: |242 bb.0:243 liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4244 successors: %bb.1245 $m0 = S_MOV_B32 killed $sgpr2246 S_BRANCH %bb.1247 248 bb.1:249 successors: %bb.2250 S_NOP 1251 S_BRANCH %bb.2252 253 bb.2:254 successors: %bb.1, %bb.3255 $vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $mode, implicit $exec256 S_CBRANCH_VCCZ %bb.1, implicit $vcc257 S_BRANCH %bb.3258 259 bb.3:260 successors: %bb.4261 S_NOP 1262 S_BRANCH %bb.4263 264 bb.4:265 successors: %bb.5266 S_NOP 1267 S_BRANCH %bb.5268 269 bb.5:270 successors: %bb.1, %bb.6271 S_SETREG_IMM32_B32 3, 2177, implicit-def $mode, implicit $mode272 S_CBRANCH_VCCZ %bb.1, implicit $vcc273 S_BRANCH %bb.6274 275 bb.6:276 S_ENDPGM 0277...278---279# check that mode is propagated back to start of loop and through a block that280# neither sets or uses the mode.281# CHECK-LABEL: name: loop_indirect282# CHECK-NOT: S_SETREG_IMM32_B32283# CHECK-LABEL: bb.3:284# CHECK: S_SETREG_IMM32_B32 3, 2177285# CHECK: V_INTERP_P1LL_F16286# CHECK-NOT: S_SETREG_IMM32_B32287 288name: loop_indirect289 290body: |291 bb.0:292 liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4293 successors: %bb.1294 $m0 = S_MOV_B32 killed $sgpr2295 S_BRANCH %bb.1296 297 bb.1:298 successors: %bb.2299 S_NOP 1300 S_BRANCH %bb.2301 302 bb.2:303 successors: %bb.3304 S_NOP 1305 S_BRANCH %bb.3306 307 bb.3:308 successors: %bb.1, %bb.4309 $vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit $exec310 $vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $mode, implicit $m0, implicit $exec311 S_CBRANCH_VCCZ %bb.1, implicit $vcc312 S_BRANCH %bb.4313 314 bb.4:315 S_ENDPGM 0316...317---318# check that multiple mode values are propagated to a block that uses the mode319# CHECK-LABEL: name: multiple_mode_direct320# CHECK-LABEL: bb.3:321# CHECK: S_SETREG_IMM32_B32 0, 2177322# CHECK: V_FRACT_F64_e32323# CHECK-NOT: S_SETREG_IMM32_B32324 325name: multiple_mode_direct326 327body: |328 bb.0:329 liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4330 successors: %bb.1331 $m0 = S_MOV_B32 killed $sgpr2332 S_BRANCH %bb.1333 334 bb.1:335 successors: %bb.2, %bb.3336 S_CBRANCH_VCCZ %bb.2, implicit $vcc337 S_BRANCH %bb.3338 339 bb.2:340 successors: %bb.3341 S_SETREG_IMM32_B32 3, 2177, implicit-def $mode, implicit $mode342 S_BRANCH %bb.3343 344 bb.3:345 successors: %bb.4346 $vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $mode, implicit $exec347 S_BRANCH %bb.4348 349 bb.4:350 S_ENDPGM 0351...352---353# check that multiple mode values are propagated through a block that neither354# sets or uses the mode.355# CHECK-LABEL: name: multiple_mode_indirect356# CHECK-LABEL: bb.4:357# CHECK: S_SETREG_IMM32_B32 0, 2177358# CHECK: V_FRACT_F64_e32359# CHECK-NOT: S_SETREG_IMM32_B32360 361name: multiple_mode_indirect362 363body: |364 bb.0:365 liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4366 successors: %bb.1367 $m0 = S_MOV_B32 killed $sgpr2368 S_BRANCH %bb.1369 370 bb.1:371 successors: %bb.2, %bb.3372 S_CBRANCH_VCCZ %bb.2, implicit $vcc373 S_BRANCH %bb.3374 375 bb.2:376 successors: %bb.3377 S_SETREG_IMM32_B32 3, 2177, implicit-def $mode, implicit $mode378 S_BRANCH %bb.3379 380 bb.3:381 successors: %bb.4382 S_NOP 1383 S_BRANCH %bb.4384 385 bb.4:386 successors: %bb.5387 $vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $mode, implicit $exec388 S_BRANCH %bb.5389 390 bb.5:391 S_ENDPGM 0392...393---394# CHECK-LABEL: name: pass_through_blocks395# CHECK-LABEL: bb.0:396# CHECK: V_FRACT_F64_e32397# CHECK-NEXT: S_SETREG_IMM32_B32 3, 2177398# CHECK-NOT: S_SETREG_IMM32_B32399 400name: pass_through_blocks401 402body: |403 bb.0:404 successors: %bb.1405 liveins: $vgpr1_vgpr2406 $vgpr1_vgpr2 = V_FRACT_F64_e32 killed $vgpr1_vgpr2, implicit $mode, implicit $exec407 $vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $mode, implicit $m0, implicit $exec408 S_BRANCH %bb.1409 410 bb.1:411 successors: %bb.2412 S_BRANCH %bb.2413 414 bb.2:415 successors: %bb.3416 S_BRANCH %bb.3417 418 bb.3:419 successors: %bb.4420 S_BRANCH %bb.4421 422 bb.4:423 $vgpr1 = V_INTERP_P1LL_F16 0, $vgpr0, 2, 1, 0, 0, 0, implicit $mode, implicit $m0, implicit $exec424 S_ENDPGM 0425...426---427# check that multiple mode values are propagated428# CHECK-LABEL: name: if_then_else429# CHECK-LABEL: bb.3:430# CHECK: S_SETREG_IMM32_B32 0, 2177431# CHECK: V_FRACT_F64_e32432# CHECK-NOT: S_SETREG_IMM32_B32433 434name: if_then_else435 436body: |437 bb.0:438 liveins: $sgpr0, $sgpr1, $sgpr2, $vgpr3, $vgpr4439 successors: %bb.1440 $m0 = S_MOV_B32 killed $sgpr2441 S_BRANCH %bb.1442 443 bb.1:444 successors: %bb.2, %bb.3445 S_CBRANCH_VCCZ %bb.3, implicit $vcc446 S_BRANCH %bb.2447 448 bb.2:449 successors: %bb.3450 S_SETREG_IMM32_B32 3, 2177, implicit-def $mode, implicit $mode451 S_BRANCH %bb.3452 453 bb.3:454 successors: %bb.4455 $vgpr3_vgpr4 = V_FRACT_F64_e32 killed $vgpr3_vgpr4, implicit $mode, implicit $exec456 S_BRANCH %bb.4457 458 bb.4:459 S_ENDPGM 0460...461---462# checks for bug where if a block is its own predecessor it could cause mode tracking463# to produce the wrong mode, resulting in an unnecessary setreg464# CHECK-LABEL: name: single_block_loop465# CHECK-LABEL: bb.0:466# CHECK-NOT: S_SETREG467 468name: single_block_loop469 470body: |471 bb.0:472 successors: %bb.1473 S_BRANCH %bb.1474 475 bb.1:476 successors: %bb.1, %bb.2477 S_CBRANCH_VCCZ %bb.1, implicit $vcc478 S_BRANCH %bb.2479 480 bb.2:481 successors: %bb.3482 liveins: $vgpr1_vgpr2483 $vgpr1_vgpr2 = V_FRACT_F64_e32 killed $vgpr1_vgpr2, implicit $mode, implicit $exec484 S_BRANCH %bb.3485 486 bb.3:487 S_ENDPGM 0488...489---490# checks for a bug where if the first block is its own predecessor the initial mode was491# not correctly propagated, resulting in an unnecessary setreg492# CHECK-LABEL: name: first_block_loop493# CHECK-LABEL: bb.0:494# CHECK-NOT: S_SETREG495 496name: first_block_loop497 498body: |499 bb.0:500 successors: %bb.0, %bb.1501 S_CBRANCH_VCCZ %bb.0, implicit $vcc502 S_BRANCH %bb.1503 504 bb.1:505 successors: %bb.2506 liveins: $vgpr1_vgpr2507 $vgpr1_vgpr2 = V_FRACT_F64_e32 killed $vgpr1_vgpr2, implicit $mode, implicit $exec508 S_BRANCH %bb.2509 510 bb.2:511 S_ENDPGM 0512...513