Index: llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/InstrEmitter.cpp @@ -749,6 +749,9 @@ MIB.addImm(CI->getSExtValue()); } else if (const ConstantFP *CF = dyn_cast(V)) { MIB.addFPImm(CF); + } else if (isa(V)) { + // Note: This assumes that all nullptr constants are zero-valued. + MIB.addImm(0); } else { // Could be an Undef. In any case insert an Undef so we can see what we // dropped. Index: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -5312,7 +5312,8 @@ return nullptr; SDDbgValue *SDV; - if (isa(V) || isa(V) || isa(V)) { + if (isa(V) || isa(V) || isa(V) || + isa(V)) { SDV = DAG.getConstantDbgValue(Variable, Expression, V, dl, SDNodeOrder); DAG.AddDbgValue(SDV, nullptr, false); return nullptr; Index: llvm/trunk/test/DebugInfo/X86/sdag-dangling-dbgvalue.ll =================================================================== --- llvm/trunk/test/DebugInfo/X86/sdag-dangling-dbgvalue.ll +++ llvm/trunk/test/DebugInfo/X86/sdag-dangling-dbgvalue.ll @@ -63,9 +63,9 @@ @S = global %struct.SS { i32 23, i32 -17 }, align 4, !dbg !0 ; Verify that the def comes before the for foo1. -; TODO: Currently dbg.value for bar1 is dropped(?), is that expected? define i32 @test1() local_unnamed_addr #0 !dbg !17 { ; CHECK-LABEL: bb.0.entry1 +; CHECK-NEXT: DBG_VALUE 0, $noreg, ![[BAR1]], !DIExpression() ; CHECK-NEXT: [[REG1:%[0-9]+]]:gr64 = ; CHECK-NEXT: DBG_VALUE [[REG1]], $noreg, ![[FOO1]], !DIExpression() entry1: @@ -99,11 +99,9 @@ } ; Verify that the def comes before the for bar4. -; TODO: Currently dbg.value for foo4 is dropped. It is set to null and not -; used. Just like in test1 it can be discussed if there should be a -; DBG_VALUE for foo4 here. define i32 @test4() local_unnamed_addr #0 !dbg !40 { ; CHECK-LABEL: bb.0.entry4 +; CHECK-NEXT: DBG_VALUE 0, $noreg, ![[FOO4]], !DIExpression() ; CHECK-NEXT: [[REG4:%[0-9]+]]:gr64 = ; CHECK-NEXT: DBG_VALUE [[REG4]], $noreg, ![[BAR4]], !DIExpression() entry4: @@ -114,10 +112,9 @@ } ; Verify that we do not get a DBG_VALUE that maps foo5 to @S here. -; TODO: foo5 is set to null, and it is not really used. Just like in test1 it -; can be discussed if there should be a DBG_VALUE for foo5 here. define i32 @test5() local_unnamed_addr #0 !dbg !47 { ; CHECK-LABEL: bb.0.entry5: +; CHECK-NEXT: DBG_VALUE 0, $noreg, ![[FOO5]], !DIExpression() ; CHECK-NEXT: [[REG5:%[0-9]+]]:gr64 = ; CHECK-NEXT: DBG_VALUE [[REG5]], $noreg, ![[BAR5]], !DIExpression() ; CHECK-NOT: DBG_VALUE [[REG5]], $noreg, ![[FOO5]], !DIExpression()