[llvm] [NFC][Transforms] Initialize potentially uninitialized local pointers (PR #208564)
Younes Yazami via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 9 19:10:28 PDT 2026
https://github.com/yelidris-public updated https://github.com/llvm/llvm-project/pull/208564
>From 9bc1eb627d41d358be9b2b235282182a3345d3fb Mon Sep 17 00:00:00 2001
From: yelidris <younes.elidrissiyazami at amd.com>
Date: Thu, 9 Jul 2026 17:13:08 -0400
Subject: [PATCH] [NFC][Transforms] Initialize potentially uninitialized local
pointers
Initialize local pointer variables that may be used before being assigned on all code paths. The variables are always set before use in practice, but initializing them to nullptr is defensive and removes potential for undefined behavior in edge cases.
---
llvm/lib/Transforms/Coroutines/CoroSplit.cpp | 2 +-
.../Transforms/Instrumentation/MemorySanitizer.cpp | 12 ++++++------
llvm/lib/Transforms/Scalar/LICM.cpp | 4 ++--
llvm/lib/Transforms/Scalar/SROA.cpp | 2 +-
.../Transforms/Scalar/ScalarizeMaskedMemIntrin.cpp | 4 ++--
llvm/lib/Transforms/Utils/BasicBlockUtils.cpp | 2 +-
llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 2 +-
llvm/lib/Transforms/Utils/ValueMapper.cpp | 4 ++--
llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp | 8 ++++----
9 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
index 7915fbf4cce05..dc9f67178773d 100644
--- a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
@@ -512,7 +512,7 @@ void coro::BaseCloner::replaceRetconOrAsyncSuspendUses() {
}
void coro::BaseCloner::replaceCoroSuspends() {
- Value *SuspendResult;
+ Value *SuspendResult = nullptr;
switch (Shape.ABI) {
// In switch lowering, replace coro.suspend with the appropriate value
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
index cdce2e039154f..11ea0865bfbc0 100644
--- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -7703,7 +7703,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
if (PoisonStack && ClPoisonStackWithCall) {
IRB.CreateCall(MS.MsanPoisonStackFn, {&I, Len});
} else {
- Value *ShadowBase, *OriginBase;
+ Value *ShadowBase = nullptr, *OriginBase = nullptr;
std::tie(ShadowBase, OriginBase) = getShadowOriginPtr(
&I, IRB, IRB.getInt8Ty(), Align(1), /*isStore*/ true);
@@ -8230,7 +8230,7 @@ struct VarArgAMD64Helper : public VarArgHelperBase {
AK = AK_Memory;
if (AK == AK_FloatingPoint && FpOffset >= AMD64FpEndOffset)
AK = AK_Memory;
- Value *ShadowBase, *OriginBase = nullptr;
+ Value *ShadowBase = nullptr, *OriginBase = nullptr;
switch (AK) {
case AK_GeneralPurpose:
ShadowBase = getShadowPtrForVAArgument(IRB, GpOffset);
@@ -8422,7 +8422,7 @@ struct VarArgAArch64Helper : public VarArgHelperBase {
if (AK == AK_FloatingPoint &&
(VrOffset + RegNum * 16) > AArch64VrEndOffset)
AK = AK_Memory;
- Value *Base;
+ Value *Base = nullptr;
switch (AK) {
case AK_GeneralPurpose:
Base = getShadowPtrForVAArgument(IRB, GrOffset);
@@ -8645,7 +8645,7 @@ struct VarArgPowerPC64Helper : public VarArgHelperBase {
}
VAArgOffset += alignTo(ArgSize, Align(8));
} else {
- Value *Base;
+ Value *Base = nullptr;
uint64_t ArgSize = DL.getTypeAllocSize(A->getType());
Align ArgAlign = Align(8);
if (A->getType()->isArrayTy()) {
@@ -8775,7 +8775,7 @@ struct VarArgPowerPC32Helper : public VarArgHelperBase {
}
VAArgOffset += alignTo(ArgSize, Align(IntptrSize));
} else {
- Value *Base;
+ Value *Base = nullptr;
Type *ArgTy = A->getType();
// On PPC 32 floating point variable arguments are stored in separate
@@ -9237,7 +9237,7 @@ struct VarArgI386Helper : public VarArgHelperBase {
VAArgOffset += alignTo(ArgSize, Align(IntptrSize));
}
} else {
- Value *Base;
+ Value *Base = nullptr;
uint64_t ArgSize = DL.getTypeAllocSize(A->getType());
Align ArgAlign = Align(IntptrSize);
VAArgOffset = alignTo(VAArgOffset, ArgAlign);
diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp
index c7e29b70662d8..8a18ef0e5ace1 100644
--- a/llvm/lib/Transforms/Scalar/LICM.cpp
+++ b/llvm/lib/Transforms/Scalar/LICM.cpp
@@ -2570,7 +2570,7 @@ static bool hoistAdd(ICmpInst::Predicate Pred, Value *VariantLHS,
// Try to represent VariantLHS as sum of invariant and variant operands.
using namespace PatternMatch;
- Value *VariantOp, *InvariantOp;
+ Value *VariantOp = nullptr, *InvariantOp = nullptr;
if (IsSigned && !match(VariantLHS, m_NSWAddLike(m_Value(VariantOp),
m_Value(InvariantOp))))
return false;
@@ -2631,7 +2631,7 @@ static bool hoistSub(ICmpInst::Predicate Pred, Value *VariantLHS,
// Try to represent VariantLHS as sum of invariant and variant operands.
using namespace PatternMatch;
- Value *VariantOp, *InvariantOp;
+ Value *VariantOp = nullptr, *InvariantOp = nullptr;
if (IsSigned &&
!match(VariantLHS, m_NSWSub(m_Value(VariantOp), m_Value(InvariantOp))))
return false;
diff --git a/llvm/lib/Transforms/Scalar/SROA.cpp b/llvm/lib/Transforms/Scalar/SROA.cpp
index 14a1b093ea49a..45ce7df815fec 100644
--- a/llvm/lib/Transforms/Scalar/SROA.cpp
+++ b/llvm/lib/Transforms/Scalar/SROA.cpp
@@ -1826,7 +1826,7 @@ static void rewriteMemOpOfSelect(SelectInst &SI, T &I,
Spec = {}; // Do not use `Spec` beyond this point.
BasicBlock *Tail = I.getParent();
Tail->setName(Head->getName() + ".cont");
- PHINode *PN;
+ PHINode *PN = nullptr;
if (isa<LoadInst>(I))
PN = PHINode::Create(I.getType(), 2, "", I.getIterator());
for (BasicBlock *SuccBB : successors(Head)) {
diff --git a/llvm/lib/Transforms/Scalar/ScalarizeMaskedMemIntrin.cpp b/llvm/lib/Transforms/Scalar/ScalarizeMaskedMemIntrin.cpp
index da9ceb4f440e5..49b55a5c8f7ab 100644
--- a/llvm/lib/Transforms/Scalar/ScalarizeMaskedMemIntrin.cpp
+++ b/llvm/lib/Transforms/Scalar/ScalarizeMaskedMemIntrin.cpp
@@ -807,7 +807,7 @@ static void scalarizeMaskedExpandLoad(const DataLayout &DL,
Value *NewVResult = Builder.CreateInsertElement(VResult, Load, Idx);
// Move the pointer if there are more blocks to come.
- Value *NewPtr;
+ Value *NewPtr = nullptr;
if ((Idx + 1) != VectorWidth)
NewPtr = Builder.CreateConstInBoundsGEP1_32(EltTy, Ptr, 1);
@@ -927,7 +927,7 @@ static void scalarizeMaskedCompressStore(const DataLayout &DL,
Builder.CreateAlignedStore(OneElt, Ptr, AdjustedAlignment);
// Move the pointer if there are more blocks to come.
- Value *NewPtr;
+ Value *NewPtr = nullptr;
if ((Idx + 1) != VectorWidth)
NewPtr = Builder.CreateConstInBoundsGEP1_32(EltTy, Ptr, 1);
diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
index 6321fc3a5126f..bfdb9851aeab4 100644
--- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
+++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
@@ -260,7 +260,7 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DomTreeUpdater *DTU,
// Currently only allow PredBB to have two predecessors, one being BB.
// Update BI to branch to BB's only successor instead of BB.
- CondBrInst *PredBB_BI;
+ CondBrInst *PredBB_BI = nullptr;
BasicBlock *NewSucc = nullptr;
unsigned FallThruPath;
if (PredecessorWithTwoSuccessors) {
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index ca6ae94a9a8d9..c10a8af776c69 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -7471,7 +7471,7 @@ static bool simplifySwitchLookup(SwitchInst *SI, IRBuilder<> &Builder,
return false;
// Compute the table index value.
- Value *TableIndex;
+ Value *TableIndex = nullptr;
if (UseSwitchConditionAsTableIndex) {
TableIndex = SI->getCondition();
if (HasDefaultResults) {
diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp
index 22230c352bf01..5a10bff348d2b 100644
--- a/llvm/lib/Transforms/Utils/ValueMapper.cpp
+++ b/llvm/lib/Transforms/Utils/ValueMapper.cpp
@@ -1118,8 +1118,8 @@ void Mapper::mapAppendingVariable(GlobalVariable &GV, GlobalVariable *OldGV,
InitPrefix->destroyConstant();
}
- PointerType *VoidPtrTy;
- Type *EltTy;
+ PointerType *VoidPtrTy = nullptr;
+ Type *EltTy = nullptr;
if (IsOldCtorDtor) {
// FIXME: This upgrade is done during linking to support the C API. See
// also IRLinker::linkAppendingVarProto() in IRMover.cpp.
diff --git a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
index 343ee02007966..2c0d04b43cd25 100644
--- a/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
+++ b/llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp
@@ -1353,7 +1353,7 @@ static bool simplifyLogicalRecipe(VPSingleDefRecipe *Def, VPBuilder &Builder,
// TODO: Split up into simpler, modular combines: (X && Y) | (X && Z) into X
// && (Y | Z) and (X | !X) into true. This requires queuing newly created
// recipes to be visited during simplification.
- VPValue *X, *Y, *Z;
+ VPValue *X = nullptr, *Y = nullptr, *Z = nullptr;
if (match(Def,
m_c_BinaryOr(m_LogicalAnd(m_VPValue(X), m_VPValue(Y)),
m_LogicalAnd(m_Deferred(X), m_Not(m_Deferred(Y)))))) {
@@ -1443,7 +1443,7 @@ static bool simplifyLogicalRecipe(VPSingleDefRecipe *Def, VPBuilder &Builder,
}
// select c, false, true -> not c
- VPValue *C;
+ VPValue *C = nullptr;
if (CanCreateNewRecipe &&
match(Def, m_Select(m_VPValue(C), m_False(), m_True()))) {
Def->replaceAllUsesWith(Builder.createNot(C));
@@ -1552,7 +1552,7 @@ static void simplifyRecipe(VPSingleDefRecipe *Def) {
if (simplifyLogicalRecipe(Def, Builder, CanCreateNewRecipe))
return;
- VPValue *X, *Y, *C;
+ VPValue *X = nullptr, *Y = nullptr, *C = nullptr;
if (match(Def, m_c_Add(m_VPValue(A), m_ZeroInt())))
return Def->replaceAllUsesWith(A);
@@ -1946,7 +1946,7 @@ static void reassociateHeaderMask(VPlan &Plan) {
while (!Worklist.empty()) {
auto *R = dyn_cast<VPSingleDefRecipe>(Worklist.pop_back_val());
- VPValue *X, *Y;
+ VPValue *X = nullptr, *Y = nullptr;
if (!R || !match(R, m_LogicalAnd(
m_LogicalAnd(m_Specific(HeaderMask), m_VPValue(X)),
m_VPValue(Y))))
More information about the llvm-commits
mailing list