From 492130d46b95dfa2d510787b1f53570bfa9fe545 Mon Sep 17 00:00:00 2001 From: PaperChalice 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 { +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 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 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 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 { }; } // namespace llvm + +#endif // LLVM_CODEGEN_GCEMPTYBASICBLOCKS_H