Skip to content

Commit 59286b3

Browse files
TaWeiTuaeubanks
authored andcommitted
[NPM] Port -mergereturn to NPM
Reviewed By: aeubanks Differential Revision: https://reviews.llvm.org/D89781
1 parent ad2be02 commit 59286b3

File tree

7 files changed

+38
-17
lines changed

7 files changed

+38
-17
lines changed

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ void initializeThreadSanitizerLegacyPassPass(PassRegistry&);
428428
void initializeTwoAddressInstructionPassPass(PassRegistry&);
429429
void initializeTypeBasedAAWrapperPassPass(PassRegistry&);
430430
void initializeTypePromotionPass(PassRegistry&);
431-
void initializeUnifyFunctionExitNodesPass(PassRegistry&);
431+
void initializeUnifyFunctionExitNodesLegacyPassPass(PassRegistry &);
432432
void initializeUnifyLoopExitsPass(PassRegistry &);
433433
void initializeUnpackMachineBundlesPass(PassRegistry&);
434434
void initializeUnreachableBlockElimLegacyPassPass(PassRegistry&);

llvm/include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,17 @@
1414
#ifndef LLVM_TRANSFORMS_UTILS_UNIFYFUNCTIONEXITNODES_H
1515
#define LLVM_TRANSFORMS_UTILS_UNIFYFUNCTIONEXITNODES_H
1616

17+
#include "llvm/IR/PassManager.h"
1718
#include "llvm/Pass.h"
1819

1920
namespace llvm {
2021

2122
class BasicBlock;
2223

23-
class UnifyFunctionExitNodes : public FunctionPass {
24-
bool unifyUnreachableBlocks(Function &F);
25-
bool unifyReturnBlocks(Function &F);
26-
24+
class UnifyFunctionExitNodesLegacyPass : public FunctionPass {
2725
public:
2826
static char ID; // Pass identification, replacement for typeid
29-
UnifyFunctionExitNodes();
27+
UnifyFunctionExitNodesLegacyPass();
3028

3129
// We can preserve non-critical-edgeness when we unify function exit nodes
3230
void getAnalysisUsage(AnalysisUsage &AU) const override;
@@ -36,6 +34,12 @@ class UnifyFunctionExitNodes : public FunctionPass {
3634

3735
Pass *createUnifyFunctionExitNodesPass();
3836

37+
class UnifyFunctionExitNodesPass
38+
: public PassInfoMixin<UnifyFunctionExitNodesPass> {
39+
public:
40+
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
41+
};
42+
3943
} // end namespace llvm
4044

4145
#endif // LLVM_TRANSFORMS_UTILS_UNIFYFUNCTIONEXITNODES_H

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@
212212
#include "llvm/Transforms/Utils/StripGCRelocates.h"
213213
#include "llvm/Transforms/Utils/StripNonLineTableDebugInfo.h"
214214
#include "llvm/Transforms/Utils/SymbolRewriter.h"
215+
#include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h"
215216
#include "llvm/Transforms/Vectorize/LoadStoreVectorizer.h"
216217
#include "llvm/Transforms/Vectorize/LoopVectorize.h"
217218
#include "llvm/Transforms/Vectorize/SLPVectorizer.h"

llvm/lib/Passes/PassRegistry.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ FUNCTION_PASS("lowerswitch", LowerSwitchPass())
240240
FUNCTION_PASS("mem2reg", PromotePass())
241241
FUNCTION_PASS("memcpyopt", MemCpyOptPass())
242242
FUNCTION_PASS("mergeicmps", MergeICmpsPass())
243+
FUNCTION_PASS("mergereturn", UnifyFunctionExitNodesPass())
243244
FUNCTION_PASS("nary-reassociate", NaryReassociatePass())
244245
FUNCTION_PASS("newgvn", NewGVNPass())
245246
FUNCTION_PASS("jump-threading", JumpThreadingPass())

llvm/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,33 @@
2020
#include "llvm/Transforms/Utils.h"
2121
using namespace llvm;
2222

23-
char UnifyFunctionExitNodes::ID = 0;
23+
char UnifyFunctionExitNodesLegacyPass::ID = 0;
2424

25-
UnifyFunctionExitNodes::UnifyFunctionExitNodes() : FunctionPass(ID) {
26-
initializeUnifyFunctionExitNodesPass(*PassRegistry::getPassRegistry());
25+
UnifyFunctionExitNodesLegacyPass::UnifyFunctionExitNodesLegacyPass()
26+
: FunctionPass(ID) {
27+
initializeUnifyFunctionExitNodesLegacyPassPass(
28+
*PassRegistry::getPassRegistry());
2729
}
2830

29-
INITIALIZE_PASS(UnifyFunctionExitNodes, "mergereturn",
31+
INITIALIZE_PASS(UnifyFunctionExitNodesLegacyPass, "mergereturn",
3032
"Unify function exit nodes", false, false)
3133

3234
Pass *llvm::createUnifyFunctionExitNodesPass() {
33-
return new UnifyFunctionExitNodes();
35+
return new UnifyFunctionExitNodesLegacyPass();
3436
}
3537

36-
void UnifyFunctionExitNodes::getAnalysisUsage(AnalysisUsage &AU) const{
38+
void UnifyFunctionExitNodesLegacyPass::getAnalysisUsage(
39+
AnalysisUsage &AU) const {
3740
// We preserve the non-critical-edgeness property
3841
AU.addPreservedID(BreakCriticalEdgesID);
3942
// This is a cluster of orthogonal Transforms
4043
AU.addPreservedID(LowerSwitchID);
4144
}
4245

43-
bool UnifyFunctionExitNodes::unifyUnreachableBlocks(Function &F) {
44-
std::vector<BasicBlock*> UnreachableBlocks;
46+
namespace {
47+
48+
bool unifyUnreachableBlocks(Function &F) {
49+
std::vector<BasicBlock *> UnreachableBlocks;
4550

4651
for (BasicBlock &I : F)
4752
if (isa<UnreachableInst>(I.getTerminator()))
@@ -62,7 +67,7 @@ bool UnifyFunctionExitNodes::unifyUnreachableBlocks(Function &F) {
6267
return true;
6368
}
6469

65-
bool UnifyFunctionExitNodes::unifyReturnBlocks(Function &F) {
70+
bool unifyReturnBlocks(Function &F) {
6671
std::vector<BasicBlock *> ReturningBlocks;
6772

6873
for (BasicBlock &I : F)
@@ -103,13 +108,22 @@ bool UnifyFunctionExitNodes::unifyReturnBlocks(Function &F) {
103108

104109
return true;
105110
}
111+
} // namespace
106112

107113
// Unify all exit nodes of the CFG by creating a new BasicBlock, and converting
108114
// all returns to unconditional branches to this new basic block. Also, unify
109115
// all unreachable blocks.
110-
bool UnifyFunctionExitNodes::runOnFunction(Function &F) {
116+
bool UnifyFunctionExitNodesLegacyPass::runOnFunction(Function &F) {
111117
bool Changed = false;
112118
Changed |= unifyUnreachableBlocks(F);
113119
Changed |= unifyReturnBlocks(F);
114120
return Changed;
115121
}
122+
123+
PreservedAnalyses UnifyFunctionExitNodesPass::run(Function &F,
124+
FunctionAnalysisManager &AM) {
125+
bool Changed = false;
126+
Changed |= unifyUnreachableBlocks(F);
127+
Changed |= unifyReturnBlocks(F);
128+
return Changed ? PreservedAnalyses() : PreservedAnalyses::all();
129+
}

llvm/lib/Transforms/Utils/Utils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ void llvm::initializeTransformUtils(PassRegistry &Registry) {
3838
initializeNameAnonGlobalLegacyPassPass(Registry);
3939
initializePromoteLegacyPassPass(Registry);
4040
initializeStripNonLineTableDebugLegacyPassPass(Registry);
41-
initializeUnifyFunctionExitNodesPass(Registry);
41+
initializeUnifyFunctionExitNodesLegacyPassPass(Registry);
4242
initializeMetaRenamerPass(Registry);
4343
initializeStripGCRelocatesLegacyPass(Registry);
4444
initializePredicateInfoPrinterLegacyPassPass(Registry);

llvm/test/Transforms/UnifyFunctionExitNodes/unreachable-blocks-status.ll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
; RUN: opt -mergereturn -enable-new-pm=0 -S < %s | FileCheck %s
2+
; RUN: opt -passes='break-crit-edges,lowerswitch,mergereturn' -S < %s | FileCheck %s
23

34
; The pass did previously not report the correct Modified status in the case
45
; where a function had at most one return block, and an unified unreachable

0 commit comments

Comments
 (0)