[Mlir-commits] [mlir] [mlir][nfc] Minor cleanups in DeadCodeAnalysis (PR #159232)
Zhixun Tan
llvmlistbot at llvm.org
Tue Sep 16 20:01:02 PDT 2025
https://github.com/phisiart updated https://github.com/llvm/llvm-project/pull/159232
>From 26d06732e01cbe86fbb09d22c4edb69578f02571 Mon Sep 17 00:00:00 2001
From: Zhixun Tan <phisiart at gmail.com>
Date: Wed, 17 Sep 2025 01:06:21 +0000
Subject: [PATCH 1/2] [mlir][nfc] Remove getOperandValuesImpl since its only
used once.
---
.../Analysis/DataFlow/DeadCodeAnalysis.cpp | 19 +++++--------------
1 file changed, 5 insertions(+), 14 deletions(-)
diff --git a/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp b/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp
index 131c49c44171b..9309ca628fef1 100644
--- a/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp
+++ b/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp
@@ -444,30 +444,21 @@ void DeadCodeAnalysis::visitCallOperation(CallOpInterface call) {
/// Get the constant values of the operands of an operation. If any of the
/// constant value lattices are uninitialized, return std::nullopt to indicate
/// the analysis should bail out.
-static std::optional<SmallVector<Attribute>> getOperandValuesImpl(
- Operation *op,
- function_ref<const Lattice<ConstantValue> *(Value)> getLattice) {
+std::optional<SmallVector<Attribute>>
+DeadCodeAnalysis::getOperandValues(Operation *op) {
SmallVector<Attribute> operands;
operands.reserve(op->getNumOperands());
for (Value operand : op->getOperands()) {
- const Lattice<ConstantValue> *cv = getLattice(operand);
+ Lattice<ConstantValue> *cv = getOrCreate<Lattice<ConstantValue>>(operand);
+ cv->useDefSubscribe(this);
// If any of the operands' values are uninitialized, bail out.
if (cv->getValue().isUninitialized())
- return {};
+ return std::nullopt;
operands.push_back(cv->getValue().getConstantValue());
}
return operands;
}
-std::optional<SmallVector<Attribute>>
-DeadCodeAnalysis::getOperandValues(Operation *op) {
- return getOperandValuesImpl(op, [&](Value value) {
- auto *lattice = getOrCreate<Lattice<ConstantValue>>(value);
- lattice->useDefSubscribe(this);
- return lattice;
- });
-}
-
void DeadCodeAnalysis::visitBranchOperation(BranchOpInterface branch) {
LDBG() << "visitBranchOperation: "
<< OpWithFlags(branch.getOperation(), OpPrintingFlags().skipRegions());
>From f35fd0829fe041c4c4eae88a1888aa6af2d8cb23 Mon Sep 17 00:00:00 2001
From: Zhixun Tan <phisiart at gmail.com>
Date: Wed, 17 Sep 2025 01:14:49 +0000
Subject: [PATCH 2/2] [mlir][nfc] Extract common logic from
DeadCodeAnalysis::visitRegion{BranchOperation,Terminator} into a new function
DeadCodeAnalysis::visitRegionBranchEdges.
---
.../mlir/Analysis/DataFlow/DeadCodeAnalysis.h | 8 +++
.../Analysis/DataFlow/DeadCodeAnalysis.cpp | 61 ++++++++-----------
2 files changed, 33 insertions(+), 36 deletions(-)
diff --git a/mlir/include/mlir/Analysis/DataFlow/DeadCodeAnalysis.h b/mlir/include/mlir/Analysis/DataFlow/DeadCodeAnalysis.h
index c7c405e1423cb..87d9a74f08f70 100644
--- a/mlir/include/mlir/Analysis/DataFlow/DeadCodeAnalysis.h
+++ b/mlir/include/mlir/Analysis/DataFlow/DeadCodeAnalysis.h
@@ -16,6 +16,7 @@
#define MLIR_ANALYSIS_DATAFLOW_DEADCODEANALYSIS_H
#include "mlir/Analysis/DataFlowFramework.h"
+#include "mlir/Interfaces/ControlFlowInterfaces.h"
#include "mlir/IR/SymbolTable.h"
#include "llvm/ADT/SmallPtrSet.h"
#include <optional>
@@ -200,6 +201,13 @@ class DeadCodeAnalysis : public DataFlowAnalysis {
/// which are live from the current block.
void visitBranchOperation(BranchOpInterface branch);
+ /// Visit region branch edges from `predecessorOp` to a list of successors.
+ /// For each edge, mark the successor program point as executable, and record
+ /// the predecessor information in its `PredecessorState`.
+ void visitRegionBranchEdges(RegionBranchOpInterface regionBranchOp,
+ Operation *predecessorOp,
+ const SmallVector<RegionSuccessor> &successors);
+
/// Visit the given region branch operation, which defines regions, and
/// compute any necessary lattice state. This also resolves the lattice state
/// of both the operation results and any nested regions.
diff --git a/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp b/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp
index 9309ca628fef1..de1ed39ed4fdb 100644
--- a/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp
+++ b/mlir/lib/Analysis/DataFlow/DeadCodeAnalysis.cpp
@@ -489,23 +489,8 @@ void DeadCodeAnalysis::visitRegionBranchOperation(
SmallVector<RegionSuccessor> successors;
branch.getEntrySuccessorRegions(*operands, successors);
- for (const RegionSuccessor &successor : successors) {
- // The successor can be either an entry block or the parent operation.
- ProgramPoint *point =
- successor.getSuccessor()
- ? getProgramPointBefore(&successor.getSuccessor()->front())
- : getProgramPointAfter(branch);
- // Mark the entry block as executable.
- auto *state = getOrCreate<Executable>(point);
- propagateIfChanged(state, state->setToLive());
- LDBG() << "Marked region successor live: " << point;
- // Add the parent op as a predecessor.
- auto *predecessors = getOrCreate<PredecessorState>(point);
- propagateIfChanged(
- predecessors,
- predecessors->join(branch, successor.getSuccessorInputs()));
- LDBG() << "Added region branch as predecessor for successor: " << point;
- }
+
+ visitRegionBranchEdges(branch, branch.getOperation(), successors);
}
void DeadCodeAnalysis::visitRegionTerminator(Operation *op,
@@ -521,26 +506,30 @@ void DeadCodeAnalysis::visitRegionTerminator(Operation *op,
else
branch.getSuccessorRegions(op->getParentRegion(), successors);
- // Mark successor region entry blocks as executable and add this op to the
- // list of predecessors.
+ visitRegionBranchEdges(branch, op, successors);
+}
+
+void DeadCodeAnalysis::visitRegionBranchEdges(
+ RegionBranchOpInterface regionBranchOp, Operation *predecessorOp,
+ const SmallVector<RegionSuccessor> &successors) {
for (const RegionSuccessor &successor : successors) {
- PredecessorState *predecessors;
- if (Region *region = successor.getSuccessor()) {
- auto *state =
- getOrCreate<Executable>(getProgramPointBefore(®ion->front()));
- propagateIfChanged(state, state->setToLive());
- LDBG() << "Marked region entry block live for region: " << region;
- predecessors = getOrCreate<PredecessorState>(
- getProgramPointBefore(®ion->front()));
- } else {
- // Add this terminator as a predecessor to the parent op.
- predecessors =
- getOrCreate<PredecessorState>(getProgramPointAfter(branch));
- }
- propagateIfChanged(predecessors,
- predecessors->join(op, successor.getSuccessorInputs()));
- LDBG() << "Added region terminator as predecessor for successor: "
- << (successor.getSuccessor() ? "region entry" : "parent op");
+ // The successor can be either an entry block or the parent operation.
+ ProgramPoint *point =
+ successor.getSuccessor()
+ ? getProgramPointBefore(&successor.getSuccessor()->front())
+ : getProgramPointAfter(regionBranchOp);
+
+ // Mark the entry block as executable.
+ auto *state = getOrCreate<Executable>(point);
+ propagateIfChanged(state, state->setToLive());
+ LDBG() << "Marked region successor live: " << point;
+
+ // Add the parent op as a predecessor.
+ auto *predecessors = getOrCreate<PredecessorState>(point);
+ propagateIfChanged(
+ predecessors,
+ predecessors->join(predecessorOp, successor.getSuccessorInputs()));
+ LDBG() << "Added region branch as predecessor for successor: " << point;
}
}
More information about the Mlir-commits
mailing list