Skip to content

Commit

Permalink
[NPM] Port -mergereturn to NPM
Browse files Browse the repository at this point in the history
Reviewed By: aeubanks

Differential Revision: https://reviews.llvm.org/D89781
  • Loading branch information
TaWeiTu authored and aeubanks committed Oct 20, 2020
1 parent ad2be02 commit 59286b3
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 17 deletions.
2 changes: 1 addition & 1 deletion llvm/include/llvm/InitializePasses.h
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ void initializeThreadSanitizerLegacyPassPass(PassRegistry&);
void initializeTwoAddressInstructionPassPass(PassRegistry&);
void initializeTypeBasedAAWrapperPassPass(PassRegistry&);
void initializeTypePromotionPass(PassRegistry&);
void initializeUnifyFunctionExitNodesPass(PassRegistry&);
void initializeUnifyFunctionExitNodesLegacyPassPass(PassRegistry &);
void initializeUnifyLoopExitsPass(PassRegistry &);
void initializeUnpackMachineBundlesPass(PassRegistry&);
void initializeUnreachableBlockElimLegacyPassPass(PassRegistry&);
Expand Down
14 changes: 9 additions & 5 deletions llvm/include/llvm/Transforms/Utils/UnifyFunctionExitNodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,19 +14,17 @@
#ifndef LLVM_TRANSFORMS_UTILS_UNIFYFUNCTIONEXITNODES_H
#define LLVM_TRANSFORMS_UTILS_UNIFYFUNCTIONEXITNODES_H

#include "llvm/IR/PassManager.h"
#include "llvm/Pass.h"

namespace llvm {

class BasicBlock;

class UnifyFunctionExitNodes : public FunctionPass {
bool unifyUnreachableBlocks(Function &F);
bool unifyReturnBlocks(Function &F);

class UnifyFunctionExitNodesLegacyPass : public FunctionPass {
public:
static char ID; // Pass identification, replacement for typeid
UnifyFunctionExitNodes();
UnifyFunctionExitNodesLegacyPass();

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

Pass *createUnifyFunctionExitNodesPass();

class UnifyFunctionExitNodesPass
: public PassInfoMixin<UnifyFunctionExitNodesPass> {
public:
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
};

} // end namespace llvm

#endif // LLVM_TRANSFORMS_UTILS_UNIFYFUNCTIONEXITNODES_H
1 change: 1 addition & 0 deletions llvm/lib/Passes/PassBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,7 @@
#include "llvm/Transforms/Utils/StripGCRelocates.h"
#include "llvm/Transforms/Utils/StripNonLineTableDebugInfo.h"
#include "llvm/Transforms/Utils/SymbolRewriter.h"
#include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h"
#include "llvm/Transforms/Vectorize/LoadStoreVectorizer.h"
#include "llvm/Transforms/Vectorize/LoopVectorize.h"
#include "llvm/Transforms/Vectorize/SLPVectorizer.h"
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/Passes/PassRegistry.def
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,7 @@ FUNCTION_PASS("lowerswitch", LowerSwitchPass())
FUNCTION_PASS("mem2reg", PromotePass())
FUNCTION_PASS("memcpyopt", MemCpyOptPass())
FUNCTION_PASS("mergeicmps", MergeICmpsPass())
FUNCTION_PASS("mergereturn", UnifyFunctionExitNodesPass())
FUNCTION_PASS("nary-reassociate", NaryReassociatePass())
FUNCTION_PASS("newgvn", NewGVNPass())
FUNCTION_PASS("jump-threading", JumpThreadingPass())
Expand Down
34 changes: 24 additions & 10 deletions llvm/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,28 +20,33 @@
#include "llvm/Transforms/Utils.h"
using namespace llvm;

char UnifyFunctionExitNodes::ID = 0;
char UnifyFunctionExitNodesLegacyPass::ID = 0;

UnifyFunctionExitNodes::UnifyFunctionExitNodes() : FunctionPass(ID) {
initializeUnifyFunctionExitNodesPass(*PassRegistry::getPassRegistry());
UnifyFunctionExitNodesLegacyPass::UnifyFunctionExitNodesLegacyPass()
: FunctionPass(ID) {
initializeUnifyFunctionExitNodesLegacyPassPass(
*PassRegistry::getPassRegistry());
}

INITIALIZE_PASS(UnifyFunctionExitNodes, "mergereturn",
INITIALIZE_PASS(UnifyFunctionExitNodesLegacyPass, "mergereturn",
"Unify function exit nodes", false, false)

Pass *llvm::createUnifyFunctionExitNodesPass() {
return new UnifyFunctionExitNodes();
return new UnifyFunctionExitNodesLegacyPass();
}

void UnifyFunctionExitNodes::getAnalysisUsage(AnalysisUsage &AU) const{
void UnifyFunctionExitNodesLegacyPass::getAnalysisUsage(
AnalysisUsage &AU) const {
// We preserve the non-critical-edgeness property
AU.addPreservedID(BreakCriticalEdgesID);
// This is a cluster of orthogonal Transforms
AU.addPreservedID(LowerSwitchID);
}

bool UnifyFunctionExitNodes::unifyUnreachableBlocks(Function &F) {
std::vector<BasicBlock*> UnreachableBlocks;
namespace {

bool unifyUnreachableBlocks(Function &F) {
std::vector<BasicBlock *> UnreachableBlocks;

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

bool UnifyFunctionExitNodes::unifyReturnBlocks(Function &F) {
bool unifyReturnBlocks(Function &F) {
std::vector<BasicBlock *> ReturningBlocks;

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

return true;
}
} // namespace

// Unify all exit nodes of the CFG by creating a new BasicBlock, and converting
// all returns to unconditional branches to this new basic block. Also, unify
// all unreachable blocks.
bool UnifyFunctionExitNodes::runOnFunction(Function &F) {
bool UnifyFunctionExitNodesLegacyPass::runOnFunction(Function &F) {
bool Changed = false;
Changed |= unifyUnreachableBlocks(F);
Changed |= unifyReturnBlocks(F);
return Changed;
}

PreservedAnalyses UnifyFunctionExitNodesPass::run(Function &F,
FunctionAnalysisManager &AM) {
bool Changed = false;
Changed |= unifyUnreachableBlocks(F);
Changed |= unifyReturnBlocks(F);
return Changed ? PreservedAnalyses() : PreservedAnalyses::all();
}
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/Utils/Utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ void llvm::initializeTransformUtils(PassRegistry &Registry) {
initializeNameAnonGlobalLegacyPassPass(Registry);
initializePromoteLegacyPassPass(Registry);
initializeStripNonLineTableDebugLegacyPassPass(Registry);
initializeUnifyFunctionExitNodesPass(Registry);
initializeUnifyFunctionExitNodesLegacyPassPass(Registry);
initializeMetaRenamerPass(Registry);
initializeStripGCRelocatesLegacyPass(Registry);
initializePredicateInfoPrinterLegacyPassPass(Registry);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
; RUN: opt -mergereturn -enable-new-pm=0 -S < %s | FileCheck %s
; RUN: opt -passes='break-crit-edges,lowerswitch,mergereturn' -S < %s | FileCheck %s

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

0 comments on commit 59286b3

Please sign in to comment.