https://github.com/vikramRH updated https://github.com/llvm/llvm-project/pull/176691
>From a72b7e1b6c0c08df1cc6ac1d6a7ef90d07e06dc6 Mon Sep 17 00:00:00 2001 From: vikhegde <[email protected]> Date: Fri, 16 Jan 2026 14:34:55 +0530 Subject: [PATCH 1/2] [AMDGPU] Fix DomTree preservation in SILowerControlFlow when nodes are deleted --- llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp | 5 ++ ...i-lower-control-flow-preserve-dom-tree.mir | 59 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 llvm/test/CodeGen/AMDGPU/si-lower-control-flow-preserve-dom-tree.mir diff --git a/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp b/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp index bb912be85de74..9cc86e84407b1 100644 --- a/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp +++ b/llvm/lib/Target/AMDGPU/SILowerControlFlow.cpp @@ -744,6 +744,11 @@ bool SILowerControlFlow::removeMBBifRedundant(MachineBasicBlock &MBB) { if (PDT) PDT->applyUpdates(DTUpdates); + if (MDT && MDT->getNode(&MBB)) + MDT->eraseNode(&MBB); + if (PDT && PDT->getNode(&MBB)) + PDT->eraseNode(&MBB); + MBB.clear(); MBB.eraseFromParent(); if (FallThrough && !FallThrough->isLayoutSuccessor(Succ)) { diff --git a/llvm/test/CodeGen/AMDGPU/si-lower-control-flow-preserve-dom-tree.mir b/llvm/test/CodeGen/AMDGPU/si-lower-control-flow-preserve-dom-tree.mir new file mode 100644 index 0000000000000..0760bdfee43d7 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/si-lower-control-flow-preserve-dom-tree.mir @@ -0,0 +1,59 @@ +# RUN: llc -o /dev/null -mcpu=gfx1201 -mtriple=amdgcn-amd-amdhsa -passes="require<machine-post-dom-tree>,si-lower-control-flow,print<machine-post-dom-tree>" %s 2>&1 | FileCheck %s + +# CHECK: Inorder PostDominator Tree: +# CHECK-NEXT: [1] <<exit node>> {4294967295,4294967295} [0] +# CHECK-NEXT: [2] %bb.4 {4294967295,4294967295} [1] +# CHECK-NEXT: [3] %bb.2 {4294967295,4294967295} [2] +# CHECK-NEXT: [3] %bb.0 {4294967295,4294967295} [2] +# CHECK-NEXT: [3] %bb.1 {4294967295,4294967295} [2] + +--- +name: preserve_dom_tree +body: | + bb.0.entry: + successors: %bb.1(0x40000000), %bb.4(0x40000000) + liveins: $vgpr0, $sgpr0_sgpr1, $ttmp9 + + %6:sreg_32 = COPY $ttmp9 + %5:sgpr_64(p4) = COPY killed $sgpr0_sgpr1 + %4:vgpr_32(s32) = COPY killed $vgpr0 + %0:sgpr_128 = S_LOAD_DWORDX4_IMM %5(p4), 0, 0 + %7:sreg_32_xm0_xexec = S_LOAD_DWORD_IMM killed %5(p4), 28, 0 + %10:sreg_64_xexec_xnull = REG_SEQUENCE %0.sub2, %subreg.sub0, %0.sub3, %subreg.sub1 + %12:sreg_32 = S_AND_B32 killed %7, 65535, implicit-def dead $scc + %39:vreg_64 = REG_SEQUENCE killed %4(s32), %subreg.sub0, undef %40:vgpr_32, %subreg.sub1 + %16:vreg_64, $sgpr_null = V_MAD_U64_U32_e64 killed %6, killed %12, killed %39, 0, implicit $exec + %20:vgpr_32 = GLOBAL_LOAD_UBYTE_SADDR killed %10, killed %16.sub0, 0, 0, implicit $exec + %21:vgpr_32 = V_AND_B32_e64 1, killed %20, implicit $exec + %22:sreg_32 = V_CMP_EQ_U32_e64 1, killed %21, implicit $exec + %1:sreg_32 = SI_IF killed %22, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec + S_BRANCH %bb.1 + + bb.1: + successors: %bb.2(0x40000000), %bb.3(0x40000000) + + %23:sreg_32 = COPY $exec_lo + %25:vgpr_32 = V_MBCNT_LO_U32_B32_e64 %23, 0, implicit $exec + %26:sreg_32 = V_CMP_EQ_U32_e64 0, killed %25, implicit $exec + %3:sreg_32 = SI_IF killed %26, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec + S_BRANCH %bb.2 + + bb.2: + successors: %bb.3(0x80000000) + + %27:sreg_32 = S_BCNT1_I32_B32 killed %23, implicit-def dead $scc + %28:vgpr_32 = V_CVT_F32_UBYTE0_e64 killed %27, 0, 0, implicit $exec + %38:vgpr_32 = nofpexcept V_MUL_F32_e64 0, 1092616192, 0, killed %28, 0, 0, implicit $mode, implicit $exec + %34:sreg_64_xexec_xnull = REG_SEQUENCE killed %0.sub0, %subreg.sub0, %0.sub1, %subreg.sub1 + %35:vgpr_32 = V_MOV_B32_e32 0, implicit $exec + GLOBAL_ATOMIC_ADD_F32_SADDR killed %35, killed %38, killed %34, 0, 0, implicit $exec + + bb.3: + successors: %bb.4(0x80000000) + + SI_END_CF killed %3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec + + bb.4: + SI_END_CF killed %1, implicit-def dead $exec, implicit-def dead $scc, implicit $exec + S_ENDPGM 0 +... >From 33255f569266c290f4312a506e9a0749de863f48 Mon Sep 17 00:00:00 2001 From: vikhegde <[email protected]> Date: Tue, 20 Jan 2026 15:29:41 +0530 Subject: [PATCH 2/2] review comments --- ...i-lower-control-flow-preserve-dom-tree.mir | 68 ++++++++++--------- 1 file changed, 37 insertions(+), 31 deletions(-) diff --git a/llvm/test/CodeGen/AMDGPU/si-lower-control-flow-preserve-dom-tree.mir b/llvm/test/CodeGen/AMDGPU/si-lower-control-flow-preserve-dom-tree.mir index 0760bdfee43d7..1ef3d63a0496d 100644 --- a/llvm/test/CodeGen/AMDGPU/si-lower-control-flow-preserve-dom-tree.mir +++ b/llvm/test/CodeGen/AMDGPU/si-lower-control-flow-preserve-dom-tree.mir @@ -1,11 +1,17 @@ -# RUN: llc -o /dev/null -mcpu=gfx1201 -mtriple=amdgcn-amd-amdhsa -passes="require<machine-post-dom-tree>,si-lower-control-flow,print<machine-post-dom-tree>" %s 2>&1 | FileCheck %s +# RUN: llc -mcpu=gfx1201 -mtriple=amdgcn-amd-amdhsa -passes="require<machine-post-dom-tree>,require<machine-dom-tree>,si-lower-control-flow,print<machine-post-dom-tree>,print<machine-dom-tree>" -filetype=null %s 2>&1 | FileCheck %s # CHECK: Inorder PostDominator Tree: -# CHECK-NEXT: [1] <<exit node>> {4294967295,4294967295} [0] -# CHECK-NEXT: [2] %bb.4 {4294967295,4294967295} [1] -# CHECK-NEXT: [3] %bb.2 {4294967295,4294967295} [2] -# CHECK-NEXT: [3] %bb.0 {4294967295,4294967295} [2] -# CHECK-NEXT: [3] %bb.1 {4294967295,4294967295} [2] +# CHECK-NEXT: [1] <<exit node>> {4294967295,4294967295} [0] +# CHECK-NEXT: [2] %bb.4 {4294967295,4294967295} [1] +# CHECK-NEXT: [3] %bb.0 {4294967295,4294967295} [2] +# CHECK-NEXT: [3] %bb.1 {4294967295,4294967295} [2] +# CHECK-NEXT: [3] %bb.2 {4294967295,4294967295} [2] + +# CHECK: Inorder Dominator Tree: +# CHECK-NEXT: [1] %bb.0 {4294967295,4294967295} [0] +# CHECK-NEXT: [2] %bb.1 {4294967295,4294967295} [1] +# CHECK-NEXT: [3] %bb.2 {4294967295,4294967295} [2] +# CHECK-NEXT: [2] %bb.4 {4294967295,4294967295} [1] --- name: preserve_dom_tree @@ -14,46 +20,46 @@ body: | successors: %bb.1(0x40000000), %bb.4(0x40000000) liveins: $vgpr0, $sgpr0_sgpr1, $ttmp9 - %6:sreg_32 = COPY $ttmp9 - %5:sgpr_64(p4) = COPY killed $sgpr0_sgpr1 - %4:vgpr_32(s32) = COPY killed $vgpr0 - %0:sgpr_128 = S_LOAD_DWORDX4_IMM %5(p4), 0, 0 - %7:sreg_32_xm0_xexec = S_LOAD_DWORD_IMM killed %5(p4), 28, 0 - %10:sreg_64_xexec_xnull = REG_SEQUENCE %0.sub2, %subreg.sub0, %0.sub3, %subreg.sub1 - %12:sreg_32 = S_AND_B32 killed %7, 65535, implicit-def dead $scc - %39:vreg_64 = REG_SEQUENCE killed %4(s32), %subreg.sub0, undef %40:vgpr_32, %subreg.sub1 - %16:vreg_64, $sgpr_null = V_MAD_U64_U32_e64 killed %6, killed %12, killed %39, 0, implicit $exec - %20:vgpr_32 = GLOBAL_LOAD_UBYTE_SADDR killed %10, killed %16.sub0, 0, 0, implicit $exec - %21:vgpr_32 = V_AND_B32_e64 1, killed %20, implicit $exec - %22:sreg_32 = V_CMP_EQ_U32_e64 1, killed %21, implicit $exec - %1:sreg_32 = SI_IF killed %22, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec + %0:sreg_32 = COPY $ttmp9 + %1:sgpr_64 = COPY killed $sgpr0_sgpr1 + %2:vgpr_32 = COPY killed $vgpr0 + %3:sgpr_128 = S_LOAD_DWORDX4_IMM %1, 0, 0 + %4:sreg_32_xm0_xexec = S_LOAD_DWORD_IMM killed %1, 28, 0 + %5:sreg_64_xexec_xnull = REG_SEQUENCE %3.sub2, %subreg.sub0, %3.sub3, %subreg.sub1 + %6:sreg_32 = S_AND_B32 killed %4, 65535, implicit-def dead $scc + %7:vreg_64 = REG_SEQUENCE killed %2(s32), %subreg.sub0, undef %8:vgpr_32, %subreg.sub1 + %9:vreg_64, $sgpr_null = V_MAD_U64_U32_e64 killed %0, killed %6, killed %7, 0, implicit $exec + %10:vgpr_32 = GLOBAL_LOAD_UBYTE_SADDR killed %5, killed %9.sub0, 0, 0, implicit $exec + %11:vgpr_32 = V_AND_B32_e64 1, killed %10, implicit $exec + %12:sreg_32 = V_CMP_EQ_U32_e64 1, killed %11, implicit $exec + %13:sreg_32 = SI_IF killed %12, %bb.4, implicit-def dead $exec, implicit-def dead $scc, implicit $exec S_BRANCH %bb.1 bb.1: successors: %bb.2(0x40000000), %bb.3(0x40000000) - %23:sreg_32 = COPY $exec_lo - %25:vgpr_32 = V_MBCNT_LO_U32_B32_e64 %23, 0, implicit $exec - %26:sreg_32 = V_CMP_EQ_U32_e64 0, killed %25, implicit $exec - %3:sreg_32 = SI_IF killed %26, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec + %14:sreg_32 = COPY $exec_lo + %15:vgpr_32 = V_MBCNT_LO_U32_B32_e64 %14, 0, implicit $exec + %16:sreg_32 = V_CMP_EQ_U32_e64 0, killed %15, implicit $exec + %17:sreg_32 = SI_IF killed %16, %bb.3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec S_BRANCH %bb.2 bb.2: successors: %bb.3(0x80000000) - %27:sreg_32 = S_BCNT1_I32_B32 killed %23, implicit-def dead $scc - %28:vgpr_32 = V_CVT_F32_UBYTE0_e64 killed %27, 0, 0, implicit $exec - %38:vgpr_32 = nofpexcept V_MUL_F32_e64 0, 1092616192, 0, killed %28, 0, 0, implicit $mode, implicit $exec - %34:sreg_64_xexec_xnull = REG_SEQUENCE killed %0.sub0, %subreg.sub0, %0.sub1, %subreg.sub1 - %35:vgpr_32 = V_MOV_B32_e32 0, implicit $exec - GLOBAL_ATOMIC_ADD_F32_SADDR killed %35, killed %38, killed %34, 0, 0, implicit $exec + %18:sreg_32 = S_BCNT1_I32_B32 killed %14, implicit-def dead $scc + %19:vgpr_32 = V_CVT_F32_UBYTE0_e64 killed %18, 0, 0, implicit $exec + %20:vgpr_32 = nofpexcept V_MUL_F32_e64 0, 1092616192, 0, killed %19, 0, 0, implicit $mode, implicit $exec + %21:sreg_64_xexec_xnull = REG_SEQUENCE killed %3.sub0, %subreg.sub0, %3.sub1, %subreg.sub1 + %22:vgpr_32 = V_MOV_B32_e32 0, implicit $exec + GLOBAL_ATOMIC_ADD_F32_SADDR killed %22, killed %20, killed %21, 0, 0, implicit $exec bb.3: successors: %bb.4(0x80000000) - SI_END_CF killed %3, implicit-def dead $exec, implicit-def dead $scc, implicit $exec + SI_END_CF killed %17, implicit-def dead $exec, implicit-def dead $scc, implicit $exec bb.4: - SI_END_CF killed %1, implicit-def dead $exec, implicit-def dead $scc, implicit $exec + SI_END_CF killed %13, implicit-def dead $exec, implicit-def dead $scc, implicit $exec S_ENDPGM 0 ... _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
