[DebugInfo] Replace UndefValue with PoisonValue in AssignmentTrackingAnalysis
authorOCHyams <orlando.hyams@sony.com>
Thu, 12 Jan 2023 09:51:08 +0000 (09:51 +0000)
committerOCHyams <orlando.hyams@sony.com>
Thu, 12 Jan 2023 09:51:45 +0000 (09:51 +0000)
This helps towards the effort to remove UndefValue from LLVM.

Related to https://discourse.llvm.org/t/auto-undef-debug-uses-of-a-deleted-value

Reviewed By: scott.linder

Differential Revision: https://reviews.llvm.org/D140906

llvm/docs/AssignmentTracking.md
llvm/lib/CodeGen/AssignmentTrackingAnalysis.cpp

index 4f07f2d..9698740 100644 (file)
@@ -63,9 +63,11 @@ void @llvm.dbg.assign(Value *Value,
 
 The first three parameters look and behave like an `llvm.dbg.value`. `ID` is a
 reference to a store (see next section). `Address` is the destination address
-of the store and it is modified by `AddressExpression`. LLVM currently encodes
-variable fragment information in `DIExpression`s, so as an implementation quirk
-the `FragmentInfo` for `Variable` is contained within `ValueExpression` only.
+of the store and it is modified by `AddressExpression`. An empty/undef/poison
+address means the address component has been killed (the memory address is no
+longer a valid location). LLVM currently encodes variable fragment information
+in `DIExpression`s, so as an implementation quirk the `FragmentInfo` for
+`Variable` is contained within `ValueExpression` only.
 
 The formal LLVM-IR signature is:
 ```
index bf421a4..ba51c3b 100644 (file)
@@ -1239,10 +1239,8 @@ void AssignmentTrackingLowering::emitDbgValue(
   DILocation *DL = Source->getDebugLoc();
   auto Emit = [this, Source, After, DL](Value *Val, DIExpression *Expr) {
     assert(Expr);
-    // It's possible that getVariableLocationOp(0) is null. Occurs in
-    // llvm/test/DebugInfo/Generic/2010-05-03-OriginDIE.ll Treat it as undef.
     if (!Val)
-      Val = UndefValue::get(Type::getInt1Ty(Source->getContext()));
+      Val = PoisonValue::get(Type::getInt1Ty(Source->getContext()));
 
     // Find a suitable insert point.
     Instruction *InsertBefore = After->getNextNode();
@@ -1289,16 +1287,13 @@ void AssignmentTrackingLowering::emitDbgValue(
   if (Kind == LocKind::Val) {
     /// Get the value component, converting to Undef if it is variadic.
     Value *Val =
-        Source->hasArgList()
-            ? UndefValue::get(Source->getVariableLocationOp(0)->getType())
-            : Source->getVariableLocationOp(0);
+        Source->hasArgList() ? nullptr : Source->getVariableLocationOp(0);
     Emit(Val, Source->getExpression());
     return;
   }
 
   if (Kind == LocKind::None) {
-    Value *Val = UndefValue::get(Source->getVariableLocationOp(0)->getType());
-    Emit(Val, Source->getExpression());
+    Emit(nullptr, Source->getExpression());
     return;
   }
 }
@@ -2111,13 +2106,11 @@ bool AssignmentTrackingLowering::emitPromotedVarLocs(
         continue;
       // Wrapper to get a single value (or undef) from DVI.
       auto GetValue = [DVI]() -> Value * {
-        // Conditions for undef: Any operand undef, zero operands or single
-        // operand is nullptr. We also can't handle variadic DIExpressions yet.
-        // Some of those conditions don't have a type we can pick for
-        // undef. Use i32.
+        // We can't handle variadic DIExpressions yet so treat those as
+        // kill locations.
         if (DVI->isKillLocation() || DVI->getValue() == nullptr ||
             DVI->hasArgList())
-          return UndefValue::get(Type::getInt32Ty(DVI->getContext()));
+          return PoisonValue::get(Type::getInt32Ty(DVI->getContext()));
         return DVI->getValue();
       };
       Instruction *InsertBefore = I.getNextNode();