Index: lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp =================================================================== --- lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp +++ lib/CodeGen/SelectionDAG/ScheduleDAGSDNodes.cpp @@ -704,8 +704,8 @@ if (!N->getHasDebugValue()) return; - // Opportunistically insert immediate dbg_value uses, i.e. those with source - // order number right after the N. + // Opportunistically insert immediate dbg_value uses, i.e. those with the same + // source order number as N. MachineBasicBlock *BB = Emitter.getBlock(); MachineBasicBlock::iterator InsertPos = Emitter.getInsertPos(); ArrayRef DVs = DAG->GetDbgValues(N); @@ -713,7 +713,7 @@ if (DVs[i]->isInvalidated()) continue; unsigned DVOrder = DVs[i]->getOrder(); - if (!Order || DVOrder == ++Order) { + if (!Order || DVOrder == Order) { MachineInstr *DbgMI = Emitter.EmitDbgValue(DVs[i], VRBaseMap); if (DbgMI) { Orders.push_back(std::make_pair(DVOrder, DbgMI)); Index: lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp =================================================================== --- lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -973,7 +973,9 @@ HandlePHINodesInSuccessorBlocks(I.getParent()); } - ++SDNodeOrder; + // Increase the SDNodeOrder if dealing with a non-debug instruction + if (!isa(I) && !isa(I)) + ++SDNodeOrder; CurInst = &I; Index: test/DebugInfo/Generic/selectiondag-order.ll =================================================================== --- /dev/null +++ test/DebugInfo/Generic/selectiondag-order.ll @@ -0,0 +1,70 @@ +;RUN: llc %s -O1 -o - | FileCheck %s + +; Functions fn1_dbg and fn1_no_dbg are identical with the exception of one +; llvm.dbg.value in fn1_dbg. The generated instruction should be identical. +; However currently we just check the first pushq. + +@c = local_unnamed_addr global i16 0 + +;CHECK-LABEL: @fn1_dbg +;CHECK: pushq [[REG:.*]] +define i16 @fn1_dbg() { +bb1: + %_tmp1 = tail call i16 bitcast (i16 (...) * @fn2 to i16 () *)() + tail call void @llvm.dbg.value(metadata i16 0, i64 0, metadata !8, metadata !DIExpression()), !dbg !6 + br label %bb2.preheader.i + +bb4.i: + %_tmp25.i = add nuw nsw i16 %j.5.08.i, 1 + %exitcond11.i = icmp eq i16 %_tmp25.i, 4 + br i1 %exitcond11.i, label %fn3.exit, label %bb2.preheader.i + +bb2.preheader.i: + %j.5.08.i = phi i16 [ 0, %bb1 ], [ %_tmp25.i, %bb4.i ] + br label %bb4.i + +fn3.exit: + store i16 %_tmp1, i16* @c, align 1 + ret i16 0 +} + +;CHECK-LABEL: @fn1_no_dbg +;CHECK: pushq [[REG]] +define i16 @fn1_no_dbg() { +bb1: + %_tmp1 = tail call i16 bitcast (i16 (...) * @fn2 to i16 () *)() + br label %bb2.preheader.i + +bb4.i: + %_tmp25.i = add nuw nsw i16 %j.5.08.i, 1 + %exitcond11.i = icmp eq i16 %_tmp25.i, 4 + br i1 %exitcond11.i, label %fn3.exit, label %bb2.preheader.i + +bb2.preheader.i: + %j.5.08.i = phi i16 [ 0, %bb1 ], [ %_tmp25.i, %bb4.i ] + br label %bb4.i + +fn3.exit: + store i16 %_tmp1, i16* @c, align 1 + ret i16 0 +} + +declare i16 @fn2(...) local_unnamed_addr + +; Function Attrs: nounwind readnone +declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #0 + +attributes #0 = { nounwind readnone } + +!llvm.dbg.cu = !{!2} +!llvm.module.flags = !{!3, !4} + +!1 = !DIFile(filename: "foo.c", directory: "/tmp") +!2 = distinct !DICompileUnit(language: DW_LANG_C, file: !1) +!3 = !{i32 2, !"Dwarf Version", i32 4} +!4 = !{i32 2, !"Debug Info Version", i32 3} + +!5 = distinct !DISubprogram(name: "fn1_dbg", unit: !2) +!6 = distinct !DILocation(line: 8, scope: !5) +!7 = !DIBasicType(name: "int", size: 16, align: 16, encoding: DW_ATE_signed) +!8 = !DILocalVariable(name: "j", scope: !5, type: !7)