[llvm] 5971b41 - [DebugInfo][LICM] Salvage dbg_values for the dead instructions to erase (#138796)
via llvm-commits
llvm-commits at lists.llvm.org
Sun May 11 18:07:33 PDT 2025
Author: Shan Huang
Date: 2025-05-12T09:07:30+08:00
New Revision: 5971b419199942fd8023070f81f37499d4d4738b
URL: https://github.com/llvm/llvm-project/commit/5971b419199942fd8023070f81f37499d4d4738b
DIFF: https://github.com/llvm/llvm-project/commit/5971b419199942fd8023070f81f37499d4d4738b.diff
LOG: [DebugInfo][LICM] Salvage dbg_values for the dead instructions to erase (#138796)
fix #138684 .
Added:
llvm/test/Transforms/LICM/salvage-hoisted-add.ll
llvm/test/Transforms/LICM/salvage-hoisted-binop.ll
llvm/test/Transforms/LICM/salvage-hoisted-gep.ll
llvm/test/Transforms/LICM/salvage-hoisted-sub.ll
Modified:
llvm/lib/Transforms/Scalar/LICM.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp
index 42bccc858cdaa..62ef40c686874 100644
--- a/llvm/lib/Transforms/Scalar/LICM.cpp
+++ b/llvm/lib/Transforms/Scalar/LICM.cpp
@@ -2538,6 +2538,7 @@ static bool hoistGEP(Instruction &I, Loop &L, ICFLoopSafetyInfo &SafetyInfo,
IsInBounds);
GEP->replaceAllUsesWith(NewGEP);
eraseInstruction(*GEP, SafetyInfo, MSSAU);
+ salvageDebugInfo(*Src);
eraseInstruction(*Src, SafetyInfo, MSSAU);
return true;
}
@@ -2592,7 +2593,10 @@ static bool hoistAdd(ICmpInst::Predicate Pred, Value *VariantLHS,
ICmp.setPredicate(Pred);
ICmp.setOperand(0, VariantOp);
ICmp.setOperand(1, NewCmpOp);
- eraseInstruction(cast<Instruction>(*VariantLHS), SafetyInfo, MSSAU);
+
+ Instruction &DeadI = cast<Instruction>(*VariantLHS);
+ salvageDebugInfo(DeadI);
+ eraseInstruction(DeadI, SafetyInfo, MSSAU);
return true;
}
@@ -2670,7 +2674,10 @@ static bool hoistSub(ICmpInst::Predicate Pred, Value *VariantLHS,
ICmp.setPredicate(Pred);
ICmp.setOperand(0, VariantOp);
ICmp.setOperand(1, NewCmpOp);
- eraseInstruction(cast<Instruction>(*VariantLHS), SafetyInfo, MSSAU);
+
+ Instruction &DeadI = cast<Instruction>(*VariantLHS);
+ salvageDebugInfo(DeadI);
+ eraseInstruction(DeadI, SafetyInfo, MSSAU);
return true;
}
@@ -2877,8 +2884,10 @@ static bool hoistBOAssociation(Instruction &I, Loop &L,
// (LV op C1) might not be erased if it has more uses than the one we just
// replaced.
- if (BO0->use_empty())
+ if (BO0->use_empty()) {
+ salvageDebugInfo(*BO0);
eraseInstruction(*BO0, SafetyInfo, MSSAU);
+ }
return true;
}
diff --git a/llvm/test/Transforms/LICM/salvage-hoisted-add.ll b/llvm/test/Transforms/LICM/salvage-hoisted-add.ll
new file mode 100644
index 0000000000000..1bc5802d5997c
--- /dev/null
+++ b/llvm/test/Transforms/LICM/salvage-hoisted-add.ll
@@ -0,0 +1,70 @@
+; RUN: opt -S -passes=licm %s | FileCheck %s
+
+; Check that hoistAdd() in LICM salvages the dbg_value for the hoisted add
+; instruction.
+
+define i32 @hoist_add(ptr %p, ptr %x_p, ptr %length_p) !dbg !5 {
+; CHECK-LABEL: define i32 @hoist_add(
+; CHECK-LABEL: loop:
+; CHECK: #dbg_value(!DIArgList(i32 [[X:%.*]], i32 [[IV:%.*]]), [[META9:![0-9]+]], !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_stack_value), [[META16:![0-9]+]])
+;
+entry:
+ %x = load i32, ptr %x_p, align 4, !dbg !20, !range !21
+ %length = load i32, ptr %length_p, align 4, !dbg !22, !range !21
+ br label %loop, !dbg !23
+
+loop: ; preds = %backedge, %entry
+ %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ], !dbg !24
+ %arith = add nsw i32 %x, %iv, !dbg !25
+ #dbg_value(i32 %arith, !13, !DIExpression(), !25)
+ %x_check = icmp slt i32 %arith, 4, !dbg !26
+ br i1 %x_check, label %out_of_bounds, label %backedge, !dbg !27
+
+backedge: ; preds = %loop
+ %el.ptr = getelementptr i32, ptr %p, i32 %iv, !dbg !28
+ store i32 1, ptr %el.ptr, align 4, !dbg !29
+ %iv.next = add nuw nsw i32 %iv, 4, !dbg !30
+ %loop_cond = icmp slt i32 %iv.next, %length, !dbg !31
+ br i1 %loop_cond, label %loop, label %exit, !dbg !32
+
+exit: ; preds = %backedge
+ ret i32 %iv.next, !dbg !33
+
+out_of_bounds: ; preds = %loop
+ ret i32 -1, !dbg !34
+}
+
+!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: "salvage-hoisted-add", directory: "/")
+!2 = !{i32 14}
+!3 = !{i32 8}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = distinct !DISubprogram(name: "hoist_add", linkageName: "hoist_add", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
+!6 = !DISubroutineType(types: !7)
+!7 = !{}
+!8 = !{!13}
+!10 = !DIBasicType(name: "ty32", size: 32, encoding: DW_ATE_unsigned)
+!13 = !DILocalVariable(name: "4", scope: !5, file: !1, line: 5, type: !10)
+!20 = !DILocation(line: 1, column: 1, scope: !5)
+!21 = !{i32 0, i32 -2147483648}
+!22 = !DILocation(line: 2, column: 1, scope: !5)
+!23 = !DILocation(line: 3, column: 1, scope: !5)
+!24 = !DILocation(line: 4, column: 1, scope: !5)
+!25 = !DILocation(line: 5, column: 1, scope: !5)
+!26 = !DILocation(line: 6, column: 1, scope: !5)
+!27 = !DILocation(line: 7, column: 1, scope: !5)
+!28 = !DILocation(line: 8, column: 1, scope: !5)
+!29 = !DILocation(line: 9, column: 1, scope: !5)
+!30 = !DILocation(line: 10, column: 1, scope: !5)
+!31 = !DILocation(line: 11, column: 1, scope: !5)
+!32 = !DILocation(line: 12, column: 1, scope: !5)
+!33 = !DILocation(line: 13, column: 1, scope: !5)
+!34 = !DILocation(line: 14, column: 1, scope: !5)
+;.
+; CHECK: [[META9]] = !DILocalVariable(name: "4",
+; CHECK: [[META16]] = !DILocation(line: 5, column: 1,
+;.
diff --git a/llvm/test/Transforms/LICM/salvage-hoisted-binop.ll b/llvm/test/Transforms/LICM/salvage-hoisted-binop.ll
new file mode 100644
index 0000000000000..3a40fa1532048
--- /dev/null
+++ b/llvm/test/Transforms/LICM/salvage-hoisted-binop.ll
@@ -0,0 +1,45 @@
+; RUN: opt -S -passes=licm %s | FileCheck %s
+
+; Check that hoistBOAssociation() in LICM salvages the dbg_value for the
+; hoisted binary operation.
+
+define void @hoist_binop(i64 %c1, i64 %c2) !dbg !5 {
+; CHECK-LABEL: define void @hoist_binop(
+; CHECK-LABEL: loop:
+; CHECK: #dbg_value(!DIArgList(i64 [[INDEX:%.*]], i64 [[C1:%.*]]), [[META9:![0-9]+]], !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_stack_value), [[META13:![0-9]+]])
+;
+entry:
+ br label %loop, !dbg !13
+
+loop: ; preds = %loop, %entry
+ %index = phi i64 [ 0, %entry ], [ %index.next, %loop ], !dbg !14
+ %step.add = add i64 %index, %c1, !dbg !15
+ #dbg_value(i64 %step.add, !11, !DIExpression(), !15)
+ %index.next = add i64 %step.add, %c2, !dbg !16
+ br label %loop, !dbg !17
+}
+
+!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: "salvage-hoist-binop.ll", directory: "/")
+!2 = !{i32 5}
+!3 = !{i32 3}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = distinct !DISubprogram(name: "hoist_binop", linkageName: "hoist_binop", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
+!6 = !DISubroutineType(types: !7)
+!7 = !{}
+!8 = !{!11}
+!10 = !DIBasicType(name: "ty64", size: 64, encoding: DW_ATE_unsigned)
+!11 = !DILocalVariable(name: "2", scope: !5, file: !1, line: 3, type: !10)
+!13 = !DILocation(line: 1, column: 1, scope: !5)
+!14 = !DILocation(line: 2, column: 1, scope: !5)
+!15 = !DILocation(line: 3, column: 1, scope: !5)
+!16 = !DILocation(line: 4, column: 1, scope: !5)
+!17 = !DILocation(line: 5, column: 1, scope: !5)
+;.
+; CHECK: [[META9]] = !DILocalVariable(name: "2",
+; CHECK: [[META13]] = !DILocation(line: 3, column: 1,
+;.
diff --git a/llvm/test/Transforms/LICM/salvage-hoisted-gep.ll b/llvm/test/Transforms/LICM/salvage-hoisted-gep.ll
new file mode 100644
index 0000000000000..316f81db822cc
--- /dev/null
+++ b/llvm/test/Transforms/LICM/salvage-hoisted-gep.ll
@@ -0,0 +1,58 @@
+; RUN: opt -S -passes=licm %s | FileCheck %s
+
+; Check that hoistGEP() in LICM salvages the dbg_value for the hoisted
+; getelementptr instruction.
+
+define void @hoist_gep(ptr %ptr, i1 %c, i32 %arg) !dbg !5 {
+; CHECK-LABEL: define void @hoist_gep(
+; CHECK-LABEL: loop:
+; CHECK: #dbg_value(!DIArgList(ptr [[PTR:%.*]], i64 [[VAL_EXT:%.*]]), [[META9:![0-9]+]], !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_stack_value), [[META15:![0-9]+]])
+;
+entry:
+ %arg.ext = zext i32 %arg to i64, !dbg !16
+ br label %loop, !dbg !17
+
+loop: ; preds = %loop, %entry
+ %val = call i32 @get.i32(), !dbg !18
+ %val.ext = zext i32 %val to i64, !dbg !19
+ %ptr2 = getelementptr inbounds i8, ptr %ptr, i64 %val.ext, !dbg !20
+ #dbg_value(ptr %ptr2, !14, !DIExpression(), !20)
+ %ptr3 = getelementptr i8, ptr %ptr2, i64 %arg.ext, !dbg !21
+ call void @use(ptr %ptr3), !dbg !22
+ br i1 %c, label %loop, label %exit, !dbg !23
+
+exit: ; preds = %loop
+ ret void, !dbg !24
+}
+
+declare i32 @get.i32()
+declare void @use(ptr)
+
+!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: "salvage-hoisted-gep.ll", directory: "/")
+!2 = !{i32 9}
+!3 = !{i32 5}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = distinct !DISubprogram(name: "hoist_gep", linkageName: "hoist_gep", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
+!6 = !DISubroutineType(types: !7)
+!7 = !{}
+!8 = !{!14}
+!10 = !DIBasicType(name: "ty64", size: 64, encoding: DW_ATE_unsigned)
+!14 = !DILocalVariable(name: "4", scope: !5, file: !1, line: 5, type: !10)
+!16 = !DILocation(line: 1, column: 1, scope: !5)
+!17 = !DILocation(line: 2, column: 1, scope: !5)
+!18 = !DILocation(line: 3, column: 1, scope: !5)
+!19 = !DILocation(line: 4, column: 1, scope: !5)
+!20 = !DILocation(line: 5, column: 1, scope: !5)
+!21 = !DILocation(line: 6, column: 1, scope: !5)
+!22 = !DILocation(line: 7, column: 1, scope: !5)
+!23 = !DILocation(line: 8, column: 1, scope: !5)
+!24 = !DILocation(line: 9, column: 1, scope: !5)
+;.
+; CHECK: [[META9]] = !DILocalVariable(name: "4",
+; CHECK: [[META15]] = !DILocation(line: 5,
+;.
diff --git a/llvm/test/Transforms/LICM/salvage-hoisted-sub.ll b/llvm/test/Transforms/LICM/salvage-hoisted-sub.ll
new file mode 100644
index 0000000000000..60f9f2b91a52d
--- /dev/null
+++ b/llvm/test/Transforms/LICM/salvage-hoisted-sub.ll
@@ -0,0 +1,70 @@
+; RUN: opt -S -passes=licm %s | FileCheck %s
+
+; Check that hoistSub() in LICM salvages the dbg_value for the hoisted sub
+; instruction.
+
+define i32 @hoist_sub(ptr %p, ptr %x_p, ptr %length_p) !dbg !5 {
+; CHECK-LABEL: define i32 @hoist_sub(
+; CHECK-LABEL: loop:
+; CHECK: #dbg_value(!DIArgList(i32 [[X:%.*]], i32 [[IV:%.*]]), [[META9:![0-9]+]], !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_minus, DW_OP_stack_value), [[META16:![0-9]+]])
+;
+entry:
+ %x = load i32, ptr %x_p, align 4, !dbg !20, !range !21
+ %length = load i32, ptr %length_p, align 4, !dbg !22, !range !21
+ br label %loop, !dbg !23
+
+loop: ; preds = %backedge, %entry
+ %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ], !dbg !24
+ %arith = sub nsw i32 %x, %iv, !dbg !25
+ #dbg_value(i32 %arith, !13, !DIExpression(), !25)
+ %x_check = icmp slt i32 %arith, 4, !dbg !26
+ br i1 %x_check, label %out_of_bounds, label %backedge, !dbg !27
+
+backedge: ; preds = %loop
+ %el.ptr = getelementptr i32, ptr %p, i32 %iv, !dbg !28
+ store i32 1, ptr %el.ptr, align 4, !dbg !29
+ %iv.next = add nuw nsw i32 %iv, 4, !dbg !30
+ %loop_cond = icmp slt i32 %iv.next, %length, !dbg !31
+ br i1 %loop_cond, label %loop, label %exit, !dbg !32
+
+exit: ; preds = %backedge
+ ret i32 %iv.next, !dbg !33
+
+out_of_bounds: ; preds = %loop
+ ret i32 -1, !dbg !34
+}
+
+!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: "salvage-hoisted-sub.ll", directory: "/")
+!2 = !{i32 14}
+!3 = !{i32 8}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = distinct !DISubprogram(name: "hoist_sub", linkageName: "hoist_sub", scope: null, file: !1, line: 1, type: !6, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
+!6 = !DISubroutineType(types: !7)
+!7 = !{}
+!8 = !{!13}
+!10 = !DIBasicType(name: "ty32", size: 32, encoding: DW_ATE_unsigned)
+!13 = !DILocalVariable(name: "4", scope: !5, file: !1, line: 5, type: !10)
+!20 = !DILocation(line: 1, column: 1, scope: !5)
+!21 = !{i32 0, i32 -2147483648}
+!22 = !DILocation(line: 2, column: 1, scope: !5)
+!23 = !DILocation(line: 3, column: 1, scope: !5)
+!24 = !DILocation(line: 4, column: 1, scope: !5)
+!25 = !DILocation(line: 5, column: 1, scope: !5)
+!26 = !DILocation(line: 6, column: 1, scope: !5)
+!27 = !DILocation(line: 7, column: 1, scope: !5)
+!28 = !DILocation(line: 8, column: 1, scope: !5)
+!29 = !DILocation(line: 9, column: 1, scope: !5)
+!30 = !DILocation(line: 10, column: 1, scope: !5)
+!31 = !DILocation(line: 11, column: 1, scope: !5)
+!32 = !DILocation(line: 12, column: 1, scope: !5)
+!33 = !DILocation(line: 13, column: 1, scope: !5)
+!34 = !DILocation(line: 14, column: 1, scope: !5)
+;.
+; CHECK: [[META9]] = !DILocalVariable(name: "4",
+; CHECK: [[META16]] = !DILocation(line: 5, column: 1,
+;.
More information about the llvm-commits
mailing list