From 12ece76815ab330f8f33707efd7c93735dd9c178 Mon Sep 17 00:00:00 2001 From: OCHyams Date: Thu, 12 Jan 2023 09:51:08 +0000 Subject: [PATCH] [DebugInfo] Replace UndefValue with PoisonValue in AssignmentTrackingAnalysis 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 | 8 +++++--- llvm/lib/CodeGen/AssignmentTrackingAnalysis.cpp | 19 ++++++------------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/llvm/docs/AssignmentTracking.md b/llvm/docs/AssignmentTracking.md index 4f07f2d..9698740 100644 --- a/llvm/docs/AssignmentTracking.md +++ b/llvm/docs/AssignmentTracking.md @@ -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: ``` diff --git a/llvm/lib/CodeGen/AssignmentTrackingAnalysis.cpp b/llvm/lib/CodeGen/AssignmentTrackingAnalysis.cpp index bf421a4..ba51c3b 100644 --- a/llvm/lib/CodeGen/AssignmentTrackingAnalysis.cpp +++ b/llvm/lib/CodeGen/AssignmentTrackingAnalysis.cpp @@ -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(); -- 2.7.4