[llvm] [CodeGen] Port gc-empty-basic-blocks to new pass manager (PR #137585)

via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 28 23:55:46 PDT 2025


https://github.com/paperchalice updated https://github.com/llvm/llvm-project/pull/137585

>From 492130d46b95dfa2d510787b1f53570bfa9fe545 Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Mon, 28 Apr 2025 14:01:13 +0800
Subject: [PATCH 1/4] [CodeGen] Port gc-empty-basic-blocks to new pass manager

---
 .../include/llvm/CodeGen/GCEmptyBasicBlocks.h | 19 +++++++++++++++++++
 .../llvm/Passes/MachinePassRegistry.def       |  2 +-
 llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp       | 18 ++++++++++++++++--
 llvm/lib/Passes/PassBuilder.cpp               |  1 +
 .../basic-block-address-map-empty-block.ll    |  1 +
 .../test/CodeGen/X86/gc-empty-basic-blocks.ll |  1 +
 6 files changed, 39 insertions(+), 3 deletions(-)
 create mode 100644 llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h

diff --git a/llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h b/llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h
new file mode 100644
index 0000000000000..1ca7b55bc0363
--- /dev/null
+++ b/llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h
@@ -0,0 +1,19 @@
+//===-- 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/CodeGen/MachinePassManager.h"
+
+namespace llvm {
+
+class GCEmptyBasicBlocksPass : public PassInfoMixin<GCEmptyBasicBlocksPass> {
+public:
+  PreservedAnalyses run(MachineFunction &MF,
+                        MachineFunctionAnalysisManager &MFAM);
+};
+
+} // namespace llvm
diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def
index 8c22a28eba277..edac270c52f53 100644
--- a/llvm/include/llvm/Passes/MachinePassRegistry.def
+++ b/llvm/include/llvm/Passes/MachinePassRegistry.def
@@ -147,6 +147,7 @@ MACHINE_FUNCTION_PASS("early-tailduplication", EarlyTailDuplicatePass())
 MACHINE_FUNCTION_PASS("fentry-insert", FEntryInserterPass())
 MACHINE_FUNCTION_PASS("finalize-isel", FinalizeISelPass())
 MACHINE_FUNCTION_PASS("fixup-statepoint-caller-saved", FixupStatepointCallerSavedPass())
+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())
@@ -291,7 +292,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("init-undef-pass", InitUndefPass)
 DUMMY_MACHINE_FUNCTION_PASS("instruction-select", InstructionSelectPass)
diff --git a/llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp b/llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp
index 98470a1507668..9598258b5656d 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,6 +27,17 @@ using namespace llvm;
 
 STATISTIC(NumEmptyBlocksRemoved, "Number of empty blocks removed");
 
+static bool removeEmptyBlocks(MachineFunction &MF);
+
+PreservedAnalyses
+GCEmptyBasicBlocksPass::run(MachineFunction &MF,
+                            MachineFunctionAnalysisManager &MFAM) {
+  bool Changed = removeEmptyBlocks(MF);
+  if (Changed)
+    return getMachineFunctionPassPreservedAnalyses();
+  return PreservedAnalyses::all();
+}
+
 class GCEmptyBasicBlocks : public MachineFunctionPass {
 public:
   static char ID;
@@ -38,10 +50,12 @@ class GCEmptyBasicBlocks : public MachineFunctionPass {
     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();
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index e7057d9a6b625..a52c0b3f34782 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/GlobalMerge.h"
 #include "llvm/CodeGen/GlobalMergeFunctions.h"
diff --git a/llvm/test/CodeGen/X86/basic-block-address-map-empty-block.ll b/llvm/test/CodeGen/X86/basic-block-address-map-empty-block.ll
index 84948b7ecf6e0..394b8db3d7091 100644
--- a/llvm/test/CodeGen/X86/basic-block-address-map-empty-block.ll
+++ b/llvm/test/CodeGen/X86/basic-block-address-map-empty-block.ll
@@ -1,5 +1,6 @@
 ;; This test verifies that with -gc-empty-basic-blocks SHT_LLVM_BB_ADDR_MAP will not include entries for empty blocks.
 ; RUN: llc < %s -mtriple=x86_64 -O0 -basic-block-address-map -gc-empty-basic-blocks | FileCheck --check-prefix=CHECK %s
+; RUN: llc < %s -mtriple=x86_64 -O0 -basic-block-address-map -passes=gc-empty-basic-blocks | FileCheck --check-prefix=CHECK %s
 
 define void @foo(i1 zeroext %0) nounwind {
   br i1 %0, label %2, label %empty_block
diff --git a/llvm/test/CodeGen/X86/gc-empty-basic-blocks.ll b/llvm/test/CodeGen/X86/gc-empty-basic-blocks.ll
index 54ed34b2eae4e..65f1353705160 100644
--- a/llvm/test/CodeGen/X86/gc-empty-basic-blocks.ll
+++ b/llvm/test/CodeGen/X86/gc-empty-basic-blocks.ll
@@ -1,6 +1,7 @@
 ;; This test verifies that -gc-empty-basic-blocks removes regular empty blocks
 ;; but does not remove empty blocks which have their address taken.
 ; RUN: llc < %s -mtriple=x86_64 -O0 -gc-empty-basic-blocks | FileCheck %s
+; RUN: llc < %s -mtriple=x86_64 -O0 -passes=gc-empty-basic-blocks | FileCheck %s
 
 ;; This function has a regular empty block.
 define void @foo(i1 zeroext %0) nounwind {

>From f7021acb2ae8f097b5031d3f9855417228ed76b2 Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Tue, 29 Apr 2025 11:47:45 +0800
Subject: [PATCH 2/4] fix tests

---
 .../basic-block-address-map-empty-block.ll    |  1 -
 .../test/CodeGen/X86/gc-empty-basic-blocks.ll |  1 -
 .../CodeGen/X86/gc-empty-basic-blocks.mir     | 49 +++++++++++++++++++
 3 files changed, 49 insertions(+), 2 deletions(-)
 create mode 100644 llvm/test/CodeGen/X86/gc-empty-basic-blocks.mir

diff --git a/llvm/test/CodeGen/X86/basic-block-address-map-empty-block.ll b/llvm/test/CodeGen/X86/basic-block-address-map-empty-block.ll
index 394b8db3d7091..84948b7ecf6e0 100644
--- a/llvm/test/CodeGen/X86/basic-block-address-map-empty-block.ll
+++ b/llvm/test/CodeGen/X86/basic-block-address-map-empty-block.ll
@@ -1,6 +1,5 @@
 ;; This test verifies that with -gc-empty-basic-blocks SHT_LLVM_BB_ADDR_MAP will not include entries for empty blocks.
 ; RUN: llc < %s -mtriple=x86_64 -O0 -basic-block-address-map -gc-empty-basic-blocks | FileCheck --check-prefix=CHECK %s
-; RUN: llc < %s -mtriple=x86_64 -O0 -basic-block-address-map -passes=gc-empty-basic-blocks | FileCheck --check-prefix=CHECK %s
 
 define void @foo(i1 zeroext %0) nounwind {
   br i1 %0, label %2, label %empty_block
diff --git a/llvm/test/CodeGen/X86/gc-empty-basic-blocks.ll b/llvm/test/CodeGen/X86/gc-empty-basic-blocks.ll
index 65f1353705160..54ed34b2eae4e 100644
--- a/llvm/test/CodeGen/X86/gc-empty-basic-blocks.ll
+++ b/llvm/test/CodeGen/X86/gc-empty-basic-blocks.ll
@@ -1,7 +1,6 @@
 ;; This test verifies that -gc-empty-basic-blocks removes regular empty blocks
 ;; but does not remove empty blocks which have their address taken.
 ; RUN: llc < %s -mtriple=x86_64 -O0 -gc-empty-basic-blocks | FileCheck %s
-; RUN: llc < %s -mtriple=x86_64 -O0 -passes=gc-empty-basic-blocks | FileCheck %s
 
 ;; This function has a regular empty block.
 define void @foo(i1 zeroext %0) nounwind {
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..678a248259d56
--- /dev/null
+++ b/llvm/test/CodeGen/X86/gc-empty-basic-blocks.mir
@@ -0,0 +1,49 @@
+# TODO: Remove this and use gc-empty-basic-blocks.ll directly.
+# 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:

>From 40a44b0f17b2a7759ba170fb1906dc16d84e8194 Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Tue, 29 Apr 2025 14:44:19 +0800
Subject: [PATCH 3/4] append `Legacy` to legacy version

---
 llvm/include/llvm/CodeGen/Passes.h      |  2 +-
 llvm/include/llvm/InitializePasses.h    |  2 +-
 llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp | 14 +++++++-------
 llvm/lib/CodeGen/TargetPassConfig.cpp   |  2 +-
 4 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/llvm/include/llvm/CodeGen/Passes.h b/llvm/include/llvm/CodeGen/Passes.h
index d214ab9306c2f..9b41142f40b4b 100644
--- a/llvm/include/llvm/CodeGen/Passes.h
+++ b/llvm/include/llvm/CodeGen/Passes.h
@@ -59,7 +59,7 @@ namespace llvm {
   /// 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.
-  MachineFunctionPass *createGCEmptyBasicBlocksPass();
+  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 1ce36a95317b4..544f32e401ea7 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -119,7 +119,7 @@ void initializeFixIrreduciblePass(PassRegistry &);
 void initializeFixupStatepointCallerSavedLegacyPass(PassRegistry &);
 void initializeFlattenCFGLegacyPassPass(PassRegistry &);
 void initializeFuncletLayoutPass(PassRegistry &);
-void initializeGCEmptyBasicBlocksPass(PassRegistry &);
+void initializeGCEmptyBasicBlocksLegacyPass(PassRegistry &);
 void initializeGCMachineCodeAnalysisPass(PassRegistry &);
 void initializeGCModuleInfoPass(PassRegistry &);
 void initializeGVNLegacyPassPass(PassRegistry &);
diff --git a/llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp b/llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp
index 9598258b5656d..53f804588287e 100644
--- a/llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp
+++ b/llvm/lib/CodeGen/GCEmptyBasicBlocks.cpp
@@ -38,12 +38,12 @@ GCEmptyBasicBlocksPass::run(MachineFunction &MF,
   return PreservedAnalyses::all();
 }
 
-class GCEmptyBasicBlocks : public MachineFunctionPass {
+class GCEmptyBasicBlocksLegacy : public MachineFunctionPass {
 public:
   static char ID;
 
-  GCEmptyBasicBlocks() : MachineFunctionPass(ID) {
-    initializeGCEmptyBasicBlocksPass(*PassRegistry::getPassRegistry());
+  GCEmptyBasicBlocksLegacy() : MachineFunctionPass(ID) {
+    initializeGCEmptyBasicBlocksLegacyPass(*PassRegistry::getPassRegistry());
   }
 
   StringRef getPassName() const override {
@@ -102,12 +102,12 @@ bool removeEmptyBlocks(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 0095ce3d96277..2f8e692c0580e 100644
--- a/llvm/lib/CodeGen/TargetPassConfig.cpp
+++ b/llvm/lib/CodeGen/TargetPassConfig.cpp
@@ -1230,7 +1230,7 @@ void TargetPassConfig::addMachinePasses() {
   }
 
   if (GCEmptyBlocks)
-    addPass(llvm::createGCEmptyBasicBlocksPass());
+    addPass(llvm::createGCEmptyBasicBlocksLegacyPass());
 
   if (EnableFSDiscriminator)
     addPass(createMIRAddFSDiscriminatorsPass(

>From d609ba7441b3d7a8fbae32da7141c5d791c63757 Mon Sep 17 00:00:00 2001
From: PaperChalice <liujunchang97 at outlook.com>
Date: Tue, 29 Apr 2025 14:54:10 +0800
Subject: [PATCH 4/4] =?UTF-8?q?forgot=20header=20guard=F0=9F=98=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h b/llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h
index 1ca7b55bc0363..a795ece07cdf5 100644
--- a/llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h
+++ b/llvm/include/llvm/CodeGen/GCEmptyBasicBlocks.h
@@ -6,6 +6,9 @@
 //
 //===----------------------------------------------------------------------===//
 
+#ifndef LLVM_CODEGEN_GCEMPTYBASICBLOCKS_H
+#define LLVM_CODEGEN_GCEMPTYBASICBLOCKS_H
+
 #include "llvm/CodeGen/MachinePassManager.h"
 
 namespace llvm {
@@ -17,3 +20,5 @@ class GCEmptyBasicBlocksPass : public PassInfoMixin<GCEmptyBasicBlocksPass> {
 };
 
 } // namespace llvm
+
+#endif // LLVM_CODEGEN_GCEMPTYBASICBLOCKS_H



More information about the llvm-commits mailing list