Index: lib/CodeGen/CodeGenPrepare.cpp =================================================================== --- lib/CodeGen/CodeGenPrepare.cpp +++ lib/CodeGen/CodeGenPrepare.cpp @@ -1845,10 +1845,8 @@ // return is the first instruction in the block. if (PN) { BasicBlock::iterator BI = BB->begin(); - do { ++BI; } while (isa(BI)); - if (&*BI == BCI) - // Also skip over the bitcast. - ++BI; + // Skip over debug and the bitcast. + do { ++BI; } while (isa(BI) || &*BI == BCI); if (&*BI != RetI) return false; } else { Index: test/CodeGen/SystemZ/debuginstr-cgp.mir =================================================================== --- /dev/null +++ test/CodeGen/SystemZ/debuginstr-cgp.mir @@ -0,0 +1,171 @@ +# Check that the codegenprepare succeeds in dupRetToEnableTailCallOpts() also +# in the presence of a call to @llvm.dbg.value() +# +# RUN: llc %s -mtriple=s390x-linux-gnu -mcpu=z13 -start-before=codegenprepare \ +# RUN: -stop-after codegenprepare -o - | FileCheck %s +# +# CHECK-LABEL: bb2: +# CHECK: ret +# CHECK-LABEL: bb4: +# CHECK: ret + + +# Generated with: +# +# bin/llc -mtriple=s390x-linux-gnu -mcpu=z13 -stop-before codegenprepare -simplify-mir +# +# %0 = type { i32 (...)**, i16, %1* } +# %1 = type { i32 (...)** } +# %2 = type { i32 (...)**, %1*, i8, i32, i32, i32, i16, i32, i16, i32, i16*, %3*, %6*, %9 } +# %3 = type { %4 } +# %4 = type { i32 (...)**, i8, i32, i32, %5**, %1* } +# %5 = type { i32, i32 } +# %6 = type { %7*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %1* } +# %7 = type { %8 } +# %8 = type { i32 (...)**, i8, i32, i32, %0**, %1* } +# %9 = type { i8* } +# %10 = type { %0, i32, i32, %0* } +# +# define %0* @Fun(%2* %arg) !dbg !7 { +# bb: +# switch i32 undef, label %bb3 [ +# i32 58, label %bb1 +# i32 41, label %bb2 +# ], !dbg !14 +# +# bb1: ; preds = %bb +# br label %bb4, !dbg !15 +# +# bb2: ; preds = %bb +# %tmp = tail call %10* @hoge(%6* undef, %0* undef, i32 signext 0, i32 signext 0), !dbg !16 +# call void @llvm.dbg.value(metadata %10* %tmp, metadata !10, metadata !DIExpression()), !dbg !16 +# br label %bb4, !dbg !17 +# +# bb3: ; preds = %bb +# unreachable, !dbg !18 +# +# bb4: ; preds = %bb2, %bb1 +# %tmp5 = phi %10* [ undef, %bb1 ], [ %tmp, %bb2 ], !dbg !19 +# call void @llvm.dbg.value(metadata %10* %tmp5, metadata !12, metadata !DIExpression()), !dbg !19 +# %tmp6 = getelementptr inbounds %10, %10* %tmp5, i64 0, i32 0, !dbg !20 +# call void @llvm.dbg.value(metadata %0* %tmp6, metadata !13, metadata !DIExpression()), !dbg !20 +# ret %0* %tmp6, !dbg !21 +# } +# +# declare %10* @hoge(%6*, %0*, i32, i32) +# +# ; Function Attrs: nounwind readnone speculatable +# declare void @llvm.dbg.value(metadata, metadata, metadata) #1 +# +# attributes #0 = { "use-soft-float"="false" } +# attributes #1 = { nounwind readnone speculatable } +# +# !llvm.module.flags = !{!0, !1} +# !llvm.dbg.cu = !{!2} +# !llvm.debugify = !{!5, !6} +# +# !0 = !{i32 2, !"Debug Info Version", i32 3} +# !1 = !{i32 1, !"wchar_size", i32 4} +# !2 = distinct !DICompileUnit(language: DW_LANG_C, file: !3, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4) +# !3 = !DIFile(filename: "tc.ll", directory: "/") +# !4 = !{} +# !5 = !{i32 8} +# !6 = !{i32 3} +# !7 = distinct !DISubprogram(name: "eggs", linkageName: "eggs", scope: null, file: !3, line: 1, type: !8, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !9) +# !8 = !DISubroutineType(types: !4) +# !9 = !{!10, !12, !13} +# !10 = !DILocalVariable(name: "1", scope: !7, file: !3, line: 3, type: !11) +# !11 = !DIBasicType(name: "ty64", size: 64, encoding: DW_ATE_unsigned) +# !12 = !DILocalVariable(name: "2", scope: !7, file: !3, line: 6, type: !11) +# !13 = !DILocalVariable(name: "3", scope: !7, file: !3, line: 7, type: !11) +# !14 = !DILocation(line: 1, column: 1, scope: !7) +# !15 = !DILocation(line: 2, column: 1, scope: !7) +# !16 = !DILocation(line: 3, column: 1, scope: !7) +# !17 = !DILocation(line: 4, column: 1, scope: !7) +# !18 = !DILocation(line: 5, column: 1, scope: !7) +# !19 = !DILocation(line: 6, column: 1, scope: !7) +# !20 = !DILocation(line: 7, column: 1, scope: !7) +# !21 = !DILocation(line: 8, column: 1, scope: !7) + + +--- | + + %0 = type { i32 (...)**, i16, %1* } + %1 = type { i32 (...)** } + %2 = type { i32 (...)**, %1*, i8, i32, i32, i32, i16, i32, i16, i32, i16*, %3*, %6*, %9 } + %3 = type { %4 } + %4 = type { i32 (...)**, i8, i32, i32, %5**, %1* } + %5 = type { i32, i32 } + %6 = type { %7*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %0*, %1* } + %7 = type { %8 } + %8 = type { i32 (...)**, i8, i32, i32, %0**, %1* } + %9 = type { i8* } + %10 = type { %0, i32, i32, %0* } + + define %0* @Fun(%2* %arg) #0 !dbg !7 { + bb: + switch i32 undef, label %bb3 [ + i32 58, label %bb1 + i32 41, label %bb2 + ], !dbg !14 + + bb1: ; preds = %bb + br label %bb4, !dbg !15 + + bb2: ; preds = %bb + %tmp = tail call %10* @hoge(%6* undef, %0* undef, i32 signext 0, i32 signext 0), !dbg !16 + call void @llvm.dbg.value(metadata %10* %tmp, metadata !10, metadata !DIExpression()), !dbg !16 + br label %bb4, !dbg !17 + + bb3: ; preds = %bb + unreachable, !dbg !18 + + bb4: ; preds = %bb2, %bb1 + %tmp5 = phi %10* [ undef, %bb1 ], [ %tmp, %bb2 ], !dbg !19 + call void @llvm.dbg.value(metadata %10* %tmp5, metadata !12, metadata !DIExpression()), !dbg !19 + %tmp6 = getelementptr inbounds %10, %10* %tmp5, i64 0, i32 0, !dbg !20 + call void @llvm.dbg.value(metadata %0* %tmp6, metadata !13, metadata !DIExpression()), !dbg !20 + ret %0* %tmp6, !dbg !21 + } + + declare %10* @hoge(%6*, %0*, i32, i32) #0 + + ; Function Attrs: nounwind readnone speculatable + declare void @llvm.dbg.value(metadata, metadata, metadata) #1 + + attributes #0 = { "target-cpu"="z13" } + attributes #1 = { nounwind readnone speculatable "target-cpu"="z13" } + + !llvm.module.flags = !{!0, !1} + !llvm.dbg.cu = !{!2} + !llvm.debugify = !{!5, !6} + + !0 = !{i32 2, !"Debug Info Version", i32 3} + !1 = !{i32 1, !"wchar_size", i32 4} + !2 = distinct !DICompileUnit(language: DW_LANG_C, file: !3, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !4) + !3 = !DIFile(filename: "tc.ll", directory: "/") + !4 = !{} + !5 = !{i32 8} + !6 = !{i32 3} + !7 = distinct !DISubprogram(name: "eggs", linkageName: "eggs", scope: null, file: !3, line: 1, type: !8, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !2, retainedNodes: !9) + !8 = !DISubroutineType(types: !4) + !9 = !{!10, !12, !13} + !10 = !DILocalVariable(name: "1", scope: !7, file: !3, line: 3, type: !11) + !11 = !DIBasicType(name: "ty64", size: 64, encoding: DW_ATE_unsigned) + !12 = !DILocalVariable(name: "2", scope: !7, file: !3, line: 6, type: !11) + !13 = !DILocalVariable(name: "3", scope: !7, file: !3, line: 7, type: !11) + !14 = !DILocation(line: 1, column: 1, scope: !7) + !15 = !DILocation(line: 2, column: 1, scope: !7) + !16 = !DILocation(line: 3, column: 1, scope: !7) + !17 = !DILocation(line: 4, column: 1, scope: !7) + !18 = !DILocation(line: 5, column: 1, scope: !7) + !19 = !DILocation(line: 6, column: 1, scope: !7) + !20 = !DILocation(line: 7, column: 1, scope: !7) + !21 = !DILocation(line: 8, column: 1, scope: !7) + +... +--- +name: Fun +alignment: 4 +tracksRegLiveness: true +...