1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -march=amdgcn -mcpu=gfx900 -o - -verify-coalescing -run-pass=simple-register-coalescing %s | FileCheck -check-prefix=GCN %s 3 4--- 5# Do not rematerialize V_MOV_B32 at COPY because source register %1 is killed. 6 7name: no_remat_killed_src_in_inst 8tracksRegLiveness: true 9body: | 10 bb.0: 11 liveins: $vgpr0 12 13 ; GCN-LABEL: name: no_remat_killed_src_in_inst 14 ; GCN: liveins: $vgpr0 15 ; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 16 ; GCN: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e32 1, [[COPY]], implicit $exec 17 ; GCN: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 [[V_ADD_U32_e32_]], implicit $exec 18 ; GCN: $vgpr0 = COPY [[V_MOV_B32_e32_]] 19 ; GCN: SI_RETURN_TO_EPILOG $vgpr0 20 %0:vgpr_32 = COPY $vgpr0 21 %1:vgpr_32 = V_ADD_U32_e32 1, %0, implicit $exec 22 %2:vgpr_32 = V_MOV_B32_e32 killed %1, implicit $exec 23 $vgpr0 = COPY killed %2 24 SI_RETURN_TO_EPILOG killed $vgpr0 25... 26--- 27# Do not rematerialize V_MOV_B32 at COPY because source register %1 is killed 28# after the MOV but before the COPY. 29 30name: no_remat_killed_src_after_inst 31tracksRegLiveness: true 32body: | 33 bb.0: 34 liveins: $vgpr0 35 36 ; GCN-LABEL: name: no_remat_killed_src_after_inst 37 ; GCN: liveins: $vgpr0 38 ; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 39 ; GCN: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e32 1, [[COPY]], implicit $exec 40 ; GCN: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 [[V_ADD_U32_e32_]], implicit $exec 41 ; GCN: KILL [[V_ADD_U32_e32_]] 42 ; GCN: $vgpr0 = COPY [[V_MOV_B32_e32_]] 43 ; GCN: SI_RETURN_TO_EPILOG $vgpr0 44 %0:vgpr_32 = COPY $vgpr0 45 %1:vgpr_32 = V_ADD_U32_e32 1, %0, implicit $exec 46 %2:vgpr_32 = V_MOV_B32_e32 %1, implicit $exec 47 KILL %1 48 $vgpr0 = COPY killed %2 49 SI_RETURN_TO_EPILOG killed $vgpr0 50... 51--- 52# Even if %1 is not killed do not rematerialize V_MOV_B32 so that we do not 53# extend %1 liverange. 54 55name: no_remat_alive_src_in_inst_unused 56tracksRegLiveness: true 57body: | 58 bb.0: 59 liveins: $vgpr0 60 61 ; GCN-LABEL: name: no_remat_alive_src_in_inst_unused 62 ; GCN: liveins: $vgpr0 63 ; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 64 ; GCN: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e32 1, [[COPY]], implicit $exec 65 ; GCN: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 [[V_ADD_U32_e32_]], implicit $exec 66 ; GCN: $vgpr0 = COPY [[V_MOV_B32_e32_]] 67 ; GCN: SI_RETURN_TO_EPILOG $vgpr0 68 %0:vgpr_32 = COPY $vgpr0 69 %1:vgpr_32 = V_ADD_U32_e32 1, %0, implicit $exec 70 %2:vgpr_32 = V_MOV_B32_e32 %1, implicit $exec 71 $vgpr0 = COPY killed %2 72 SI_RETURN_TO_EPILOG killed $vgpr0 73... 74--- 75# Rematerialize V_MOV_B32 since %1 is available at COPY and still alive. 76 77name: remat_alive_src_in_inst_used_and_available 78tracksRegLiveness: true 79body: | 80 bb.0: 81 liveins: $vgpr0 82 83 ; GCN-LABEL: name: remat_alive_src_in_inst_used_and_available 84 ; GCN: liveins: $vgpr0 85 ; GCN: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 86 ; GCN: [[V_ADD_U32_e32_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e32 1, [[COPY]], implicit $exec 87 ; GCN: $vgpr0 = V_MOV_B32_e32 [[V_ADD_U32_e32_]], implicit $exec 88 ; GCN: SI_RETURN_TO_EPILOG $vgpr0 89 %0:vgpr_32 = COPY $vgpr0 90 %1:vgpr_32 = V_ADD_U32_e32 1, %0, implicit $exec 91 %2:vgpr_32 = V_MOV_B32_e32 %1, implicit $exec 92 $vgpr0 = COPY killed %2, implicit %1 93 SI_RETURN_TO_EPILOG killed $vgpr0 94... 95