Index: lib/CodeGen/ScheduleDAGInstrs.cpp =================================================================== --- lib/CodeGen/ScheduleDAGInstrs.cpp +++ lib/CodeGen/ScheduleDAGInstrs.cpp @@ -1107,7 +1107,6 @@ MachineBasicBlock::instr_iterator First = MI.getIterator(); if (MI.isBundle()) { toggleKills(MRI, LiveRegs, MI, false); - ++First; } // Some targets make the (questionable) assumtion that the instructions // inside the bundle are ordered and consequently only the last use of Index: test/CodeGen/AMDGPU/post-ra-sched-kill-bundle-use-inst.mir =================================================================== --- /dev/null +++ test/CodeGen/AMDGPU/post-ra-sched-kill-bundle-use-inst.mir @@ -0,0 +1,42 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx900 -run-pass=post-RA-sched -verify-machineinstrs -o - %s | FileCheck %s + +# The scheduler was not inspecting the first instruction in the bundle +# when adding kill flags, so it would incorrectly mark the first use +# of $vgpr0 as killed. + +--- +name: kill_flag_use_first_bundle_inst +tracksRegLiveness: true +machineFunctionInfo: + isEntryFunction: true +body: | + bb.0: + liveins: $sgpr4_sgpr5, $sgpr7 + + ; CHECK-LABEL: name: kill_flag_use_first_bundle_inst + ; CHECK: liveins: $sgpr4_sgpr5, $sgpr7 + ; CHECK: renamable $sgpr0 = S_LOAD_DWORD_IMM killed renamable $sgpr4_sgpr5, 0, 0, 0 + ; CHECK: $m0 = S_MOV_B32 -1 + ; CHECK: $vgpr0 = V_MOV_B32_e32 killed $sgpr0, implicit $exec, implicit $exec + ; CHECK: BUNDLE implicit $vgpr0, implicit $m0, implicit $exec { + ; CHECK: DS_GWS_INIT $vgpr0, 8, -1, implicit $m0, implicit $exec + ; CHECK: S_WAITCNT 0 + ; CHECK: } + ; CHECK: BUNDLE implicit killed $vgpr0, implicit $m0, implicit $exec { + ; CHECK: DS_GWS_BARRIER killed $vgpr0, 8, -1, implicit $m0, implicit $exec + ; CHECK: S_WAITCNT 0 + ; CHECK: } + renamable $sgpr0 = S_LOAD_DWORD_IMM killed renamable $sgpr4_sgpr5, 0, 0, 0 + $m0 = S_MOV_B32 -1 + $vgpr0 = V_MOV_B32_e32 $sgpr0, implicit $exec, implicit $exec + BUNDLE implicit $vgpr0, implicit $m0, implicit $exec { + DS_GWS_INIT $vgpr0, 8, -1, implicit $m0, implicit $exec + S_WAITCNT 0 + } + BUNDLE implicit killed $vgpr0, implicit $m0, implicit $exec { + DS_GWS_BARRIER $vgpr0, 8, -1, implicit $m0, implicit $exec + S_WAITCNT 0 + } + +...