[llvm] f59e2b2 - [CodeGen] Port gc-empty-basic-blocks to new pass manager (#137585)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Dec 27 16:29:10 PST 2025
Author: paperchalice
Date: 2025-12-27T16:29:06-08:00
New Revision: f59e2b20ead28738ea6350a922ed1867f5d47139
URL: https://github.com/llvm/llvm-project/commit/f59e2b20ead28738ea6350a922ed1867f5d47139
DIFF: https://github.com/llvm/llvm-project/commit/f59e2b20ead28738ea6350a922ed1867f5d47139.diff
LOG: [CodeGen] Port gc-empty-basic-blocks to new pass manager (#137585)
Co-authored-by: Aiden Grossman <aidengrossman at google.com>
Added:
llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h
llvm/test/CodeGen/X86/gc-empty-basic-blocks.mir
Modified:
llvm/include/llvm/CodeGen/Passes.h
llvm/include/llvm/InitializePasses.h
llvm/include/llvm/Passes/MachinePassRegistry.def
llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp
llvm/lib/CodeGen/TargetPassConfig.cpp
llvm/lib/Passes/PassBuilder.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h b/llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h
new file mode 100644
index 0000000000000..a795ece07cdf5
--- /dev/null
+++ b/llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h
@@ -0,0 +1,24 @@
+//===-- GCEmptyBasicBlocks.h ------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CODEGEN_GCEMPTYBASICBLOCKS_H
+#define LLVM_CODEGEN_GCEMPTYBASICBLOCKS_H
+
+#include "llvm/CodeGen/MachinePassManager.h"
+
+namespace llvm {
+
+class GCEmptyBasicBlocksPass : public PassInfoMixin<GCEmptyBasicBlocksPass> {
+public:
+ PreservedAnalyses run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM);
+};
+
+} // namespace llvm
+
+#endif // LLVM_CODEGEN_GCEMPTYBASICBLOCKS_H
diff --git a/llvm/include/llvm/CodeGen/Passes.h b/llvm/include/llvm/CodeGen/Passes.h
index fe19e6a32c680..5928013035377 100644
--- a/llvm/include/llvm/CodeGen/Passes.h
+++ b/llvm/include/llvm/CodeGen/Passes.h
@@ -61,7 +61,7 @@ LLVM_ABI FunctionPass *createUnreachableBlockEliminationPass();
/// instructions. These blocks confuscate profile analysis (e.g., basic block
/// sections) since they will share the address of their fallthrough blocks.
/// This pass garbage-collects such basic blocks.
-LLVM_ABI MachineFunctionPass *createGCEmptyBasicBlocksPass();
+LLVM_ABI MachineFunctionPass *createGCEmptyBasicBlocksLegacyPass();
/// createBasicBlockSections Pass - This pass assigns sections to machine
/// basic blocks and is enabled with -fbasic-block-sections.
diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h
index 2bc00a2f71e1a..80d37759b683d 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -124,7 +124,7 @@ LLVM_ABI void initializeFixIrreduciblePass(PassRegistry &);
LLVM_ABI void initializeFixupStatepointCallerSavedLegacyPass(PassRegistry &);
LLVM_ABI void initializeFlattenCFGLegacyPassPass(PassRegistry &);
LLVM_ABI void initializeFuncletLayoutPass(PassRegistry &);
-LLVM_ABI void initializeGCEmptyBasicBlocksPass(PassRegistry &);
+LLVM_ABI void initializeGCEmptyBasicBlocksLegacyPass(PassRegistry &);
LLVM_ABI void initializeGCMachineCodeAnalysisPass(PassRegistry &);
LLVM_ABI void initializeGCModuleInfoPass(PassRegistry &);
LLVM_ABI void initializeGVNLegacyPassPass(PassRegistry &);
diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def
index 04a0da06fb6ec..fe08d5411e50c 100644
--- a/llvm/include/llvm/Passes/MachinePassRegistry.def
+++ b/llvm/include/llvm/Passes/MachinePassRegistry.def
@@ -116,6 +116,7 @@ MACHINE_FUNCTION_PASS("finalize-isel", FinalizeISelPass())
MACHINE_FUNCTION_PASS("finalizebundle-test", FinalizeBundleTestPass())
MACHINE_FUNCTION_PASS("fixup-statepoint-caller-saved", FixupStatepointCallerSavedPass())
MACHINE_FUNCTION_PASS("init-undef", InitUndefPass())
+MACHINE_FUNCTION_PASS("gc-empty-basic-blocks", GCEmptyBasicBlocksPass())
MACHINE_FUNCTION_PASS("localstackalloc", LocalStackSlotAllocationPass())
MACHINE_FUNCTION_PASS("machine-cp", MachineCopyPropagationPass())
MACHINE_FUNCTION_PASS("machine-cse", MachineCSEPass())
@@ -274,7 +275,6 @@ DUMMY_MACHINE_FUNCTION_PASS("cfi-instr-inserter", CFIInstrInserterPass)
DUMMY_MACHINE_FUNCTION_PASS("dot-machine-cfg", MachineCFGPrinter)
DUMMY_MACHINE_FUNCTION_PASS("fs-profile-loader", MIRProfileLoaderNewPass)
DUMMY_MACHINE_FUNCTION_PASS("funclet-layout", FuncletLayoutPass)
-DUMMY_MACHINE_FUNCTION_PASS("gc-empty-basic-blocks", GCEmptyBasicBlocksPass)
DUMMY_MACHINE_FUNCTION_PASS("implicit-null-checks", ImplicitNullChecksPass)
DUMMY_MACHINE_FUNCTION_PASS("instruction-select", InstructionSelectPass)
DUMMY_MACHINE_FUNCTION_PASS("irtranslator", IRTranslatorPass)
diff --git a/llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp b/llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp
index 98470a1507668..53f804588287e 100644
--- a/llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp
+++ b/llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp
@@ -11,6 +11,7 @@
/// pass.
///
//===----------------------------------------------------------------------===//
+#include "llvm/CodeGen/GCEmptyBasicBlocks.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
@@ -26,22 +27,35 @@ using namespace llvm;
STATISTIC(NumEmptyBlocksRemoved, "Number of empty blocks removed");
-class GCEmptyBasicBlocks : public MachineFunctionPass {
+static bool removeEmptyBlocks(MachineFunction &MF);
+
+PreservedAnalyses
+GCEmptyBasicBlocksPass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ bool Changed = removeEmptyBlocks(MF);
+ if (Changed)
+ return getMachineFunctionPassPreservedAnalyses();
+ return PreservedAnalyses::all();
+}
+
+class GCEmptyBasicBlocksLegacy : public MachineFunctionPass {
public:
static char ID;
- GCEmptyBasicBlocks() : MachineFunctionPass(ID) {
- initializeGCEmptyBasicBlocksPass(*PassRegistry::getPassRegistry());
+ GCEmptyBasicBlocksLegacy() : MachineFunctionPass(ID) {
+ initializeGCEmptyBasicBlocksLegacyPass(*PassRegistry::getPassRegistry());
}
StringRef getPassName() const override {
return "Remove Empty Basic Blocks.";
}
- bool runOnMachineFunction(MachineFunction &MF) override;
+ bool runOnMachineFunction(MachineFunction &MF) override {
+ return removeEmptyBlocks(MF);
+ }
};
-bool GCEmptyBasicBlocks::runOnMachineFunction(MachineFunction &MF) {
+bool removeEmptyBlocks(MachineFunction &MF) {
if (MF.size() < 2)
return false;
MachineJumpTableInfo *JTI = MF.getJumpTableInfo();
@@ -88,12 +102,12 @@ bool GCEmptyBasicBlocks::runOnMachineFunction(MachineFunction &MF) {
return NumRemoved != 0;
}
-char GCEmptyBasicBlocks::ID = 0;
-INITIALIZE_PASS(GCEmptyBasicBlocks, "gc-empty-basic-blocks",
+char GCEmptyBasicBlocksLegacy::ID = 0;
+INITIALIZE_PASS(GCEmptyBasicBlocksLegacy, "gc-empty-basic-blocks",
"Removes empty basic blocks and redirects their uses to their "
"fallthrough blocks.",
false, false)
-MachineFunctionPass *llvm::createGCEmptyBasicBlocksPass() {
- return new GCEmptyBasicBlocks();
+MachineFunctionPass *llvm::createGCEmptyBasicBlocksLegacyPass() {
+ return new GCEmptyBasicBlocksLegacy();
}
diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp
index ca75d3b47cf3a..02284307aa3b4 100644
--- a/llvm/lib/CodeGen/TargetPassConfig.cpp
+++ b/llvm/lib/CodeGen/TargetPassConfig.cpp
@@ -1246,7 +1246,7 @@ void TargetPassConfig::addMachinePasses() {
}
if (GCEmptyBlocks)
- addPass(llvm::createGCEmptyBasicBlocksPass());
+ addPass(llvm::createGCEmptyBasicBlocksLegacyPass());
if (EnableFSDiscriminator)
addPass(createMIRAddFSDiscriminatorsPass(
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 84ee043b5da56..8bb78c8c7df63 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -98,6 +98,7 @@
#include "llvm/CodeGen/FEntryInserter.h"
#include "llvm/CodeGen/FinalizeISel.h"
#include "llvm/CodeGen/FixupStatepointCallerSaved.h"
+#include "llvm/CodeGen/GCEmptyBasicBlocks.h"
#include "llvm/CodeGen/GCMetadata.h"
#include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"
#include "llvm/CodeGen/GlobalMerge.h"
diff --git a/llvm/test/CodeGen/X86/gc-empty-basic-blocks.mir b/llvm/test/CodeGen/X86/gc-empty-basic-blocks.mir
new file mode 100644
index 0000000000000..72bdfbe565bbd
--- /dev/null
+++ b/llvm/test/CodeGen/X86/gc-empty-basic-blocks.mir
@@ -0,0 +1,51 @@
+# TODO(boomanaiden154): Remove this and use gc-empty-basic-blocks.ll directly.
+# This should be trivial once we have an asm printer setup for X86 and at least
+# a pipeline skeleton.
+# RUN: llc %s -mtriple=x86_64 -passes=gc-empty-basic-blocks -o - | FileCheck %s
+--- |
+ define void @foo(i1 zeroext %0) #0 {
+ br i1 %0, label %2, label %empty_block
+
+ 2: ; preds = %1
+ %3 = call i32 @baz()
+ br label %4
+
+ empty_block: ; preds = %1
+ unreachable
+
+ 4: ; preds = %2
+ ret void
+ }
+
+ declare i32 @baz()
+
+ attributes #0 = { nounwind }
+...
+---
+name: foo
+alignment: 16
+body: |
+ bb.0:
+ successors: %bb.1(0x40000000), %bb.2(0x40000000)
+ liveins: $edi
+
+ frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp
+ $al = MOV8rr $dil, implicit killed $edi
+ TEST8ri killed renamable $al, 1, implicit-def $eflags
+ JCC_1 %bb.1, 5, implicit killed $eflags
+ JMP_1 %bb.2
+
+ bb.1:
+ successors: %bb.3(0x80000000)
+
+ CALL64pcrel32 target-flags(x86-plt) @baz, csr_64, implicit $rsp, implicit $ssp, implicit-def $eax
+ JMP_1 %bb.3
+
+ bb.2.empty_block:
+ successors:
+
+ bb.3:
+ $rax = frame-destroy POP64r implicit-def $rsp, implicit $rsp
+ RET64
+...
+# CHECK-NOT: bb.2.empty_block:
More information about the llvm-commits
mailing list