[CGP] Reimplement r255055 a different way

llvm-svn: 255070
This commit is contained in:
Reid Kleckner 2015-12-08 23:00:03 +00:00
parent d87e4354a7
commit 8de1fe23ed
2 changed files with 61 additions and 0 deletions

View File

@ -5251,6 +5251,10 @@ bool CodeGenPrepare::placeDbgValues(Function &F) {
Instruction *VI = dyn_cast_or_null<Instruction>(DVI->getValue());
if (VI && VI != PrevNonDbgInst && !VI->isTerminator()) {
// If VI is a phi in a block with an EHPad terminator, we can't insert
// after it.
if (isa<PHINode>(VI) && VI->getParent()->getTerminator()->isEHPad())
continue;
DEBUG(dbgs() << "Moving Debug Value before :\n" << *DVI << ' ' << *VI);
DVI->removeFromParent();
if (isa<PHINode>(VI))

View File

@ -10,6 +10,7 @@ declare i32 @__CxxFrameHandler3(...)
declare void @f()
declare void @g(i8*)
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
@ -57,3 +58,59 @@ catchend1:
catchend2:
catchendpad unwind to caller
}
; 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 i32 (...)* @__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 i8* [%a, %entry], [%b, %next]
%cp1 = catchpad [] to label %catch unwind label %catchend
catch:
tail call void @llvm.dbg.value(metadata i8* %p, i64 0, metadata !11, metadata !13), !dbg !14
invoke void @g(i8* %p) to label %catchret unwind label %catchend
catchret:
catchret %cp1 to label %ret
; CHECK: catch.dispatch:
; CHECK-NEXT: phi i8
; CHECK-NEXT: catchpad
; CHECK-NOT: llvm.dbg.value
; CHECK: catch:
; CHECK-NEXT: call void @llvm.dbg.value
catchend:
catchendpad unwind to caller
}
!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: 1, enums: null, subprograms: !3)
!1 = !DIFile(filename: "t.c", directory: "D:\5Csrc\5Cllvm\5Cbuild")
!3 = !{!4}
!4 = distinct !DISubprogram(name: "test_dbg_value", scope: !1, file: !1, line: 1, type: !5, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: false, variables: 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()
!14 = !DILocation(line: 2, column: 8, scope: !4)
!15 = !DILocation(line: 3, column: 1, scope: !4)