[llvm] [DebugInfo][SimpleLoopUnswitch] Fix missing debug location updates for new terminators (PR #98789)
Orlando Cazalet-Hyams via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 15 03:02:42 PDT 2024
================
@@ -0,0 +1,98 @@
+; RUN: opt -passes='loop(simple-loop-unswitch)' -S < %s | FileCheck %s
+; RUN: opt -passes='loop-mssa(simple-loop-unswitch)' -S < %s | FileCheck %s
+
+; Check that SimpleLoopUnswitch's unswitchTrivialBranch() and unswitchTrivialSwitch()
+; propagates debug locations to the new terminators replacing the old ones.
+
+define i32 @test1(ptr %var, i1 %cond1, i1 %cond2) !dbg !5 {
+; CHECK-LABEL: define i32 @test1(
+; CHECK: loop_begin:
+; CHECK-NEXT: br label %[[CONTINUE:.*]], !dbg [[DBG8:![0-9]+]]
+;
+entry:
+ br label %loop_begin, !dbg !8
+
+loop_begin: ; preds = %do_something, %entry
+ br i1 %cond1, label %continue, label %loop_exit, !dbg !9
+
+continue: ; preds = %loop_begin
+ %var_val = load i32, ptr %var, align 4, !dbg !10
+ br i1 %cond2, label %do_something, label %loop_exit, !dbg !11
+
+do_something: ; preds = %continue
+ call void @some_func(), !dbg !12
+ br label %loop_begin, !dbg !13
+
+loop_exit: ; preds = %continue, %loop_begin
+ ret i32 0, !dbg !14
+}
+
+define i32 @test7(i32 %cond1, i32 %x, i32 %y) !dbg !15 {
+; CHECK-LABEL: define i32 @test7(
+; CHECK-SAME: i32 [[COND1:%.*]], i32 [[X:%.*]], i32 [[Y:%.*]])
+; CHECK-NEXT: entry:
+; CHECK-NEXT: switch i32 [[COND1]], label %[[ENTRY_SPLIT:.*]] [
+; CHECK-NEXT: i32 0, label %[[LOOP_EXIT:.*]]
+; CHECK-NEXT: i32 1, label %[[LOOP_EXIT]]
+; CHECK-NEXT: ], !dbg [[DBG16:![0-9]+]]
----------------
OCHyams wrote:
I think I'd like a second opinion on this one (I think this is similar to the previous loop unswitch question). AFAICT in this example the pass is rearranging the loop such that it is essentially hoisting this loop-invariant switch out the loop - this patch has the switch take the source location from the branch it replaces but I wonder if instead drop the source location (use `dropLocation` to create a line zero dbgloc).
cc @SLTozer / @jmorse
In [HowToUpdateDebugInfo](https://llvm.org/docs/HowToUpdateDebugInfo.html) we have:
> LICM. E.g., if an instruction is moved from the loop body to the preheader, the rule for dropping locations applies.
https://github.com/llvm/llvm-project/pull/98789
More information about the llvm-commits
mailing list