Files
clang-p2996/llvm/test/CodeGen/AMDGPU/remat-sop.mir
Stanislav Mekhanoshin 6185835656 [AMDGPU] Allow rematerialization of SOP with virtual registers
D106408 was doing this for all targets although it was
reverted due to couple performance regressions on some targets.
The difference for AMDGPU is the ability to rematerialize SOP
instructions with virtual register uses like we already do for VOP.

Differential Revision: https://reviews.llvm.org/D110743
2021-10-20 11:46:50 -07:00

576 lines
19 KiB
YAML

# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -verify-machineinstrs --stress-regalloc=2 -start-before=greedy -stop-after=virtregrewriter -o - %s | FileCheck -check-prefix=GCN %s
---
name: test_remat_s_mov_b32
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_mov_b32
; GCN: renamable $sgpr0 = S_MOV_B32 1
; GCN: renamable $sgpr1 = S_MOV_B32 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_MOV_B32 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_MOV_B32 1
%1:sreg_32 = S_MOV_B32 2
%2:sreg_32 = S_MOV_B32 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_no_remat_s_mov_b32_impuse_exec
tracksRegLiveness: true
machineFunctionInfo:
stackPtrOffsetReg: $sgpr32
body: |
bb.0:
; GCN-LABEL: name: test_no_remat_s_mov_b32_impuse_exec
; GCN: $exec = IMPLICIT_DEF
; GCN: renamable $sgpr0 = S_MOV_B32 1, implicit $exec
; GCN: SI_SPILL_S32_SAVE killed renamable $sgpr0, %stack.1, implicit $exec, implicit $sgpr32 :: (store (s32) into %stack.1, addrspace 5)
; GCN: renamable $sgpr1 = S_MOV_B32 2, implicit $exec
; GCN: renamable $sgpr0 = S_MOV_B32 3, implicit $exec
; GCN: SI_SPILL_S32_SAVE killed renamable $sgpr0, %stack.0, implicit $exec, implicit $sgpr32 :: (store (s32) into %stack.0, addrspace 5)
; GCN: renamable $sgpr0 = SI_SPILL_S32_RESTORE %stack.1, implicit $exec, implicit $sgpr32 :: (load (s32) from %stack.1, addrspace 5)
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = SI_SPILL_S32_RESTORE %stack.0, implicit $exec, implicit $sgpr32 :: (load (s32) from %stack.0, addrspace 5)
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
$exec = IMPLICIT_DEF
%0:sreg_32 = S_MOV_B32 1, implicit $exec
%1:sreg_32 = S_MOV_B32 2, implicit $exec
%2:sreg_32 = S_MOV_B32 3, implicit $exec
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
# The liverange of %0 covers a point of rematerialization, source value is
# available.
---
name: test_remat_s_mov_b32_vreg_src_long_lr
tracksRegLiveness: true
machineFunctionInfo:
stackPtrOffsetReg: $sgpr32
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_mov_b32_vreg_src_long_lr
; GCN: renamable $sgpr0 = IMPLICIT_DEF
; GCN: renamable $sgpr1 = S_MOV_B32 renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr1 = S_MOV_B32 renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr1 = S_MOV_B32 renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = IMPLICIT_DEF
%1:sreg_32 = S_MOV_B32 %0:sreg_32
%2:sreg_32 = S_MOV_B32 %0:sreg_32
%3:sreg_32 = S_MOV_B32 %0:sreg_32
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_NOP 0, implicit %3
S_NOP 0, implicit %0
S_ENDPGM 0
...
# The liverange of %0 does not cover a point of rematerialization, source value is
# unavailable and we do not want to artificially extend the liverange.
---
name: test_no_remat_s_mov_b32_vreg_src_short_lr
tracksRegLiveness: true
machineFunctionInfo:
stackPtrOffsetReg: $sgpr32
body: |
bb.0:
; GCN-LABEL: name: test_no_remat_s_mov_b32_vreg_src_short_lr
; GCN: renamable $sgpr0 = IMPLICIT_DEF
; GCN: renamable $sgpr1 = S_MOV_B32 renamable $sgpr0
; GCN: SI_SPILL_S32_SAVE killed renamable $sgpr1, %stack.1, implicit $exec, implicit $sgpr32 :: (store (s32) into %stack.1, addrspace 5)
; GCN: renamable $sgpr1 = S_MOV_B32 renamable $sgpr0
; GCN: SI_SPILL_S32_SAVE killed renamable $sgpr1, %stack.0, implicit $exec, implicit $sgpr32 :: (store (s32) into %stack.0, addrspace 5)
; GCN: renamable $sgpr0 = S_MOV_B32 killed renamable $sgpr0
; GCN: renamable $sgpr1 = SI_SPILL_S32_RESTORE %stack.1, implicit $exec, implicit $sgpr32 :: (load (s32) from %stack.1, addrspace 5)
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr1 = SI_SPILL_S32_RESTORE %stack.0, implicit $exec, implicit $sgpr32 :: (load (s32) from %stack.0, addrspace 5)
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = IMPLICIT_DEF
%1:sreg_32 = S_MOV_B32 %0:sreg_32
%2:sreg_32 = S_MOV_B32 %0:sreg_32
%3:sreg_32 = S_MOV_B32 %0:sreg_32
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_NOP 0, implicit %3
S_ENDPGM 0
...
---
name: test_remat_s_mov_b64
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_mov_b64
; GCN: renamable $sgpr0_sgpr1 = S_MOV_B64 1
; GCN: renamable $sgpr2_sgpr3 = S_MOV_B64 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0_sgpr1
; GCN: S_NOP 0, implicit killed renamable $sgpr2_sgpr3
; GCN: renamable $sgpr0_sgpr1 = S_MOV_B64 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0_sgpr1
; GCN: S_ENDPGM 0
%0:sgpr_64 = S_MOV_B64 1
%1:sgpr_64 = S_MOV_B64 2
%2:sgpr_64 = S_MOV_B64 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_brev_b32
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_brev_b32
; GCN: renamable $sgpr0 = S_BREV_B32 1
; GCN: renamable $sgpr1 = S_BREV_B32 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_BREV_B32 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_BREV_B32 1
%1:sreg_32 = S_BREV_B32 2
%2:sreg_32 = S_BREV_B32 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_brev_b64
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_brev_b64
; GCN: renamable $sgpr0_sgpr1 = S_BREV_B64 1
; GCN: renamable $sgpr2_sgpr3 = S_BREV_B64 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0_sgpr1
; GCN: S_NOP 0, implicit killed renamable $sgpr2_sgpr3
; GCN: renamable $sgpr0_sgpr1 = S_BREV_B64 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0_sgpr1
; GCN: S_ENDPGM 0
%0:sgpr_64 = S_BREV_B64 1
%1:sgpr_64 = S_BREV_B64 2
%2:sgpr_64 = S_BREV_B64 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_ff0_i32_b32
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_ff0_i32_b32
; GCN: renamable $sgpr0 = S_FF0_I32_B32 1
; GCN: renamable $sgpr1 = S_FF0_I32_B32 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_FF0_I32_B32 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_FF0_I32_B32 1
%1:sreg_32 = S_FF0_I32_B32 2
%2:sreg_32 = S_FF0_I32_B32 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_ff1_i32_b32
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_ff1_i32_b32
; GCN: renamable $sgpr0 = S_FF1_I32_B32 1
; GCN: renamable $sgpr1 = S_FF1_I32_B32 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_FF1_I32_B32 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_FF1_I32_B32 1
%1:sreg_32 = S_FF1_I32_B32 2
%2:sreg_32 = S_FF1_I32_B32 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_ff0_i32_b64
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_ff0_i32_b64
; GCN: renamable $sgpr0 = S_FF0_I32_B64 1
; GCN: renamable $sgpr1 = S_FF0_I32_B64 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_FF0_I32_B64 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_FF0_I32_B64 1
%1:sreg_32 = S_FF0_I32_B64 2
%2:sreg_32 = S_FF0_I32_B64 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_ff1_i32_b64
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_ff1_i32_b64
; GCN: renamable $sgpr0 = S_FF1_I32_B64 1
; GCN: renamable $sgpr1 = S_FF1_I32_B64 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_FF1_I32_B64 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_FF1_I32_B64 1
%1:sreg_32 = S_FF1_I32_B64 2
%2:sreg_32 = S_FF1_I32_B64 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_flbit_i32_b32
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_flbit_i32_b32
; GCN: renamable $sgpr0 = S_FLBIT_I32_B32 1
; GCN: renamable $sgpr1 = S_FLBIT_I32_B32 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_FLBIT_I32_B32 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_FLBIT_I32_B32 1
%1:sreg_32 = S_FLBIT_I32_B32 2
%2:sreg_32 = S_FLBIT_I32_B32 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_flbit_i32_b64
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_flbit_i32_b64
; GCN: renamable $sgpr0 = S_FLBIT_I32_B64 1
; GCN: renamable $sgpr1 = S_FLBIT_I32_B64 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_FLBIT_I32_B64 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_FLBIT_I32_B64 1
%1:sreg_32 = S_FLBIT_I32_B64 2
%2:sreg_32 = S_FLBIT_I32_B64 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_flbit_i32
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_flbit_i32
; GCN: renamable $sgpr0 = S_FLBIT_I32 1
; GCN: renamable $sgpr1 = S_FLBIT_I32 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_FLBIT_I32 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_FLBIT_I32 1
%1:sreg_32 = S_FLBIT_I32 2
%2:sreg_32 = S_FLBIT_I32 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_flbit_i32_i64
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_flbit_i32_i64
; GCN: renamable $sgpr0 = S_FLBIT_I32_I64 1
; GCN: renamable $sgpr1 = S_FLBIT_I32_I64 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_FLBIT_I32_I64 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_FLBIT_I32_I64 1
%1:sreg_32 = S_FLBIT_I32_I64 2
%2:sreg_32 = S_FLBIT_I32_I64 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_sext_i32_i8
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_sext_i32_i8
; GCN: renamable $sgpr0 = S_SEXT_I32_I8 1
; GCN: renamable $sgpr1 = S_SEXT_I32_I8 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_SEXT_I32_I8 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_SEXT_I32_I8 1
%1:sreg_32 = S_SEXT_I32_I8 2
%2:sreg_32 = S_SEXT_I32_I8 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_sext_i32_i16
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_sext_i32_i16
; GCN: renamable $sgpr0 = S_SEXT_I32_I16 1
; GCN: renamable $sgpr1 = S_SEXT_I32_I16 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_SEXT_I32_I16 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_SEXT_I32_I16 1
%1:sreg_32 = S_SEXT_I32_I16 2
%2:sreg_32 = S_SEXT_I32_I16 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_bitreplicate_b64_b32
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_bitreplicate_b64_b32
; GCN: renamable $sgpr0_sgpr1 = S_BITREPLICATE_B64_B32 1
; GCN: renamable $sgpr2_sgpr3 = S_BITREPLICATE_B64_B32 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0_sgpr1
; GCN: S_NOP 0, implicit killed renamable $sgpr2_sgpr3
; GCN: renamable $sgpr0_sgpr1 = S_BITREPLICATE_B64_B32 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0_sgpr1
; GCN: S_ENDPGM 0
%0:sgpr_64 = S_BITREPLICATE_B64_B32 1
%1:sgpr_64 = S_BITREPLICATE_B64_B32 2
%2:sgpr_64 = S_BITREPLICATE_B64_B32 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_bfm_b32
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_bfm_b32
; GCN: renamable $sgpr0 = S_BFM_B32 1, 1
; GCN: renamable $sgpr1 = S_BFM_B32 2, 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_BFM_B32 3, 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_BFM_B32 1, 1
%1:sreg_32 = S_BFM_B32 2, 2
%2:sreg_32 = S_BFM_B32 3, 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_bfm_b64
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_bfm_b64
; GCN: renamable $sgpr0_sgpr1 = S_BFM_B64 1, 1
; GCN: renamable $sgpr2_sgpr3 = S_BFM_B64 2, 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0_sgpr1
; GCN: S_NOP 0, implicit killed renamable $sgpr2_sgpr3
; GCN: renamable $sgpr0_sgpr1 = S_BFM_B64 3, 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0_sgpr1
; GCN: S_ENDPGM 0
%0:sgpr_64 = S_BFM_B64 1, 1
%1:sgpr_64 = S_BFM_B64 2, 2
%2:sgpr_64 = S_BFM_B64 3, 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_mul_i32
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_mul_i32
; GCN: renamable $sgpr0 = S_MUL_I32 1, 1
; GCN: renamable $sgpr1 = S_MUL_I32 2, 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_MUL_I32 3, 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_MUL_I32 1, 1
%1:sreg_32 = S_MUL_I32 2, 2
%2:sreg_32 = S_MUL_I32 3, 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_mul_hi_i32
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_mul_hi_i32
; GCN: renamable $sgpr0 = S_MUL_HI_I32 1, 1
; GCN: renamable $sgpr1 = S_MUL_HI_I32 2, 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_MUL_HI_I32 3, 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_MUL_HI_I32 1, 1
%1:sreg_32 = S_MUL_HI_I32 2, 2
%2:sreg_32 = S_MUL_HI_I32 3, 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_mul_hi_u32
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_mul_hi_u32
; GCN: renamable $sgpr0 = S_MUL_HI_U32 1, 1
; GCN: renamable $sgpr1 = S_MUL_HI_U32 2, 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_MUL_HI_U32 3, 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_MUL_HI_U32 1, 1
%1:sreg_32 = S_MUL_HI_U32 2, 2
%2:sreg_32 = S_MUL_HI_U32 3, 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_pack_ll_b32_b16
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_pack_ll_b32_b16
; GCN: renamable $sgpr0 = S_PACK_LL_B32_B16 1, 1
; GCN: renamable $sgpr1 = S_PACK_LL_B32_B16 2, 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_PACK_LL_B32_B16 3, 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_PACK_LL_B32_B16 1, 1
%1:sreg_32 = S_PACK_LL_B32_B16 2, 2
%2:sreg_32 = S_PACK_LL_B32_B16 3, 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_pack_lh_b32_b16
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_pack_lh_b32_b16
; GCN: renamable $sgpr0 = S_PACK_LH_B32_B16 1, 1
; GCN: renamable $sgpr1 = S_PACK_LH_B32_B16 2, 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_PACK_LH_B32_B16 3, 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_PACK_LH_B32_B16 1, 1
%1:sreg_32 = S_PACK_LH_B32_B16 2, 2
%2:sreg_32 = S_PACK_LH_B32_B16 3, 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...
---
name: test_remat_s_pack_hh_b32_b16
tracksRegLiveness: true
body: |
bb.0:
; GCN-LABEL: name: test_remat_s_pack_hh_b32_b16
; GCN: renamable $sgpr0 = S_PACK_HH_B32_B16 1, 1
; GCN: renamable $sgpr1 = S_PACK_HH_B32_B16 2, 2
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_NOP 0, implicit killed renamable $sgpr1
; GCN: renamable $sgpr0 = S_PACK_HH_B32_B16 3, 3
; GCN: S_NOP 0, implicit killed renamable $sgpr0
; GCN: S_ENDPGM 0
%0:sreg_32 = S_PACK_HH_B32_B16 1, 1
%1:sreg_32 = S_PACK_HH_B32_B16 2, 2
%2:sreg_32 = S_PACK_HH_B32_B16 3, 3
S_NOP 0, implicit %0
S_NOP 0, implicit %1
S_NOP 0, implicit %2
S_ENDPGM 0
...