[llvm] My dce (PR #120468)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 18 11:06:10 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: None (RashmiSalankar)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/120468.diff
5 Files Affected:
- (added) llvm/include/llvm/Transforms/Utils/MyDeadCodeEliminationPass.h (+27)
- (modified) llvm/lib/Passes/PassBuilder.cpp (+1)
- (modified) llvm/lib/Passes/PassRegistry.def (+1)
- (modified) llvm/lib/Transforms/Utils/CMakeLists.txt (+5)
- (added) llvm/lib/Transforms/Utils/MyDeadCodeEliminationPass.cpp (+59)
``````````diff
diff --git a/llvm/include/llvm/Transforms/Utils/MyDeadCodeEliminationPass.h b/llvm/include/llvm/Transforms/Utils/MyDeadCodeEliminationPass.h
new file mode 100644
index 00000000000000..24187cb4436b76
--- /dev/null
+++ b/llvm/include/llvm/Transforms/Utils/MyDeadCodeEliminationPass.h
@@ -0,0 +1,27 @@
+#ifndef LLVM_TRANSFORMS_UTILS_MYDEADCODEELIMINATIONPASS_H
+#define LLVM_TRANSFORMS_UTILS_MYDEADCODEELIMINATIONPASS_H
+
+#include "llvm/IR/PassManager.h"
+#include "llvm/IR/Function.h"
+#include "llvm/IR/Instruction.h"
+#include <unordered_set>
+
+namespace llvm {
+
+class MyDeadCodeEliminationPass : public PassInfoMixin<MyDeadCodeEliminationPass> {
+public:
+ // Main run method for the pass
+ PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
+
+private:
+ // Helper function for iterative analysis
+ void analyzeInstructionsIteratively(Function &F);
+
+ // Helper function to check if an instruction is dead
+ bool isInstructionDead(Instruction *Inst, const std::unordered_set<Instruction *> &potentialDeadInstructions);
+};
+
+} // namespace llvm
+
+#endif // LLVM_TRANSFORMS_UTILS_MYDEADCODEELIMINATIONPASS_H
+
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 77dea7d06d0900..80809e3ea1b486 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -302,6 +302,7 @@
#include "llvm/Transforms/Scalar/StructurizeCFG.h"
#include "llvm/Transforms/Scalar/TailRecursionElimination.h"
#include "llvm/Transforms/Scalar/WarnMissedTransforms.h"
+#include "llvm/Transforms/Utils/MyDeadCodeEliminationPass.h"
#include "llvm/Transforms/Utils/AddDiscriminators.h"
#include "llvm/Transforms/Utils/AssumeBundleBuilder.h"
#include "llvm/Transforms/Utils/BreakCriticalEdges.h"
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index 772ec5fd10e633..c797955ee969e9 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -328,6 +328,7 @@ FUNCTION_ALIAS_ANALYSIS("tbaa", TypeBasedAA())
#ifndef FUNCTION_PASS
#define FUNCTION_PASS(NAME, CREATE_PASS)
#endif
+FUNCTION_PASS("my-dce", MyDeadCodeEliminationPass())
FUNCTION_PASS("aa-eval", AAEvaluator())
FUNCTION_PASS("adce", ADCEPass())
FUNCTION_PASS("add-discriminators", AddDiscriminatorsPass())
diff --git a/llvm/lib/Transforms/Utils/CMakeLists.txt b/llvm/lib/Transforms/Utils/CMakeLists.txt
index 65bd3080662c4d..221cb31e20dd9a 100644
--- a/llvm/lib/Transforms/Utils/CMakeLists.txt
+++ b/llvm/lib/Transforms/Utils/CMakeLists.txt
@@ -1,4 +1,5 @@
add_llvm_component_library(LLVMTransformUtils
+ MyDeadCodeEliminationPass.cpp
AddDiscriminators.cpp
AMDGPUEmitPrintf.cpp
ASanStackFrameLayout.cpp
@@ -93,6 +94,10 @@ add_llvm_component_library(LLVMTransformUtils
${LLVM_MAIN_INCLUDE_DIR}/llvm/Transforms
${LLVM_MAIN_INCLUDE_DIR}/llvm/Transforms/Utils
+ target_include_directories(LLVMMyDeadCodeElimination PRIVATE
+ ${LLVM_MAIN_INCLUDE_DIR}
+ )
+
DEPENDS
intrinsics_gen
diff --git a/llvm/lib/Transforms/Utils/MyDeadCodeEliminationPass.cpp b/llvm/lib/Transforms/Utils/MyDeadCodeEliminationPass.cpp
new file mode 100644
index 00000000000000..f906341acd3a5f
--- /dev/null
+++ b/llvm/lib/Transforms/Utils/MyDeadCodeEliminationPass.cpp
@@ -0,0 +1,59 @@
+#include "llvm/Transforms/Utils/MyDeadCodeEliminationPass.h"
+#include "llvm/IR/BasicBlock.h"
+#include "llvm/IR/Instruction.h"
+#include "llvm/IR/Instructions.h"
+#include "llvm/Support/raw_ostream.h"
+#include <unordered_set>
+
+using namespace llvm;
+
+PreservedAnalyses MyDeadCodeEliminationPass::run(Function &F, FunctionAnalysisManager &AM) {
+ errs() << "I'm here in my Pass" << "\n";
+
+ // Call the helper function to iteratively analyze instructions
+ analyzeInstructionsIteratively(F);
+
+ return PreservedAnalyses::all(); // Preserve analyses since the code isn't modified.
+}
+
+void MyDeadCodeEliminationPass::analyzeInstructionsIteratively(Function &F) {
+ std::unordered_set<Instruction *> potentialDeadInstructions; // To track potential dead instructions
+ bool foundNewDead; // Flag to track if we find new dead instructions in an iteration
+
+ do {
+ foundNewDead = false; // Reset the flag at the start of each iteration
+
+ for (BasicBlock &BB : F) {
+ for (Instruction &I : BB) {
+ // Skip if already identified as dead
+ if (potentialDeadInstructions.count(&I)) {
+ continue;
+ }
+
+ // Check if the instruction is "dead" (not used anywhere or used only by dead instructions)
+ if (isInstructionDead(&I, potentialDeadInstructions)) {
+ errs() << "Potential dead instruction: " << I << "\n";
+ potentialDeadInstructions.insert(&I);
+ foundNewDead = true; // Mark that we found a new dead instruction
+ }
+ }
+ }
+ } while (foundNewDead); // Continue until no new dead instructions are found
+}
+
+bool MyDeadCodeEliminationPass::isInstructionDead(Instruction *Inst, const std::unordered_set<Instruction *> &potentialDeadInstructions) {
+ // Check if the instruction's result is not used, or all users are in the potentialDeadInstructions set
+ if (Inst->use_empty()) {
+ return true; // No users, definitely dead
+ }
+
+ for (const Use &U : Inst->uses()) {
+ auto *User = dyn_cast<Instruction>(U.getUser());
+ if (!User || potentialDeadInstructions.find(User) == potentialDeadInstructions.end()) {
+ return false; // Found a user that is not "dead"
+ }
+ }
+
+ return true; // All users are "dead"
+}
+
``````````
</details>
https://github.com/llvm/llvm-project/pull/120468
More information about the llvm-commits
mailing list