Skip to content

Commit 2ca194f

Browse files
committed
[AMDGPU] Fix scheduler live-ins with debug inst at start of block
GCNDownwardRPTracker RPTracker.reset() skips debug instructions for NextMI so RPTracker.getNext() will never give the beginning of a sched region if it is a debug value. In this case we will never set the live-ins for that block. Add check to see if getNext also equals the MI after skipping debug instructions. Reviewed By: rampitec Differential Revision: https://reviews.llvm.org/D118853
1 parent 592f52d commit 2ca194f

File tree

2 files changed

+70
-3
lines changed

2 files changed

+70
-3
lines changed

llvm/lib/Target/AMDGPU/GCNSchedStrategy.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -493,14 +493,14 @@ void GCNScheduleDAGMILive::computeBlockPressure(const MachineBasicBlock *MBB) {
493493

494494
auto I = MBB->begin();
495495
auto LiveInIt = MBBLiveIns.find(MBB);
496+
auto &Rgn = Regions[CurRegion];
497+
auto *NonDbgMI = &*skipDebugInstructionsForward(Rgn.first, Rgn.second);
496498
if (LiveInIt != MBBLiveIns.end()) {
497499
auto LiveIn = std::move(LiveInIt->second);
498500
RPTracker.reset(*MBB->begin(), &LiveIn);
499501
MBBLiveIns.erase(LiveInIt);
500502
} else {
501-
auto &Rgn = Regions[CurRegion];
502503
I = Rgn.first;
503-
auto *NonDbgMI = &*skipDebugInstructionsForward(Rgn.first, Rgn.second);
504504
auto LRS = BBLiveInMap.lookup(NonDbgMI);
505505
#ifdef EXPENSIVE_CHECKS
506506
assert(isEqual(getLiveRegsBefore(*NonDbgMI, *LIS), LRS));
@@ -511,7 +511,7 @@ void GCNScheduleDAGMILive::computeBlockPressure(const MachineBasicBlock *MBB) {
511511
for ( ; ; ) {
512512
I = RPTracker.getNext();
513513

514-
if (Regions[CurRegion].first == I) {
514+
if (Regions[CurRegion].first == I || NonDbgMI == I) {
515515
LiveIns[CurRegion] = RPTracker.getLiveRegs();
516516
RPTracker.clearMaxPressure();
517517
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# RUN: llc -march=amdgcn -mcpu=gfx908 -run-pass=machine-scheduler %s -o - -debug-only=machine-scheduler 2>&1 | FileCheck %s
2+
# REQUIRES: asserts
3+
4+
# CHECK: ********** MI Scheduling **********
5+
# CHECK-NEXT: test_get_liveins:%bb.1
6+
# CHECK: Region live-in pressure: VGPRs: 1 AGPRs: 0, SGPRs: 0, LVGPR WT: 0, LSGPR WT: 0
7+
# CHECK: ScheduleDAGMILive::schedule starting
8+
9+
---
10+
name: test_get_liveins
11+
tracksRegLiveness: true
12+
frameInfo:
13+
hasCalls: true
14+
body: |
15+
bb.0:
16+
successors: %bb.1
17+
18+
%0:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 0, implicit $exec, implicit $mode, implicit-def $m0
19+
20+
bb.1:
21+
successors: %bb.2
22+
23+
DBG_VALUE %0:vgpr_32, 0, 0
24+
%1:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 1, implicit $exec, implicit $mode, implicit-def $m0
25+
%2:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 2, implicit $exec, implicit $mode, implicit-def $m0
26+
%3:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 3, implicit $exec, implicit $mode, implicit-def $m0
27+
%4:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 4, implicit $exec, implicit $mode, implicit-def $m0
28+
%5:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 5, implicit $exec, implicit $mode, implicit-def $m0
29+
%6:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 6, implicit $exec, implicit $mode, implicit-def $m0
30+
%7:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 7, implicit $exec, implicit $mode, implicit-def $m0
31+
%8:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 8, implicit $exec, implicit $mode, implicit-def $m0
32+
%9:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 9, implicit $exec, implicit $mode, implicit-def $m0
33+
%10:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 10, implicit $exec, implicit $mode, implicit-def $m0
34+
%11:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 11, implicit $exec, implicit $mode, implicit-def $m0
35+
%12:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 12, implicit $exec, implicit $mode, implicit-def $m0
36+
%13:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 13, implicit $exec, implicit $mode, implicit-def $m0
37+
%14:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 14, implicit $exec, implicit $mode, implicit-def $m0
38+
%15:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 15, implicit $exec, implicit $mode, implicit-def $m0
39+
%16:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 16, implicit $exec, implicit $mode, implicit-def $m0
40+
%17:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 17, implicit $exec, implicit $mode, implicit-def $m0
41+
%18:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 18, implicit $exec, implicit $mode, implicit-def $m0
42+
%19:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 19, implicit $exec, implicit $mode, implicit-def $m0
43+
%20:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 20, implicit $exec, implicit $mode, implicit-def $m0
44+
%21:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 21, implicit $exec, implicit $mode, implicit-def $m0
45+
%22:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 22, implicit $exec, implicit $mode, implicit-def $m0
46+
%23:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 23, implicit $exec, implicit $mode, implicit-def $m0
47+
%24:vgpr_32 = nofpexcept V_CVT_I32_F64_e32 24, implicit $exec, implicit $mode, implicit-def $m0
48+
49+
bb.2:
50+
DBG_VALUE %24:vgpr_32, 0, 0
51+
S_NOP 0, implicit %0
52+
S_NOP 0, implicit %1, implicit %2
53+
S_NOP 0, implicit %3, implicit %4
54+
S_NOP 0, implicit %5, implicit %6
55+
S_NOP 0, implicit %7, implicit %8
56+
S_NOP 0, implicit %9, implicit %10
57+
S_NOP 0, implicit %11, implicit %12
58+
S_NOP 0, implicit %13, implicit %14
59+
S_NOP 0, implicit %15, implicit %16
60+
S_NOP 0, implicit %17, implicit %18
61+
S_NOP 0, implicit %19, implicit %20
62+
S_NOP 0, implicit %21, implicit %22
63+
S_NOP 0, implicit %23, implicit %23
64+
S_NOP 0, implicit %24
65+
S_ENDPGM 0
66+
...
67+

0 commit comments

Comments
 (0)