[llvm] 60d0bc1 - Propagate DebugLocs on phis in BreakCriticalEdges (#133492)

via llvm-commits llvm-commits at lists.llvm.org
Thu May 8 05:01:52 PDT 2025


Author: Orlando Cazalet-Hyams
Date: 2025-05-08T13:01:48+01:00
New Revision: 60d0bc1faeacb8be8ef38457bce0a4f0674bc575

URL: https://github.com/llvm/llvm-project/commit/60d0bc1faeacb8be8ef38457bce0a4f0674bc575
DIFF: https://github.com/llvm/llvm-project/commit/60d0bc1faeacb8be8ef38457bce0a4f0674bc575.diff

LOG: Propagate DebugLocs on phis in BreakCriticalEdges (#133492)

The pull request discusses whether this change is needed or not. We leant
towards "it can't hurt" on the basis that it's at worst slightly unecessary
(but not incorret).

The motivation for the patch came from reviewing code duplication sites to
update for Key Instructions, finding this, trying to generate a test case and
seeing the DebugLocs aren't propagated.

Added: 
    llvm/test/Transforms/CodeGenPrepare/X86/split-dbg.ll

Modified: 
    llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp b/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
index 0721358eb03bb..aea47aec7bb80 100644
--- a/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
+++ b/llvm/lib/Transforms/Utils/BreakCriticalEdges.cpp
@@ -454,6 +454,7 @@ bool llvm::SplitIndirectBrCriticalEdges(Function &F,
       PHINode *NewIndPHI = PHINode::Create(IndPHI->getType(), 1, "ind", InsertPt);
       NewIndPHI->addIncoming(IndPHI->getIncomingValueForBlock(IBRPred),
                              IBRPred);
+      NewIndPHI->setDebugLoc(IndPHI->getDebugLoc());
 
       // Create a PHI in the body block, to merge the direct and indirect
       // predecessors.
@@ -461,6 +462,8 @@ bool llvm::SplitIndirectBrCriticalEdges(Function &F,
       MergePHI->insertBefore(MergeInsert);
       MergePHI->addIncoming(NewIndPHI, Target);
       MergePHI->addIncoming(DirPHI, DirectSucc);
+      MergePHI->applyMergedLocation(DirPHI->getDebugLoc(),
+                                    IndPHI->getDebugLoc());
 
       IndPHI->replaceAllUsesWith(MergePHI);
       IndPHI->eraseFromParent();

diff  --git a/llvm/test/Transforms/CodeGenPrepare/X86/split-dbg.ll b/llvm/test/Transforms/CodeGenPrepare/X86/split-dbg.ll
new file mode 100644
index 0000000000000..50ff35da175ad
--- /dev/null
+++ b/llvm/test/Transforms/CodeGenPrepare/X86/split-dbg.ll
@@ -0,0 +1,51 @@
+; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -S -mtriple=x86_64 < %s \
+; RUN: | FileCheck %s
+
+;; Check debug locations are propagated onto new PHIs.
+
+; CHECK: .split:
+; CHECK-NEXT: %merge = phi i32 [ poison, %while.body ], [ %dest.sroa.clone, %while.body.clone ], !dbg [[DBG:!.*]]
+
+; CHECK: while.body.clone:
+; CHECK-NEXT: %dest.sroa.clone = phi i32 [ %1, %.split ], [ poison, %if.else ], !dbg [[DBG]]
+
+; CHECK: [[DBG]] = !DILocation(line: 1, column: 1, scope: ![[#]])
+
+define void @test(i1 %c) !dbg !5 {
+entry:
+  br label %if.else
+
+if.else:                                          ; preds = %if.else1, %entry
+  br i1 %c, label %while.body, label %preheader
+
+preheader:                                        ; preds = %if.else
+  br label %if.else1
+
+if.then:                                          ; preds = %if.else1
+  unreachable
+
+while.body:                                       ; preds = %if.else1, %while.body, %if.else
+  %dest.sroa = phi i32 [ %1, %while.body ], [ poison, %if.else1 ], [ poison, %if.else ], !dbg !8
+  %0 = inttoptr i32 %dest.sroa to ptr
+  %incdec.ptr = getelementptr inbounds i8, ptr %0, i32 -1
+  %1 = ptrtoint ptr %incdec.ptr to i32
+  store i8 0, ptr %incdec.ptr, align 1
+  br label %while.body
+
+if.else1:                                         ; preds = %if.else1, %preheader
+  indirectbr ptr poison, [label %if.then, label %while.body, label %if.else, label %if.else1]
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.debugify = !{!2, !3}
+!llvm.module.flags = !{!4}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
+!1 = !DIFile(filename: "test.ll", directory: "/")
+!2 = !{i32 11}
+!3 = !{i32 0}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = distinct !DISubprogram(name: "test", linkageName: "test", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
+!6 = !DISubroutineType(types: !7)
+!7 = !{}
+!8 = !DILocation(line: 1, column: 1, scope: !5)


        


More information about the llvm-commits mailing list