Skip to content

Commit 4dcb42f

Browse files
committed
AMDGPU: Skip unexpected CFG in SIOptimizeVGPRLiveRange
There are some cases that we use si_if/si_else in unatural way. Just skip them. Fixes: llvm#55922 Reviewed by: critson Differential Revision: https://reviews.llvm.org/D128193
1 parent 810b5c4 commit 4dcb42f

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

llvm/lib/Target/AMDGPU/SIOptimizeVGPRLiveRange.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,6 +647,10 @@ bool SIOptimizeVGPRLiveRange::runOnMachineFunction(MachineFunction &MF) {
647647
if (!Endif)
648648
continue;
649649

650+
// Skip unexpected control flow.
651+
if (!MDT->dominates(&MBB, IfTarget) || !MDT->dominates(IfTarget, Endif))
652+
continue;
653+
650654
SmallSetVector<MachineBasicBlock *, 16> ElseBlocks;
651655
SmallVector<Register> CandidateRegs;
652656

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx90a -verify-machineinstrs -run-pass=si-opt-vgpr-liverange -o - %s | FileCheck %s
2+
#
3+
# This is a very rare case which comes from llvm-reduce. The SI_IF/SI_ELSE usage is quite different from normal.
4+
#
5+
# CHECK-LABEL: name: unusual_if_else
6+
---
7+
name: unusual_if_else
8+
tracksRegLiveness: true
9+
machineFunctionInfo:
10+
scratchRSrcReg: '$sgpr0_sgpr1_sgpr2_sgpr3'
11+
stackPtrOffsetReg: '$sgpr32'
12+
body: |
13+
bb.0:
14+
successors: %bb.1(0x80000000)
15+
16+
%0:sreg_32 = S_ADD_U32 undef %1.sub0:sgpr_64, 32, implicit-def $scc
17+
%2:sreg_32 = S_ADDC_U32 undef %1.sub1:sgpr_64, 0, implicit-def dead $scc, implicit killed $scc
18+
%3:sreg_64 = REG_SEQUENCE killed %0, %subreg.sub0, killed %2, %subreg.sub1
19+
%4:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
20+
21+
bb.1:
22+
successors: %bb.2(0x40000000), %bb.4(0x40000000)
23+
24+
%5:sreg_64 = V_CMP_LT_I32_e64 0, %4, implicit $exec
25+
%6:sreg_64 = SI_IF killed %5, %bb.2, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
26+
S_BRANCH %bb.4
27+
28+
bb.2:
29+
successors: %bb.4(0x40000000), %bb.3(0x40000000)
30+
31+
dead %7:sreg_64 = SI_ELSE killed %6, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
32+
S_BRANCH %bb.3
33+
34+
bb.3:
35+
successors: %bb.4(0x80000000)
36+
37+
%8:sreg_64 = V_CMP_EQ_U32_e64 0, killed %4, implicit $exec
38+
dead %9:sreg_64 = SI_IF killed %8, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec
39+
S_BRANCH %bb.4
40+
41+
bb.4:
42+
43+
...

0 commit comments

Comments
 (0)