Skip to content

Commit e6723d8

Browse files
committed
llvm-reduce: Fix crashes on unreachable blocks for MIR instructions
1 parent 5630322 commit e6723d8

File tree

2 files changed

+54
-8
lines changed

2 files changed

+54
-8
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# REQUIRES: amdgpu-registered-target
2+
# RUN: llvm-reduce -simplify-mir -mtriple=amdgcn-amd-amdhsa --delta-passes=instructions --test FileCheck --test-arg --check-prefix=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t 2> %t.log
3+
# RUN: FileCheck --check-prefix=RESULT %s < %t
4+
5+
# Make sure there's no crash with unreachable blocks.
6+
7+
# CHECK-INTERESTINGNESS: S_NOP
8+
9+
# RESULT: bb.0:
10+
11+
# RESULT: %3:vgpr_32 = IMPLICIT_DEF
12+
# RESULT-NEXT: %4:sreg_64 = IMPLICIT_DEF
13+
# RESULT-NEXT: %5:vreg_64 = IMPLICIT_DEF
14+
# RESULT-NEXT: S_CBRANCH_SCC1 %bb.1, implicit undef $scc
15+
# RESULT-NEXT: S_BRANCH %bb.3
16+
17+
# RESULT: bb.1:
18+
# RESULT-NEXT: S_BRANCH %bb.3
19+
20+
# RESULT: bb.2:
21+
# RESULT-NEXT: S_NOP 0, implicit %3, implicit killed %5, implicit %4
22+
23+
---
24+
name: unreachable_block
25+
tracksRegLiveness: true
26+
body: |
27+
bb.0:
28+
%0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
29+
S_CBRANCH_SCC1 %bb.1, implicit undef $scc
30+
S_BRANCH %bb.3
31+
32+
bb.1:
33+
%1:sreg_64 = S_MOV_B64 0
34+
S_BRANCH %bb.3
35+
36+
bb.2:
37+
%2:vreg_64 = IMPLICIT_DEF
38+
S_NOP 0, implicit %0, implicit killed %2, implicit %1
39+
S_BRANCH %bb.3
40+
41+
bb.3:
42+
43+
...

llvm/tools/llvm-reduce/deltas/ReduceInstructionsMIR.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,14 +106,17 @@ static void extractInstrFromFunction(Oracle &O, MachineFunction &MF) {
106106
MachineBasicBlock::reverse_iterator RI(*MI);
107107
MachineBasicBlock *BB = MI->getParent();
108108
++RI;
109-
while (NewReg == 0 && BB) {
110-
NewReg = getPrevDefOfRCInMBB(*BB, RI, RegRC, RegTy, ToDelete);
111-
// Prepare for idom(BB).
112-
if (auto *IDM = MDT.getNode(BB)->getIDom()) {
113-
BB = IDM->getBlock();
114-
RI = BB->rbegin();
115-
} else {
116-
BB = nullptr;
109+
110+
if (MDT.isReachableFromEntry(BB)) {
111+
while (NewReg == 0 && BB) {
112+
NewReg = getPrevDefOfRCInMBB(*BB, RI, RegRC, RegTy, ToDelete);
113+
// Prepare for idom(BB).
114+
if (auto *IDM = MDT.getNode(BB)->getIDom()) {
115+
BB = IDM->getBlock();
116+
RI = BB->rbegin();
117+
} else {
118+
BB = nullptr;
119+
}
117120
}
118121
}
119122
}

0 commit comments

Comments
 (0)