Index: llvm/lib/CodeGen/MachineOutliner.cpp =================================================================== --- llvm/lib/CodeGen/MachineOutliner.cpp +++ llvm/lib/CodeGen/MachineOutliner.cpp @@ -654,6 +654,8 @@ OriginalMF->getFrameInstructions(); for (auto I = FirstCand.front(), E = std::next(FirstCand.back()); I != E; ++I) { + if (I->isDebugInstr()) + continue; MachineInstr *NewMI = MF.CloneMachineInstr(&*I); if (I->isCFIInstruction()) { unsigned CFIIndex = NewMI->getOperand(0).getCFIIndex(); Index: llvm/test/CodeGen/ARM/machine-outliner-remove-debug-instr.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/ARM/machine-outliner-remove-debug-instr.ll @@ -0,0 +1,95 @@ +; RUN: llc --verify-machineinstrs --stop-after=machine-outliner %s -o - | FileCheck %s +target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64" +target triple = "thumbv8.1m.main-unknown-unknown-eabi" + +; Derived from +; volatile int a, b, c, d, e, f, g, h; +; +; int x() { +; int r = (a + b) / (c + d) + e + f; +; return r + 1; +; } +; +; int y() { +; int r = (a + b) / (c + d) + e + f; +; return r + 2; +; } +; Checks that debug instructions are removed form the outlined function. + +; CHECK-LABEL: name: OUTLINED_FUNCTION_0 +; CHECK-NOT: DBG_VALUE + +@a = dso_local global i32 0, align 4 +@b = dso_local global i32 0, align 4 +@c = dso_local global i32 0, align 4 +@d = dso_local global i32 0, align 4 +@e = dso_local global i32 0, align 4 +@f = dso_local global i32 0, align 4 +@g = dso_local local_unnamed_addr global i32 0, align 4 +@h = dso_local local_unnamed_addr global i32 0, align 4 + +define dso_local i32 @x() local_unnamed_addr #0 !dbg !8 { +entry: + %0 = load volatile i32, i32* @a, align 4 + %1 = load volatile i32, i32* @b, align 4 + %add = add nsw i32 %1, %0 + %2 = load volatile i32, i32* @c, align 4 + %3 = load volatile i32, i32* @d, align 4 + %add1 = add nsw i32 %3, %2 + %div = sdiv i32 %add, %add1 + %4 = load volatile i32, i32* @e, align 4 + %5 = load volatile i32, i32* @f, align 4 + call void @llvm.dbg.value(metadata i32 undef, metadata !12, metadata !DIExpression()), !dbg !13 + %add2 = add i32 %div, 1 + %add3 = add i32 %add2, %4 + %add4 = add i32 %add3, %5 + ret i32 %add4 +} + +define dso_local i32 @y() local_unnamed_addr #0 !dbg !14 { +entry: + %0 = load volatile i32, i32* @a, align 4 + %1 = load volatile i32, i32* @b, align 4 + %add = add nsw i32 %1, %0 + %2 = load volatile i32, i32* @c, align 4 + %3 = load volatile i32, i32* @d, align 4 + %add1 = add nsw i32 %3, %2 + %div = sdiv i32 %add, %add1 + %4 = load volatile i32, i32* @e, align 4 + %5 = load volatile i32, i32* @f, align 4 + call void @llvm.dbg.value(metadata i32 undef, metadata !16, metadata !DIExpression()), !dbg !17 + %add2 = add i32 %div, 2 + %add3 = add i32 %add2, %4 + %add4 = add i32 %add3, %5 + ret i32 %add4 +} + +declare void @llvm.dbg.value(metadata, metadata, metadata) #1 + +attributes #0 = { minsize nofree norecurse nounwind optsize } +attributes #1 = { nounwind readnone speculatable willreturn } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!4, !5, !6, !7} + +!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !2, splitDebugInlining: false, nameTableKind: None) +!1 = !DIFile(filename: "test.c", directory: "build") +!2 = !{} +!3 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!4 = !{i32 7, !"Dwarf Version", i32 4} +!5 = !{i32 2, !"Debug Info Version", i32 3} +!6 = !{i32 1, !"wchar_size", i32 4} +!7 = !{i32 1, !"min_enum_size", i32 4} + +!8 = distinct !DISubprogram(name: "x", scope: !1, file: !1, line: 3, type: !9, scopeLine: 3, flags: DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !11) +!9 = !DISubroutineType(types: !10) +!10 = !{!3} +!11 = !{!12} +!12 = !DILocalVariable(name: "r", scope: !8, file: !1, line: 4, type: !3) + +!13 = !DILocation(line: 0, scope: !8) +!14 = distinct !DISubprogram(name: "y", scope: !1, file: !1, line: 9, type: !9, scopeLine: 9, flags: DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !15) +!15 = !{!16} +!16 = !DILocalVariable(name: "r", scope: !14, file: !1, line: 10, type: !3) +!17 = !DILocation(line: 0, scope: !14) +