1# RUN: llc -mtriple=amdgcn--amdhsa -mcpu=gfx900 -verify-machineinstrs -run-pass si-fold-operands,dead-mi-elimination -o - %s | FileCheck -enable-var-scope -check-prefix=GCN %s 2... 3 4# GCN-LABEL: name: s_fold_and_imm_regimm_32{{$}} 5# GCN: %10:vgpr_32 = V_MOV_B32_e32 1543, implicit $exec 6# GCN: BUFFER_STORE_DWORD_OFFSET killed %10, 7name: s_fold_and_imm_regimm_32 8tracksRegLiveness: true 9liveins: 10 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 11frameInfo: 12 isFrameAddressTaken: false 13 isReturnAddressTaken: false 14 hasStackMap: false 15 hasPatchPoint: false 16 stackSize: 0 17 offsetAdjustment: 0 18 maxAlignment: 0 19 adjustsStack: false 20 hasCalls: false 21 maxCallFrameSize: 0 22 hasOpaqueSPAdjustment: false 23 hasVAStart: false 24 hasMustTailInVarArgFunc: false 25body: | 26 bb.0: 27 liveins: $sgpr0_sgpr1 28 29 %0:sgpr_64 = COPY $sgpr0_sgpr1 30 %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 31 %2:sreg_32_xm0 = COPY %1.sub1 32 %3:sreg_32_xm0 = COPY %1.sub0 33 %4:sreg_32_xm0 = S_MOV_B32 61440 34 %5:sreg_32_xm0 = S_MOV_B32 -1 35 %6:sgpr_128 = REG_SEQUENCE killed %2, %subreg.hi16, killed %3, %subreg.lo16, killed %4, %subreg.sub0, killed %5, %subreg.sub0_sub1 36 %7:sreg_32_xm0 = S_MOV_B32 1234567 37 %8:sreg_32_xm0 = S_MOV_B32 9999 38 %9:sreg_32_xm0 = S_AND_B32 killed %7, killed %8, implicit-def dead $scc 39 %10:vgpr_32 = COPY %9 40 BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec 41 S_ENDPGM 0 42 43... 44--- 45 46# GCN-LABEL: name: v_fold_and_imm_regimm_32{{$}} 47 48# GCN: [[VAL0:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 646, implicit $exec 49# GCN: FLAT_STORE_DWORD %10, [[VAL0]], 50 51# GCN: [[VAL1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 646, implicit $exec 52# GCN: FLAT_STORE_DWORD %10, [[VAL1]], 53 54# GCN: [[VAL2:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 646, implicit $exec 55# GCN: FLAT_STORE_DWORD %10, [[VAL2]], 56 57# GCN: [[VAL3:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1234567, implicit $exec 58# GCN: FLAT_STORE_DWORD %10, [[VAL3]], 59 60# GCN: [[VAL4:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 63, implicit $exec 61# GCN: FLAT_STORE_DWORD %10, [[VAL4]], 62 63name: v_fold_and_imm_regimm_32 64tracksRegLiveness: true 65liveins: 66 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 67 - { reg: '$vgpr0', virtual-reg: '%3' } 68body: | 69 bb.0: 70 liveins: $sgpr0_sgpr1, $vgpr0 71 72 %3:vgpr_32 = COPY $vgpr0 73 %0:sgpr_64 = COPY $sgpr0_sgpr1 74 %4:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 75 %13:vgpr_32 = V_ASHRREV_I32_e64 31, %3, implicit $exec 76 %14:vreg_64 = REG_SEQUENCE %3, %subreg.hi16, %13, %subreg.lo16 77 %15:vreg_64 = V_LSHLREV_B64_e64 2, killed %14, implicit $exec 78 %5:sreg_32_xm0 = COPY %4.sub1 79 %20:vgpr_32 = V_ADD_CO_U32_e32 %4.sub0, %15.sub0, implicit-def $vcc, implicit $exec 80 %18:vgpr_32 = COPY killed %5 81 %17:vgpr_32 = V_ADDC_U32_e32 %15.sub1, %18, implicit-def $vcc, implicit $vcc, implicit $exec 82 %19:vreg_64 = REG_SEQUENCE %20, %subreg.hi16, killed %17, %subreg.lo16 83 %6:vgpr_32 = V_MOV_B32_e32 982, implicit $exec 84 %8:sreg_32_xm0 = S_MOV_B32 1234567 85 %16:vgpr_32 = V_MOV_B32_e32 63, implicit $exec 86 87 %9:vgpr_32 = V_AND_B32_e64 %8, %6, implicit $exec 88 FLAT_STORE_DWORD %19, %9, 0, 0, implicit $exec, implicit $flat_scr 89 90 %10:vgpr_32 = V_AND_B32_e64 %6, %8, implicit $exec 91 FLAT_STORE_DWORD %19, %10, 0, 0, implicit $exec, implicit $flat_scr 92 93 %11:vgpr_32 = V_AND_B32_e32 %8, %6, implicit $exec 94 FLAT_STORE_DWORD %19, %11, 0, 0, implicit $exec, implicit $flat_scr 95 96 %12:vgpr_32 = V_AND_B32_e64 %8, %8, implicit $exec 97 FLAT_STORE_DWORD %19, %12, 0, 0, implicit $exec, implicit $flat_scr 98 99 %13:vgpr_32 = V_AND_B32_e64 %16, %16, implicit $exec 100 FLAT_STORE_DWORD %19, %13, 0, 0, implicit $exec, implicit $flat_scr 101 102 S_ENDPGM 0 103 104... 105--- 106 107# GCN-LABEL: name: s_fold_shl_imm_regimm_32{{$}} 108# GCN: [[VAL:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 4096, implicit $exec 109# GCN: BUFFER_STORE_DWORD_OFFSET killed [[VAL]], 110 111name: s_fold_shl_imm_regimm_32 112tracksRegLiveness: true 113liveins: 114 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 115body: | 116 bb.0: 117 liveins: $sgpr0_sgpr1 118 119 %0:sgpr_64 = COPY $sgpr0_sgpr1 120 %4:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 121 %5:sreg_32_xm0_xexec = S_MOV_B32 1 122 %6:sreg_32_xm0 = COPY %4.sub1 123 %7:sreg_32_xm0 = COPY %4.sub0 124 %8:sreg_32_xm0 = S_MOV_B32 61440 125 %9:sreg_32_xm0 = S_MOV_B32 -1 126 %10:sgpr_128 = REG_SEQUENCE killed %7, %subreg.hi16, killed %6, %subreg.lo16, killed %9, %subreg.sub0, killed %8, %subreg.sub0_sub1 127 %12:sreg_32_xm0 = S_LSHL_B32 killed %5, 12, implicit-def dead $scc 128 %13:vgpr_32 = COPY %12 129 BUFFER_STORE_DWORD_OFFSET killed %13, killed %10, 0, 0, 0, 0, 0, implicit $exec 130 S_ENDPGM 0 131 132... 133--- 134 135# GCN-LABEL: name: s_fold_ashr_imm_regimm_32{{$}} 136# GCN: [[VAL:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 243, implicit $exec 137# GCN: BUFFER_STORE_DWORD_OFFSET killed [[VAL]], killed %7, 138name: s_fold_ashr_imm_regimm_32 139tracksRegLiveness: true 140liveins: 141 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 142body: | 143 bb.0: 144 liveins: $sgpr0_sgpr1 145 146 %0:sgpr_64 = COPY $sgpr0_sgpr1 147 %2:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 148 %3:sreg_32_xm0_xexec = S_MOV_B32 999123 149 %4:sreg_32_xm0 = COPY %2.sub1 150 %5:sreg_32_xm0 = COPY %2.sub0 151 %6:sreg_32_xm0 = S_MOV_B32 61440 152 %7:sreg_32_xm0 = S_MOV_B32 -1 153 %8:sgpr_128 = REG_SEQUENCE killed %5, %subreg.hi16, killed %4, %subreg.lo16, killed %7, %subreg.sub0, killed %6, %subreg.sub0_sub1 154 %10:sreg_32_xm0 = S_ASHR_I32 killed %3, 12, implicit-def dead $scc 155 %11:vgpr_32 = COPY %10 156 BUFFER_STORE_DWORD_OFFSET killed %11, killed %8, 0, 0, 0, 0, 0, implicit $exec 157 S_ENDPGM 0 158 159... 160 161# GCN-LABEL: name: v_fold_ashr_imm_regimm_32{{$}} 162# GCN: [[VAL0:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 3903258, implicit $exec 163# GCN: FLAT_STORE_DWORD %10, [[VAL0]], 164 165# GCN: [[VAL1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 62452139, implicit $exec 166# GCN: FLAT_STORE_DWORD %10, [[VAL1]], 167 168# GCN: [[VAL2:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1678031, implicit $exec 169# GCN: FLAT_STORE_DWORD %10, [[VAL2]], 170 171# GCN: [[VAL3:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 3, implicit $exec 172# GCN: FLAT_STORE_DWORD %10, [[VAL3]], 173 174# GCN: [[VAL4:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 -1, implicit $exec 175# GCN: FLAT_STORE_DWORD %10, [[VAL4]], 176 177# GCN: [[VAL5:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 62500, implicit $exec 178# GCN: FLAT_STORE_DWORD %10, [[VAL5]], 179 180# GCN: [[VAL6:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 500000, implicit $exec 181# GCN: FLAT_STORE_DWORD %10, [[VAL6]], 182 183# GCN: [[VAL7:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1920, implicit $exec 184# GCN: FLAT_STORE_DWORD %10, [[VAL7]], 185 186# GCN: [[VAL8:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 487907, implicit $exec 187# GCN: FLAT_STORE_DWORD %10, [[VAL8]], 188 189# GCN: [[VAL9:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 -1, implicit $exec 190# GCN: FLAT_STORE_DWORD %10, [[VAL9]], 191 192name: v_fold_ashr_imm_regimm_32 193tracksRegLiveness: true 194liveins: 195 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 196 - { reg: '$vgpr0', virtual-reg: '%2' } 197body: | 198 bb.0: 199 liveins: $sgpr0_sgpr1, $vgpr0 200 201 %2:vgpr_32 = COPY $vgpr0 202 %0:sgpr_64 = COPY $sgpr0_sgpr1 203 %3:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 204 %15:vgpr_32 = V_ASHRREV_I32_e64 31, %2, implicit $exec 205 %16:vreg_64 = REG_SEQUENCE %2, %subreg.hi16, %15, %subreg.lo16 206 %17:vreg_64 = V_LSHLREV_B64_e64 2, killed %16, implicit $exec 207 %9:sreg_32_xm0 = COPY %3.sub1 208 %21:vgpr_32 = V_ADD_CO_U32_e32 %3.sub0, %17.sub0, implicit-def $vcc, implicit $exec 209 %19:vgpr_32 = COPY killed %9 210 %18:vgpr_32 = V_ADDC_U32_e32 %17.sub1, %19, implicit-def $vcc, implicit $vcc, implicit $exec 211 %20:vreg_64 = REG_SEQUENCE %21, %subreg.hi16, killed %18, %subreg.lo16 212 %10:vgpr_32 = V_MOV_B32_e32 999234234, implicit $exec 213 %24:vgpr_32 = V_MOV_B32_e32 3871, implicit $exec 214 %6:vgpr_32 = V_MOV_B32_e32 1000000, implicit $exec 215 %7:sreg_32_xm0 = S_MOV_B32 13424252 216 %8:sreg_32_xm0 = S_MOV_B32 4 217 %27:sreg_32_xm0 = S_MOV_B32 -4 218 %29:sreg_32_xm0 = S_MOV_B32 1 219 %30:sreg_32_xm0 = S_MOV_B32 3841 220 %31:vgpr_32 = V_MOV_B32_e32 3841, implicit $exec 221 %32:vgpr_32 = V_MOV_B32_e32 2, implicit $exec 222 223 %11:vgpr_32 = V_ASHRREV_I32_e64 8, %10, implicit $exec 224 FLAT_STORE_DWORD %20, %11, 0, 0, implicit $exec, implicit $flat_scr 225 226 %12:vgpr_32 = V_ASHRREV_I32_e64 %8, %10, implicit $exec 227 FLAT_STORE_DWORD %20, %12, 0, 0, implicit $exec, implicit $flat_scr 228 229 %13:vgpr_32 = V_ASHR_I32_e64 %7, 3, implicit $exec 230 FLAT_STORE_DWORD %20, %13, 0, 0, implicit $exec, implicit $flat_scr 231 232 %14:vgpr_32 = V_ASHR_I32_e64 7, %29, implicit $exec 233 FLAT_STORE_DWORD %20, %14, 0, 0, implicit $exec, implicit $flat_scr 234 235 %15:vgpr_32 = V_ASHR_I32_e64 %27, %24, implicit $exec 236 FLAT_STORE_DWORD %20, %15, 0, 0, implicit $exec, implicit $flat_scr 237 238 %22:vgpr_32 = V_ASHR_I32_e64 %6, 4, implicit $exec 239 FLAT_STORE_DWORD %20, %22, 0, 0, implicit $exec, implicit $flat_scr 240 241 %23:vgpr_32 = V_ASHR_I32_e64 %6, %30, implicit $exec 242 FLAT_STORE_DWORD %20, %23, 0, 0, implicit $exec, implicit $flat_scr 243 244 %25:vgpr_32 = V_ASHR_I32_e32 %31, %31, implicit $exec 245 FLAT_STORE_DWORD %20, %25, 0, 0, implicit $exec, implicit $flat_scr 246 247 %26:vgpr_32 = V_ASHRREV_I32_e32 11, %10, implicit $exec 248 FLAT_STORE_DWORD %20, %26, 0, 0, implicit $exec, implicit $flat_scr 249 250 %28:vgpr_32 = V_ASHR_I32_e32 %27, %32, implicit $exec 251 FLAT_STORE_DWORD %20, %28, 0, 0, implicit $exec, implicit $flat_scr 252 253 S_ENDPGM 0 254 255... 256--- 257 258# GCN-LABEL: name: s_fold_lshr_imm_regimm_32{{$}} 259# GCN: [[VAL:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1048332, implicit $exec 260# GCN: BUFFER_STORE_DWORD_OFFSET killed [[VAL]], killed %7, 261name: s_fold_lshr_imm_regimm_32 262tracksRegLiveness: true 263liveins: 264 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 265body: | 266 bb.0: 267 liveins: $sgpr0_sgpr1 268 269 %0:sgpr_64 = COPY $sgpr0_sgpr1 270 %2:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 271 %3:sreg_32_xm0_xexec = S_MOV_B32 -999123 272 %4:sreg_32_xm0 = COPY %2.sub1 273 %5:sreg_32_xm0 = COPY %2.sub0 274 %6:sreg_32_xm0 = S_MOV_B32 61440 275 %7:sreg_32_xm0 = S_MOV_B32 -1 276 %8:sgpr_128 = REG_SEQUENCE killed %5, %subreg.hi16, killed %4, %subreg.lo16, killed %7, %subreg.sub0, killed %6, %subreg.sub0_sub1 277 %10:sreg_32_xm0 = S_LSHR_B32 killed %3, 12, implicit-def dead $scc 278 %11:vgpr_32 = COPY %10 279 BUFFER_STORE_DWORD_OFFSET killed %11, killed %8, 0, 0, 0, 0, 0, implicit $exec 280 S_ENDPGM 0 281 282... 283--- 284 285# GCN-LABEL: name: v_fold_lshr_imm_regimm_32{{$}} 286# GCN: [[VAL0:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 3903258, implicit $exec 287# GCN: FLAT_STORE_DWORD %10, [[VAL0]], 288 289# GCN: [[VAL1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 62452139, implicit $exec 290# GCN: FLAT_STORE_DWORD %10, [[VAL1]], 291 292# GCN: [[VAL2:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1678031, implicit $exec 293# GCN: FLAT_STORE_DWORD %10, [[VAL2]], 294 295# GCN: [[VAL3:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 3, implicit $exec 296# GCN: FLAT_STORE_DWORD %10, [[VAL3]], 297 298# GCN: [[VAL4:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1, implicit $exec 299# GCN: FLAT_STORE_DWORD %10, [[VAL4]], 300 301# GCN: [[VAL5:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 62500, implicit $exec 302# GCN: FLAT_STORE_DWORD %10, [[VAL5]], 303 304# GCN: [[VAL6:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 500000, implicit $exec 305# GCN: FLAT_STORE_DWORD %10, [[VAL6]], 306 307# GCN: [[VAL7:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1920, implicit $exec 308# GCN: FLAT_STORE_DWORD %10, [[VAL7]], 309 310# GCN: [[VAL8:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 487907, implicit $exec 311# GCN: FLAT_STORE_DWORD %10, [[VAL8]], 312 313# GCN: [[VAL9:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1073741823, implicit $exec 314# GCN: FLAT_STORE_DWORD %10, [[VAL9]], 315 316name: v_fold_lshr_imm_regimm_32 317tracksRegLiveness: true 318liveins: 319 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 320 - { reg: '$vgpr0', virtual-reg: '%2' } 321body: | 322 bb.0: 323 liveins: $sgpr0_sgpr1, $vgpr0 324 325 %2:vgpr_32 = COPY $vgpr0 326 %0:sgpr_64 = COPY $sgpr0_sgpr1 327 %3:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 328 %15:vgpr_32 = V_ASHRREV_I32_e64 31, %2, implicit $exec 329 %16:vreg_64 = REG_SEQUENCE %2, %subreg.hi16, %15, %subreg.lo16 330 %17:vreg_64 = V_LSHLREV_B64_e64 2, killed %16, implicit $exec 331 %9:sreg_32_xm0 = COPY %3.sub1 332 %21:vgpr_32 = V_ADD_CO_U32_e32 %3.sub0, %17.sub0, implicit-def $vcc, implicit $exec 333 %19:vgpr_32 = COPY killed %9 334 %18:vgpr_32 = V_ADDC_U32_e32 %17.sub1, %19, implicit-def $vcc, implicit $vcc, implicit $exec 335 %20:vreg_64 = REG_SEQUENCE %21, %subreg.hi16, killed %18, %subreg.lo16 336 %10:vgpr_32 = V_MOV_B32_e32 999234234, implicit $exec 337 %24:vgpr_32 = V_MOV_B32_e32 3871, implicit $exec 338 %6:vgpr_32 = V_MOV_B32_e32 1000000, implicit $exec 339 %7:sreg_32_xm0 = S_MOV_B32 13424252 340 %8:sreg_32_xm0 = S_MOV_B32 4 341 %27:sreg_32_xm0 = S_MOV_B32 -4 342 %29:sreg_32_xm0 = S_MOV_B32 1 343 %30:sreg_32_xm0 = S_MOV_B32 3841 344 %31:vgpr_32 = V_MOV_B32_e32 3841, implicit $exec 345 %32:vgpr_32 = V_MOV_B32_e32 2, implicit $exec 346 347 %11:vgpr_32 = V_LSHRREV_B32_e64 8, %10, implicit $exec 348 FLAT_STORE_DWORD %20, %11, 0, 0, implicit $exec, implicit $flat_scr 349 350 %12:vgpr_32 = V_LSHRREV_B32_e64 %8, %10, implicit $exec 351 FLAT_STORE_DWORD %20, %12, 0, 0, implicit $exec, implicit $flat_scr 352 353 %13:vgpr_32 = V_LSHR_B32_e64 %7, 3, implicit $exec 354 FLAT_STORE_DWORD %20, %13, 0, 0, implicit $exec, implicit $flat_scr 355 356 %14:vgpr_32 = V_LSHR_B32_e64 7, %29, implicit $exec 357 FLAT_STORE_DWORD %20, %14, 0, 0, implicit $exec, implicit $flat_scr 358 359 %15:vgpr_32 = V_LSHR_B32_e64 %27, %24, implicit $exec 360 FLAT_STORE_DWORD %20, %15, 0, 0, implicit $exec, implicit $flat_scr 361 362 %22:vgpr_32 = V_LSHR_B32_e64 %6, 4, implicit $exec 363 FLAT_STORE_DWORD %20, %22, 0, 0, implicit $exec, implicit $flat_scr 364 365 %23:vgpr_32 = V_LSHR_B32_e64 %6, %30, implicit $exec 366 FLAT_STORE_DWORD %20, %23, 0, 0, implicit $exec, implicit $flat_scr 367 368 %25:vgpr_32 = V_LSHR_B32_e32 %31, %31, implicit $exec 369 FLAT_STORE_DWORD %20, %25, 0, 0, implicit $exec, implicit $flat_scr 370 371 %26:vgpr_32 = V_LSHRREV_B32_e32 11, %10, implicit $exec 372 FLAT_STORE_DWORD %20, %26, 0, 0, implicit $exec, implicit $flat_scr 373 374 %28:vgpr_32 = V_LSHR_B32_e32 %27, %32, implicit $exec 375 FLAT_STORE_DWORD %20, %28, 0, 0, implicit $exec, implicit $flat_scr 376 S_ENDPGM 0 377 378... 379--- 380# There is only an undef use operand for %1, so there is no 381# corresponding defining instruction 382 383# GCN-LABEL: name: undefined_vreg_operand{{$}} 384# GCN: bb.0 385# GCN-NEXT: FLAT_STORE_DWORD undef %3:vreg_64, undef %2:vgpr_32, 386# GCN-NEXT: S_ENDPGM 0 387name: undefined_vreg_operand 388tracksRegLiveness: true 389body: | 390 bb.0: 391 %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec 392 %2:vgpr_32 = V_XOR_B32_e64 killed %0, undef %1:vgpr_32, implicit $exec 393 FLAT_STORE_DWORD undef %3:vreg_64, %2, 0, 0, implicit $exec, implicit $flat_scr 394 S_ENDPGM 0 395 396... 397--- 398# Make sure there is no crash if one of the operands is a physical register 399# GCN-LABEL: name: constant_fold_physreg_op{{$}} 400# GCN: %3:sreg_64 = S_AND_B64 $exec, 0, implicit-def dead $scc 401 402name: constant_fold_physreg_op 403tracksRegLiveness: true 404body: | 405 bb.0: 406 successors: %bb.1, %bb.3 407 liveins: $vgpr0, $sgpr4_sgpr5 408 409 %19:sreg_64 = IMPLICIT_DEF 410 %0:sreg_64 = SI_IF killed %19, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 411 S_BRANCH %bb.1 412 413 bb.1: 414 %6:sreg_64 = S_MOV_B64 0 415 %7:sreg_64 = S_AND_B64 $exec, killed %6, implicit-def dead $scc 416 $vcc = COPY %7 417 418 bb.3: 419 liveins: $vcc 420 SI_END_CF %0, implicit-def dead $exec, implicit-def dead $scc, implicit $exec 421 S_ENDPGM 0, implicit $vcc 422 423... 424--- 425# GCN-LABEL: name: s_fold_andn2_imm_regimm_32{{$}} 426# GCN: [[VAL:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1233024, implicit $exec 427# GCN: BUFFER_STORE_DWORD_OFFSET killed [[VAL]], 428name: s_fold_andn2_imm_regimm_32 429tracksRegLiveness: true 430liveins: 431 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 432body: | 433 bb.0: 434 liveins: $sgpr0_sgpr1 435 436 %0:sgpr_64 = COPY $sgpr0_sgpr1 437 %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 438 %2:sreg_32_xm0 = COPY %1.sub1 439 %3:sreg_32_xm0 = COPY %1.sub0 440 %4:sreg_32_xm0 = S_MOV_B32 61440 441 %5:sreg_32_xm0 = S_MOV_B32 -1 442 %6:sgpr_128 = REG_SEQUENCE killed %2, %subreg.sub0, killed %3, %subreg.sub1, killed %4, %subreg.sub2, killed %5, %subreg.sub3 443 %7:sreg_32_xm0 = S_MOV_B32 1234567 444 %8:sreg_32_xm0 = S_MOV_B32 9999 445 %9:sreg_32_xm0 = S_ANDN2_B32 killed %7, killed %8, implicit-def dead $scc 446 %10:vgpr_32 = COPY %9 447 BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec 448 S_ENDPGM 0 449 450... 451--- 452 453# GCN-LABEL: name: s_fold_or_imm_regimm_32{{$}} 454# GCN: %10:vgpr_32 = V_MOV_B32_e32 1243023, implicit $exec 455# GCN: BUFFER_STORE_DWORD_OFFSET killed %10, 456name: s_fold_or_imm_regimm_32 457alignment: 0 458exposesReturnsTwice: false 459legalized: false 460regBankSelected: false 461selected: false 462tracksRegLiveness: true 463liveins: 464 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 465body: | 466 bb.0: 467 liveins: $sgpr0_sgpr1 468 469 %0:sgpr_64 = COPY $sgpr0_sgpr1 470 %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 471 %2:sreg_32_xm0 = COPY %1.sub1 472 %3:sreg_32_xm0 = COPY %1.sub0 473 %4:sreg_32_xm0 = S_MOV_B32 61440 474 %5:sreg_32_xm0 = S_MOV_B32 -1 475 %6:sgpr_128 = REG_SEQUENCE killed %2, %subreg.sub0, killed %3, %subreg.sub1, killed %4, %subreg.sub2, killed %5, %subreg.sub3 476 %7:sreg_32_xm0 = S_MOV_B32 1234567 477 %8:sreg_32_xm0 = S_MOV_B32 9999 478 %9:sreg_32_xm0 = S_OR_B32 killed %7, killed %8, implicit-def dead $scc 479 %10:vgpr_32 = COPY %9 480 BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec 481 S_ENDPGM 0 482 483... 484--- 485 486# GCN-LABEL: name: v_fold_or_imm_regimm_32{{$}} 487 488# GCN: %14:vgpr_32 = V_MOV_B32_e32 1234903, implicit $exec 489# GCN: FLAT_STORE_DWORD %10, %14, 490 491# GCN: %15:vgpr_32 = V_MOV_B32_e32 1234903, implicit $exec 492# GCN: FLAT_STORE_DWORD %10, %15 493 494# GCN: %16:vgpr_32 = V_MOV_B32_e32 1234903, implicit $exec 495# GCN: FLAT_STORE_DWORD %10, %16, 496 497# GCN: %17:vgpr_32 = V_MOV_B32_e32 1234567, implicit $exec 498# GCN: FLAT_STORE_DWORD %10, %17, 499 500# GCN: %3:vgpr_32 = V_MOV_B32_e32 63, implicit $exec 501# GCN: FLAT_STORE_DWORD %10, %3, 502 503name: v_fold_or_imm_regimm_32 504alignment: 0 505exposesReturnsTwice: false 506legalized: false 507regBankSelected: false 508selected: false 509tracksRegLiveness: true 510liveins: 511 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 512 - { reg: '$vgpr0', virtual-reg: '%3' } 513body: | 514 bb.0: 515 liveins: $sgpr0_sgpr1, $vgpr0 516 517 %3:vgpr_32 = COPY $vgpr0 518 %0:sgpr_64 = COPY $sgpr0_sgpr1 519 %4:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 520 %13:vgpr_32 = V_ASHRREV_I32_e64 31, %3, implicit $exec 521 %14:vreg_64 = REG_SEQUENCE %3, %subreg.sub0, %13, %subreg.sub1 522 %15:vreg_64 = V_LSHLREV_B64_e64 2, killed %14, implicit $exec 523 %5:sreg_32_xm0 = COPY %4.sub1 524 %20:vgpr_32 = V_ADD_CO_U32_e32 %4.sub0, %15.sub0, implicit-def $vcc, implicit $exec 525 %18:vgpr_32 = COPY killed %5 526 %17:vgpr_32 = V_ADDC_U32_e32 %15.sub1, %18, implicit-def $vcc, implicit $vcc, implicit $exec 527 %19:vreg_64 = REG_SEQUENCE %20, %subreg.sub0, killed %17, %subreg.sub1 528 %6:vgpr_32 = V_MOV_B32_e32 982, implicit $exec 529 %8:sreg_32_xm0 = S_MOV_B32 1234567 530 %16:vgpr_32 = V_MOV_B32_e32 63, implicit $exec 531 %9:vgpr_32 = V_OR_B32_e64 %8, %6, implicit $exec 532 FLAT_STORE_DWORD %19, %9, 0, 0, implicit $exec, implicit $flat_scr 533 %10:vgpr_32 = V_OR_B32_e64 %6, %8, implicit $exec 534 FLAT_STORE_DWORD %19, %10, 0, 0, implicit $exec, implicit $flat_scr 535 %11:vgpr_32 = V_OR_B32_e32 %8, %6, implicit $exec 536 FLAT_STORE_DWORD %19, %11, 0, 0, implicit $exec, implicit $flat_scr 537 %12:vgpr_32 = V_OR_B32_e64 %8, %8, implicit $exec 538 FLAT_STORE_DWORD %19, %12, 0, 0, implicit $exec, implicit $flat_scr 539 %13:vgpr_32 = V_OR_B32_e64 %16, %16, implicit $exec 540 FLAT_STORE_DWORD %19, %13, 0, 0, implicit $exec, implicit $flat_scr 541 S_ENDPGM 0 542 543... 544--- 545 546# GCN-LABEL: name: s_fold_orn2_imm_regimm_32{{$}} 547# GCN: %10:vgpr_32 = V_MOV_B32_e32 -8457, implicit $exec 548# GCN: BUFFER_STORE_DWORD_OFFSET killed %10, 549name: s_fold_orn2_imm_regimm_32 550alignment: 0 551exposesReturnsTwice: false 552legalized: false 553regBankSelected: false 554selected: false 555tracksRegLiveness: true 556liveins: 557 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 558body: | 559 bb.0: 560 liveins: $sgpr0_sgpr1 561 562 %0:sgpr_64 = COPY $sgpr0_sgpr1 563 %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 564 %2:sreg_32_xm0 = COPY %1.sub1 565 %3:sreg_32_xm0 = COPY %1.sub0 566 %4:sreg_32_xm0 = S_MOV_B32 61440 567 %5:sreg_32_xm0 = S_MOV_B32 -1 568 %6:sgpr_128 = REG_SEQUENCE killed %2, %subreg.sub0, killed %3, %subreg.sub1, killed %4, %subreg.sub2, killed %5, %subreg.sub3 569 %7:sreg_32_xm0 = S_MOV_B32 1234567 570 %8:sreg_32_xm0 = S_MOV_B32 9999 571 %9:sreg_32_xm0 = S_ORN2_B32 killed %7, killed %8, implicit-def dead $scc 572 %10:vgpr_32 = COPY %9 573 BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec 574 S_ENDPGM 0 575 576... 577--- 578 579# GCN-LABEL: name: s_fold_nand_imm_regimm_32{{$}} 580# GCN: %10:vgpr_32 = V_MOV_B32_e32 -1544, implicit $exec 581# GCN: BUFFER_STORE_DWORD_OFFSET killed %10, 582name: s_fold_nand_imm_regimm_32 583alignment: 0 584exposesReturnsTwice: false 585legalized: false 586regBankSelected: false 587selected: false 588tracksRegLiveness: true 589liveins: 590 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 591body: | 592 bb.0: 593 liveins: $sgpr0_sgpr1 594 595 %0:sgpr_64 = COPY $sgpr0_sgpr1 596 %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 597 %2:sreg_32_xm0 = COPY %1.sub1 598 %3:sreg_32_xm0 = COPY %1.sub0 599 %4:sreg_32_xm0 = S_MOV_B32 61440 600 %5:sreg_32_xm0 = S_MOV_B32 -1 601 %6:sgpr_128 = REG_SEQUENCE killed %2, %subreg.sub0, killed %3, %subreg.sub1, killed %4, %subreg.sub2, killed %5, %subreg.sub3 602 %7:sreg_32_xm0 = S_MOV_B32 1234567 603 %8:sreg_32_xm0 = S_MOV_B32 9999 604 %9:sreg_32_xm0 = S_NAND_B32 killed %7, killed %8, implicit-def dead $scc 605 %10:vgpr_32 = COPY %9 606 BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec 607 S_ENDPGM 0 608 609... 610--- 611 612# GCN-LABEL: name: s_fold_nor_imm_regimm_32{{$}} 613# GCN: %10:vgpr_32 = V_MOV_B32_e32 -1243024, implicit $exec 614# GCN: BUFFER_STORE_DWORD_OFFSET killed %10, 615name: s_fold_nor_imm_regimm_32 616alignment: 0 617exposesReturnsTwice: false 618legalized: false 619regBankSelected: false 620selected: false 621tracksRegLiveness: true 622liveins: 623 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 624body: | 625 bb.0: 626 liveins: $sgpr0_sgpr1 627 628 %0:sgpr_64 = COPY $sgpr0_sgpr1 629 %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 630 %2:sreg_32_xm0 = COPY %1.sub1 631 %3:sreg_32_xm0 = COPY %1.sub0 632 %4:sreg_32_xm0 = S_MOV_B32 61440 633 %5:sreg_32_xm0 = S_MOV_B32 -1 634 %6:sgpr_128 = REG_SEQUENCE killed %2, %subreg.sub0, killed %3, %subreg.sub1, killed %4, %subreg.sub2, killed %5, %subreg.sub3 635 %7:sreg_32_xm0 = S_MOV_B32 1234567 636 %8:sreg_32_xm0 = S_MOV_B32 9999 637 %9:sreg_32_xm0 = S_NOR_B32 killed %7, killed %8, implicit-def dead $scc 638 %10:vgpr_32 = COPY %9 639 BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec 640 S_ENDPGM 0 641 642... 643--- 644 645# GCN-LABEL: name: s_fold_xnor_imm_regimm_32{{$}} 646# GCN: %10:vgpr_32 = V_MOV_B32_e32 -1241481, implicit $exec 647# GCN: BUFFER_STORE_DWORD_OFFSET killed %10, 648name: s_fold_xnor_imm_regimm_32 649alignment: 0 650exposesReturnsTwice: false 651legalized: false 652regBankSelected: false 653selected: false 654tracksRegLiveness: true 655liveins: 656 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 657body: | 658 bb.0: 659 liveins: $sgpr0_sgpr1 660 661 %0:sgpr_64 = COPY $sgpr0_sgpr1 662 %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 663 %2:sreg_32_xm0 = COPY %1.sub1 664 %3:sreg_32_xm0 = COPY %1.sub0 665 %4:sreg_32_xm0 = S_MOV_B32 61440 666 %5:sreg_32_xm0 = S_MOV_B32 -1 667 %6:sgpr_128 = REG_SEQUENCE killed %2, %subreg.sub0, killed %3, %subreg.sub1, killed %4, %subreg.sub2, killed %5, %subreg.sub3 668 %7:sreg_32_xm0 = S_MOV_B32 1234567 669 %8:sreg_32_xm0 = S_MOV_B32 9999 670 %9:sreg_32_xm0 = S_XNOR_B32 killed %7, killed %8, implicit-def dead $scc 671 %10:vgpr_32 = COPY %9 672 BUFFER_STORE_DWORD_OFFSET killed %10, killed %6, 0, 0, 0, 0, 0, implicit $exec 673 S_ENDPGM 0 674 675... 676 677--- 678# GCN-LABEL: name: v_fold_shl_imm_regimm_32{{$}} 679 680# GCN: %16:vgpr_32 = V_MOV_B32_e32 40955904, implicit $exec 681# GCN: FLAT_STORE_DWORD %10, %16, 682 683# GCN: %17:vgpr_32 = V_MOV_B32_e32 24, implicit $exec 684# GCN: FLAT_STORE_DWORD %10, %17, 685 686# GCN: %18:vgpr_32 = V_MOV_B32_e32 4096, implicit $exec 687# GCN: FLAT_STORE_DWORD %10, %18, 688 689# GCN: %19:vgpr_32 = V_MOV_B32_e32 24, implicit $exec 690# GCN: FLAT_STORE_DWORD %10, %19, 691 692# GCN: %3:vgpr_32 = V_MOV_B32_e32 0, implicit $exec 693# GCN: FLAT_STORE_DWORD %10, %3, 694 695# GCN: %20:vgpr_32 = V_MOV_B32_e32 4096, implicit $exec 696# GCN: FLAT_STORE_DWORD %10, %20, 697 698# GCN: %21:vgpr_32 = V_MOV_B32_e32 1, implicit $exec 699# GCN: FLAT_STORE_DWORD %10, %21, 700 701# GCN: %22:vgpr_32 = V_MOV_B32_e32 2, implicit $exec 702# GCN: FLAT_STORE_DWORD %10, %22, 703 704# GCN: %23:vgpr_32 = V_MOV_B32_e32 7927808, implicit $exec 705# GCN: FLAT_STORE_DWORD %10, %23, 706 707# GCN: %24:vgpr_32 = V_MOV_B32_e32 -8, implicit $exec 708# GCN: FLAT_STORE_DWORD %10, %24, 709 710name: v_fold_shl_imm_regimm_32 711alignment: 0 712exposesReturnsTwice: false 713legalized: false 714regBankSelected: false 715selected: false 716tracksRegLiveness: true 717liveins: 718 - { reg: '$sgpr0_sgpr1', virtual-reg: '%0' } 719 - { reg: '$vgpr0', virtual-reg: '%2' } 720body: | 721 bb.0: 722 liveins: $sgpr0_sgpr1, $vgpr0 723 724 %2:vgpr_32 = COPY $vgpr0 725 %0:sgpr_64 = COPY $sgpr0_sgpr1 726 %3:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0 :: (non-temporal dereferenceable invariant load (s64) from `i64 addrspace(4)* undef`, addrspace 4) 727 %15:vgpr_32 = V_ASHRREV_I32_e64 31, %2, implicit $exec 728 %16:vreg_64 = REG_SEQUENCE %2, %subreg.sub0, %15, %subreg.sub1 729 %17:vreg_64 = V_LSHLREV_B64_e64 2, killed %16, implicit $exec 730 %9:sreg_32_xm0 = COPY %3.sub1 731 %21:vgpr_32 = V_ADD_CO_U32_e32 %3.sub0, %17.sub0, implicit-def $vcc, implicit $exec 732 %19:vgpr_32 = COPY killed %9 733 %18:vgpr_32 = V_ADDC_U32_e32 %17.sub1, %19, implicit-def $vcc, implicit $vcc, implicit $exec 734 %20:vreg_64 = REG_SEQUENCE %21, %subreg.sub0, killed %18, %subreg.sub1 735 %10:vgpr_32 = V_MOV_B32_e32 9999, implicit $exec 736 %24:vgpr_32 = V_MOV_B32_e32 3871, implicit $exec 737 %6:vgpr_32 = V_MOV_B32_e32 1, implicit $exec 738 %7:sreg_32_xm0 = S_MOV_B32 1 739 %27:sreg_32_xm0 = S_MOV_B32 -4 740 %11:vgpr_32 = V_LSHLREV_B32_e64 12, %10, implicit $exec 741 FLAT_STORE_DWORD %20, %11, 0, 0, implicit $exec, implicit $flat_scr 742 %12:vgpr_32 = V_LSHLREV_B32_e64 %7, 12, implicit $exec 743 FLAT_STORE_DWORD %20, %12, 0, 0, implicit $exec, implicit $flat_scr 744 %13:vgpr_32 = V_LSHL_B32_e64 %7, 12, implicit $exec 745 FLAT_STORE_DWORD %20, %13, 0, 0, implicit $exec, implicit $flat_scr 746 %14:vgpr_32 = V_LSHL_B32_e64 12, %7, implicit $exec 747 FLAT_STORE_DWORD %20, %14, 0, 0, implicit $exec, implicit $flat_scr 748 %15:vgpr_32 = V_LSHL_B32_e64 12, %24, implicit $exec 749 FLAT_STORE_DWORD %20, %15, 0, 0, implicit $exec, implicit $flat_scr 750 %22:vgpr_32 = V_LSHL_B32_e64 %6, 12, implicit $exec 751 FLAT_STORE_DWORD %20, %22, 0, 0, implicit $exec, implicit $flat_scr 752 %23:vgpr_32 = V_LSHL_B32_e64 %6, 32, implicit $exec 753 FLAT_STORE_DWORD %20, %23, 0, 0, implicit $exec, implicit $flat_scr 754 %25:vgpr_32 = V_LSHL_B32_e32 %6, %6, implicit $exec 755 FLAT_STORE_DWORD %20, %25, 0, 0, implicit $exec, implicit $flat_scr 756 %26:vgpr_32 = V_LSHLREV_B32_e32 11, %24, implicit $exec 757 FLAT_STORE_DWORD %20, %26, 0, 0, implicit $exec, implicit $flat_scr 758 %28:vgpr_32 = V_LSHL_B32_e32 %27, %6, implicit $exec 759 FLAT_STORE_DWORD %20, %28, 0, 0, implicit $exec, implicit $flat_scr 760 S_ENDPGM 0 761 762... 763 764# This used to incorrectly interpret V_MOV_B32_sdwa as being a move 765# immediate, and interpreting the src0_modifiers field as a 766# materialized immediate. 767 768--- 769# GCN-LABEL: name: no_fold_sdwa_mov_imm 770# GCN: %2:vgpr_32 = V_MOV_B32_sdwa 0, %0, 0, 5, 2, 4, implicit $exec, implicit %0(tied-def 0) 771# GCN-NEXT: [[SHIFT:%[0-9]+]]:vgpr_32 = V_LSHRREV_B32_e64 16, %2, implicit $exec 772# GCN-NEXT: S_ENDPGM 0, implicit [[SHIFT]] 773 774name: no_fold_sdwa_mov_imm 775alignment: 0 776exposesReturnsTwice: false 777legalized: false 778regBankSelected: false 779selected: false 780tracksRegLiveness: true 781 782body: | 783 bb.0: 784 liveins: $vgpr0 785 %0:vgpr_32 = COPY $vgpr0 786 %1:vgpr_32 = V_MOV_B32_e32 16, implicit $exec 787 %2:vgpr_32 = V_MOV_B32_sdwa 0, %0:vgpr_32, 0, 5, 2, 4, implicit $exec, implicit %0:vgpr_32(tied-def 0) 788 %3:vgpr_32 = V_MOV_B32_e32 16, implicit $exec 789 %4:vgpr_32 = V_LSHRREV_B32_e64 %3:vgpr_32, %2:vgpr_32, implicit $exec 790 S_ENDPGM 0, implicit %4 791 792... 793