Skip to content

[DebugInfo][SimplifyIndVar] Missing debug location updates for overflow/saturation instructions #97987

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 10, 2024

Conversation

svs-quic
Copy link
Contributor

@svs-quic svs-quic commented Jul 8, 2024

Fixes #97986

@llvmbot
Copy link
Member

llvmbot commented Jul 8, 2024

@llvm/pr-subscribers-debuginfo

@llvm/pr-subscribers-llvm-transforms

Author: Sudharsan Veeravalli (svs-quic)

Changes

Fixes #97986


Full diff: https://github.com/llvm/llvm-project/pull/97987.diff

2 Files Affected:

  • (modified) llvm/lib/Transforms/Utils/SimplifyIndVar.cpp (+2)
  • (added) llvm/test/Transforms/IndVarSimplify/preserving-debugloc-sat-overflow.ll (+103)
diff --git a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
index e38505cbced34..5bda7c50c62c6 100644
--- a/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyIndVar.cpp
@@ -438,6 +438,7 @@ bool SimplifyIndvar::eliminateOverflowIntrinsic(WithOverflowInst *WO) {
       else {
         assert(EVI->getIndices()[0] == 0 && "Only two possibilities!");
         EVI->replaceAllUsesWith(NewResult);
+        NewResult->setDebugLoc(EVI->getDebugLoc());
       }
       ToDelete.push_back(EVI);
     }
@@ -467,6 +468,7 @@ bool SimplifyIndvar::eliminateSaturatingIntrinsic(SaturatingInst *SI) {
     BO->setHasNoUnsignedWrap();
 
   SI->replaceAllUsesWith(BO);
+  BO->setDebugLoc(SI->getDebugLoc());
   DeadInsts.emplace_back(SI);
   Changed = true;
   return true;
diff --git a/llvm/test/Transforms/IndVarSimplify/preserving-debugloc-sat-overflow.ll b/llvm/test/Transforms/IndVarSimplify/preserving-debugloc-sat-overflow.ll
new file mode 100644
index 0000000000000..f208c281e5fd0
--- /dev/null
+++ b/llvm/test/Transforms/IndVarSimplify/preserving-debugloc-sat-overflow.ll
@@ -0,0 +1,103 @@
+; Test that the debug information is propagated correctly to the new instructions
+; RUN: opt < %s -passes=indvars -S | FileCheck %s
+
+; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
+declare i32 @llvm.uadd.sat.i32(i32, i32) #0
+
+; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
+declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32) #0
+
+define void @f_uadd(ptr %a) !dbg !5 {
+; CHECK-LABEL: define void @f_uadd(
+; CHECK:    [[TMP0:%.*]] = add nuw nsw i32 [[I_04:%.*]], 1, !dbg [[DBG14:![0-9]+]]
+;
+entry:
+  br label %for.body, !dbg !8
+
+for.cond.cleanup:                                 ; preds = %cont
+  ret void, !dbg !9
+
+for.body:                                         ; preds = %cont, %entry
+  %i.04 = phi i32 [ 0, %entry ], [ %2, %cont ], !dbg !10
+  %idxprom = sext i32 %i.04 to i64, !dbg !11
+  %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom, !dbg !12
+  store i8 0, ptr %arrayidx, align 1, !dbg !13
+  %0 = tail call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %i.04, i32 1), !dbg !14
+  %1 = extractvalue { i32, i1 } %0, 1, !dbg !15
+  br i1 %1, label %trap, label %cont, !dbg !16, !nosanitize !7
+
+trap:                                             ; preds = %for.body
+  tail call void @llvm.trap(), !dbg !17, !nosanitize !7
+  unreachable, !dbg !18, !nosanitize !7
+
+cont:                                             ; preds = %for.body
+  %2 = extractvalue { i32, i1 } %0, 0, !dbg !19
+  %cmp = icmp slt i32 %2, 16, !dbg !20
+  br i1 %cmp, label %for.body, label %for.cond.cleanup, !dbg !21
+}
+
+define void @uadd_sat(ptr %p) !dbg !22 {
+; CHECK-LABEL: define void @uadd_sat(
+; CHECK:    [[SAT1:%.*]] = add nuw nsw i32 [[I:%.*]], 1, !dbg [[DBG23:![0-9]+]]
+;
+entry:
+  br label %loop, !dbg !23
+
+loop:                                             ; preds = %loop, %entry
+  %i = phi i32 [ 0, %entry ], [ %i.inc, %loop ], !dbg !24
+  %sat = call i32 @llvm.uadd.sat.i32(i32 %i, i32 1), !dbg !25
+  store volatile i32 %sat, ptr %p, align 4, !dbg !26
+  %i.inc = add nuw nsw i32 %i, 1, !dbg !27
+  %cmp = icmp ne i32 %i.inc, 100, !dbg !28
+  br i1 %cmp, label %loop, label %end, !dbg !29
+
+end:                                              ; preds = %loop
+  ret void, !dbg !30
+}
+
+; Function Attrs: cold noreturn nounwind memory(inaccessiblemem: write)
+declare void @llvm.trap() #1
+
+attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
+attributes #1 = { cold noreturn nounwind memory(inaccessiblemem: write) }
+
+!llvm.dbg.cu = !{!0}
+!llvm.debugify = !{!2, !3}
+!llvm.module.flags = !{!4}
+
+;.
+; CHECK: [[DBG14]] = !DILocation(line: 12,
+; CHECK: [[DBG23]] = !DILocation(line: 17,
+;.
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
+!1 = !DIFile(filename: "eliminatesat.ll", directory: "/")
+!2 = !{i32 22}
+!3 = !{i32 0}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = distinct !DISubprogram(name: "f_uadd", linkageName: "f_uadd", 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)
+!9 = !DILocation(line: 2, column: 1, scope: !5)
+!10 = !DILocation(line: 3, column: 1, scope: !5)
+!11 = !DILocation(line: 4, column: 1, scope: !5)
+!12 = !DILocation(line: 5, column: 1, scope: !5)
+!13 = !DILocation(line: 6, column: 1, scope: !5)
+!14 = !DILocation(line: 7, column: 1, scope: !5)
+!15 = !DILocation(line: 8, column: 1, scope: !5)
+!16 = !DILocation(line: 9, column: 1, scope: !5)
+!17 = !DILocation(line: 10, column: 1, scope: !5)
+!18 = !DILocation(line: 11, column: 1, scope: !5)
+!19 = !DILocation(line: 12, column: 1, scope: !5)
+!20 = !DILocation(line: 13, column: 1, scope: !5)
+!21 = !DILocation(line: 14, column: 1, scope: !5)
+!22 = distinct !DISubprogram(name: "uadd_sat", linkageName: "uadd_sat", scope: null, file: !1, line: 15, type: !6, scopeLine: 15, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
+!23 = !DILocation(line: 15, column: 1, scope: !22)
+!24 = !DILocation(line: 16, column: 1, scope: !22)
+!25 = !DILocation(line: 17, column: 1, scope: !22)
+!26 = !DILocation(line: 18, column: 1, scope: !22)
+!27 = !DILocation(line: 19, column: 1, scope: !22)
+!28 = !DILocation(line: 20, column: 1, scope: !22)
+!29 = !DILocation(line: 21, column: 1, scope: !22)
+!30 = !DILocation(line: 22, column: 1, scope: !22)

@svs-quic
Copy link
Contributor Author

svs-quic commented Jul 9, 2024

@OCHyams @jryans could you please review this patch?

Copy link
Member

@jryans jryans left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems reasonable to me, thanks! 😄

I'll aim to merge tomorrow if there's no other comments.

Copy link
Contributor

@OCHyams OCHyams left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm too 👍

@jryans jryans merged commit 27d4877 into llvm:main Jul 10, 2024
10 checks passed
aaryanshukla pushed a commit to aaryanshukla/llvm-project that referenced this pull request Jul 14, 2024
@svs-quic svs-quic deleted the indvar-sat-overflow branch July 15, 2024 08:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[DebugInfo][SimplifyIndVar] Missing debug location updates for overflow/saturation instructions
4 participants