Files
clang-p2996/llvm/test/Transforms/CodeGenPrepare/X86/catchpad-phi-cast.ll
Stephen Tozer 094572701d [RemoveDIs] Print IR with debug records by default (#91724)
This patch makes the final major change of the RemoveDIs project, changing the
default IR output from debug intrinsics to debug records. This is expected to
break a large number of tests: every single one that tests for uses or
declarations of debug intrinsics and does not explicitly disable writing
records. 

If this patch has broken your downstream tests (or upstream tests on a
configuration I wasn't able to run):
1. If you need to immediately unblock a build, pass
`--write-experimental-debuginfo=false` to LLVM's option processing for all
failing tests (remember to use `-mllvm` for clang/flang to forward arguments to
LLVM).
2. For most test failures, the changes are trivial and mechanical, enough that
they can be done by script; see the migration guide for a guide on how to do
this: https://llvm.org/docs/RemoveDIsDebugInfo.html#test-updates
3. If any tests fail for reasons other than FileCheck check lines that need
updating, such as assertion failures, that is most likely a real bug with this
patch and should be reported as such.

For more information, see the recent PSA:
https://discourse.llvm.org/t/psa-ir-output-changing-from-debug-intrinsics-to-debug-records/79578
2024-06-14 15:07:27 +01:00

115 lines
3.8 KiB
LLVM

; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -S < %s | FileCheck %s
; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -S < %s --try-experimental-debuginfo-iterators | FileCheck %s
; The following target lines are needed for the test to exercise what it should.
; Without these lines, CodeGenPrepare does not try to sink the bitcasts.
target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc"
declare i32 @__CxxFrameHandler3(...)
declare void @f()
declare void @g(ptr)
declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #2
; CodeGenPrepare will want to sink these bitcasts, but it selects the catchpad
; blocks as the place to which the bitcast should be sunk. Since catchpads
; do not allow non-phi instructions before the terminator, this isn't possible.
; CHECK-LABEL: @test(
define void @test(ptr %addr) personality ptr @__CxxFrameHandler3 {
entry:
%x = getelementptr i32, ptr %addr, i32 1
invoke void @f()
to label %invoke.cont unwind label %catch1
; CHECK: invoke.cont:
; CHECK-NEXT: %y = getelementptr i32, ptr %addr, i32 2
invoke.cont:
%y = getelementptr i32, ptr %addr, i32 2
invoke void @f()
to label %done unwind label %catch2
done:
ret void
catch1:
%cs1 = catchswitch within none [label %handler1] unwind to caller
handler1:
%cp1 = catchpad within %cs1 []
br label %catch.shared
; CHECK: handler1:
; CHECK-NEXT: catchpad within %cs1
catch2:
%cs2 = catchswitch within none [label %handler2] unwind to caller
handler2:
%cp2 = catchpad within %cs2 []
br label %catch.shared
; CHECK: handler2:
; CHECK: catchpad within %cs2
; CHECK: catch.shared:
; CHECK-NEXT: %p = phi ptr [ %x, %handler1 ], [ %y, %handler2 ]
catch.shared:
%p = phi ptr [ %x, %handler1 ], [ %y, %handler2 ]
call void @g(ptr %p)
unreachable
}
; CodeGenPrepare will want to hoist these llvm.dbg.value calls to the phi, but
; there is no insertion point in a catchpad block.
; CHECK-LABEL: @test_dbg_value(
define void @test_dbg_value() personality ptr @__CxxFrameHandler3 {
entry:
%a = alloca i8
%b = alloca i8
invoke void @f() to label %next unwind label %catch.dispatch
next:
invoke void @f() to label %ret unwind label %catch.dispatch
ret:
ret void
catch.dispatch:
%p = phi ptr [%a, %entry], [%b, %next]
%cs1 = catchswitch within none [label %catch] unwind to caller
catch:
%cp1 = catchpad within %cs1 []
tail call void @llvm.dbg.value(metadata ptr %p, i64 0, metadata !11, metadata !13), !dbg !14
call void @g(ptr %p)
catchret from %cp1 to label %ret
; CHECK: catch.dispatch:
; CHECK-NEXT: phi ptr
; CHECK-NEXT: catchswitch
; CHECK-NOT: #dbg_value
; CHECK: catch:
; CHECK-NEXT: catchpad
; CHECK-NEXT: #dbg_value
}
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!7, !8, !9}
!llvm.ident = !{!10}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 3.8.0 (trunk 254906) (llvm/trunk 254917)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: null)
!1 = !DIFile(filename: "t.c", directory: "D:\5Csrc\5Cllvm\5Cbuild")
!4 = distinct !DISubprogram(name: "test_dbg_value", scope: !1, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: false, unit: !0, retainedNodes: null)
!5 = !DISubroutineType(types: !6)
!6 = !{null}
!7 = !{i32 2, !"Dwarf Version", i32 4}
!8 = !{i32 2, !"Debug Info Version", i32 3}
!9 = !{i32 1, !"PIC Level", i32 2}
!10 = !{!"clang version 3.8.0 (trunk 254906) (llvm/trunk 254917)"}
!11 = !DILocalVariable(name: "p", scope: !4, file: !1, line: 2, type: !12)
!12 = !DIBasicType(name: "char", size: 8, align: 8, encoding: DW_ATE_signed_char)
!13 = !DIExpression(DW_OP_deref)
!14 = !DILocation(line: 2, column: 8, scope: !4)
!15 = !DILocation(line: 3, column: 1, scope: !4)