]> granicus.if.org Git - llvm/commitdiff
[GlobalISel] Emit DBG_VALUE %noreg for non-int/fp constant values.
authorAhmed Bougacha <ahmed.bougacha@gmail.com>
Tue, 7 Mar 2017 20:34:20 +0000 (20:34 +0000)
committerAhmed Bougacha <ahmed.bougacha@gmail.com>
Tue, 7 Mar 2017 20:34:20 +0000 (20:34 +0000)
When a dbg_value has a constant operand that isn't representable in MI,
there isn't much we can do.  Use %noreg (0) for those situations.
This matches the SelectionDAG behavior.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297200 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
test/CodeGen/AArch64/GlobalISel/debug-insts.ll

index 3614333037c43b91e78e49cb7e52ffdd033c211c..8630ef842b4a8e92c7f4cf2ac1c36158d048bc30 100644 (file)
@@ -137,8 +137,13 @@ MachineInstrBuilder MachineIRBuilder::buildConstDbgValue(const Constant &C,
       MIB.addCImm(CI);
     else
       MIB.addImm(CI->getZExtValue());
-  } else
+  } else if (auto *CFP = dyn_cast<ConstantFP>(&C)) {
+    assert(isa<ConstantFP>(C) && "Unexpected constant dbg value");
     MIB.addFPImm(&cast<ConstantFP>(C));
+  } else {
+    // Insert %noreg if we didn't find a usable constant and had to drop it.
+    MIB.addReg(0U);
+  }
 
   return MIB.addImm(Offset).addMetadata(Variable).addMetadata(Expr);
 }
index ffd2c0c68b107c3fc83bc00067eece5076ce9ec0..2c3def2e4a9ca45fc0173ea393acefbffcc9855c 100644 (file)
@@ -26,6 +26,8 @@ define void @debug_value(i32 %in) #0 !dbg !7 {
   call void @llvm.dbg.value(metadata i32 123, i64 0, metadata !11, metadata !12), !dbg !13
 ; CHECK: DBG_VALUE float 1.000000e+00, 0, !11, !12, debug-location !13
   call void @llvm.dbg.value(metadata float 1.000000e+00, i64 0, metadata !11, metadata !12), !dbg !13
+; CHECK: DBG_VALUE _, 0, !11, !12, debug-location !13
+  call void @llvm.dbg.value(metadata i32* null, i64 0, metadata !11, metadata !12), !dbg !13
   ret void
 }