# 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-NEXT: renamable $sgpr1 = S_MOV_B32 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_MOV_B32 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr0 = S_MOV_B32 1, implicit $exec ; GCN-NEXT: SI_SPILL_S32_SAVE killed renamable $sgpr0, %stack.1, implicit $exec, implicit $sgpr32 :: (store (s32) into %stack.1, addrspace 5) ; GCN-NEXT: renamable $sgpr1 = S_MOV_B32 2, implicit $exec ; GCN-NEXT: renamable $sgpr0 = S_MOV_B32 3, implicit $exec ; GCN-NEXT: SI_SPILL_S32_SAVE killed renamable $sgpr0, %stack.0, implicit $exec, implicit $sgpr32 :: (store (s32) into %stack.0, addrspace 5) ; GCN-NEXT: renamable $sgpr0 = SI_SPILL_S32_RESTORE %stack.1, implicit $exec, implicit $sgpr32 :: (load (s32) from %stack.1, addrspace 5) ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = SI_SPILL_S32_RESTORE %stack.0, implicit $exec, implicit $sgpr32 :: (load (s32) from %stack.0, addrspace 5) ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_MOV_B32 renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr1 = S_MOV_B32 renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr1 = S_MOV_B32 renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_MOV_B32 renamable $sgpr0 ; GCN-NEXT: SI_SPILL_S32_SAVE killed renamable $sgpr1, %stack.1, implicit $exec, implicit $sgpr32 :: (store (s32) into %stack.1, addrspace 5) ; GCN-NEXT: renamable $sgpr1 = S_MOV_B32 renamable $sgpr0 ; GCN-NEXT: SI_SPILL_S32_SAVE killed renamable $sgpr1, %stack.0, implicit $exec, implicit $sgpr32 :: (store (s32) into %stack.0, addrspace 5) ; GCN-NEXT: renamable $sgpr0 = S_MOV_B32 killed renamable $sgpr0 ; GCN-NEXT: renamable $sgpr1 = SI_SPILL_S32_RESTORE %stack.1, implicit $exec, implicit $sgpr32 :: (load (s32) from %stack.1, addrspace 5) ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr1 = SI_SPILL_S32_RESTORE %stack.0, implicit $exec, implicit $sgpr32 :: (load (s32) from %stack.0, addrspace 5) ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr2_sgpr3 = S_MOV_B64 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0_sgpr1 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr2_sgpr3 ; GCN-NEXT: renamable $sgpr0_sgpr1 = S_MOV_B64 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0_sgpr1 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_BREV_B32 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_BREV_B32 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr2_sgpr3 = S_BREV_B64 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0_sgpr1 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr2_sgpr3 ; GCN-NEXT: renamable $sgpr0_sgpr1 = S_BREV_B64 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0_sgpr1 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_FF0_I32_B32 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_FF0_I32_B32 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_FF1_I32_B32 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_FF1_I32_B32 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_FF0_I32_B64 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_FF0_I32_B64 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_FF1_I32_B64 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_FF1_I32_B64 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_FLBIT_I32_B32 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_FLBIT_I32_B32 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_FLBIT_I32_B64 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_FLBIT_I32_B64 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_FLBIT_I32 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_FLBIT_I32 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_FLBIT_I32_I64 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_FLBIT_I32_I64 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_SEXT_I32_I8 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_SEXT_I32_I8 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_SEXT_I32_I16 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_SEXT_I32_I16 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr2_sgpr3 = S_BITREPLICATE_B64_B32 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0_sgpr1 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr2_sgpr3 ; GCN-NEXT: renamable $sgpr0_sgpr1 = S_BITREPLICATE_B64_B32 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0_sgpr1 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_BFM_B32 2, 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_BFM_B32 3, 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr2_sgpr3 = S_BFM_B64 2, 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0_sgpr1 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr2_sgpr3 ; GCN-NEXT: renamable $sgpr0_sgpr1 = S_BFM_B64 3, 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0_sgpr1 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_MUL_I32 2, 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_MUL_I32 3, 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_MUL_HI_I32 2, 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_MUL_HI_I32 3, 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_MUL_HI_U32 2, 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_MUL_HI_U32 3, 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_PACK_LL_B32_B16 2, 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_PACK_LL_B32_B16 3, 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_PACK_LH_B32_B16 2, 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_PACK_LH_B32_B16 3, 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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-NEXT: renamable $sgpr1 = S_PACK_HH_B32_B16 2, 2 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr1 ; GCN-NEXT: renamable $sgpr0 = S_PACK_HH_B32_B16 3, 3 ; GCN-NEXT: S_NOP 0, implicit killed renamable $sgpr0 ; GCN-NEXT: 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 ...