llvm-project/llvm/test/Transforms/LoopUnroll/preserve-branch-debuglocs.ll
Stephen Tozer 92e0fb0c94
[DebugInfo][LoopUnroll] Preserve DebugLocs on optimized cond branches (#114225)
This patch fixes a simple error where as part of loop unrolling we
optimize conditional loop-exiting branches into unconditional branches
when we know that they will or won't exit the loop, but does not
propagate the source location of the original branch to the new one.

Found using https://github.com/llvm/llvm-project/pull/107279.
2024-11-08 16:52:30 +00:00

53 lines
2.6 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --version 5
; RUN: opt < %s -passes=loop-unroll -S | FileCheck %s
; RUN: opt < %s -passes=loop-unroll-full -S | FileCheck %s
;; Loop Unrolling should preserve the DebugLocs of conditional branches that get
;; optimized into unconditional branches.
define i32 @_ZeqRK4int3S1_() {
; CHECK-LABEL: define i32 @_ZeqRK4int3S1_() {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
; CHECK: [[FOR_COND:.*]]:
; CHECK-NEXT: br label %[[CLEANUP:.*]], !dbg [[DBG3:![0-9]+]]
; CHECK: [[FOR_BODY]]:
; CHECK-NEXT: br i1 false, label %[[FOR_COND]], label %[[CLEANUP]]
; CHECK: [[CLEANUP]]:
; CHECK-NEXT: ret i32 0
;
entry:
br label %for.body
for.cond: ; preds = %for.body
br i1 false, label %cleanup, label %for.body, !dbg !3
for.body: ; preds = %for.cond, %entry
br i1 false, label %for.cond, label %cleanup
cleanup: ; preds = %for.body, %for.cond
ret i32 0
}
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!2}
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 20.0.0git", isOptimized: true, runtimeVersion: 0, emissionKind: NoDebug)
!1 = !DIFile(filename: "test.cpp", directory: "/tmp")
!2 = !{i32 2, !"Debug Info Version", i32 3}
!3 = !DILocation(line: 304, column: 2, scope: !4)
!4 = distinct !DILexicalBlock(scope: !5, file: !1, line: 304, column: 2)
!5 = distinct !DISubprogram(name: "operator==", linkageName: "_ZeqRK4int3S1_", scope: !1, file: !1, line: 302, type: !6, scopeLine: 303, spFlags: DISPFlagDefinition, unit: !0)
!6 = distinct !DISubroutineType(types: !7)
!7 = !{}
;.
; CHECK: [[META0:![0-9]+]] = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: [[META1:![0-9]+]], producer: "{{.*}}clang version {{.*}}", isOptimized: true, runtimeVersion: 0, emissionKind: NoDebug)
; CHECK: [[META1]] = !DIFile(filename: "test.cpp", directory: {{.*}})
; CHECK: [[META2:![0-9]+]] = !{i32 2, !"Debug Info Version", i32 3}
; CHECK: [[DBG3]] = !DILocation(line: 304, column: 2, scope: [[META4:![0-9]+]])
; CHECK: [[META4]] = distinct !DILexicalBlock(scope: [[META5:![0-9]+]], file: [[META1]], line: 304, column: 2)
; CHECK: [[META5]] = distinct !DISubprogram(name: "operator==", linkageName: "_ZeqRK4int3S1_", scope: [[META1]], file: [[META1]], line: 302, type: [[META6:![0-9]+]], scopeLine: 303, spFlags: DISPFlagDefinition, unit: [[META0]])
; CHECK: [[META6]] = distinct !DISubroutineType(types: [[META7:![0-9]+]])
; CHECK: [[META7]] = !{}
;.