forked from OSchip/llvm-project
[NewPM] Port FlattenCFGPass to NPM
Reviewed By: aeubanks Differential Revision: https://reviews.llvm.org/D115361
This commit is contained in:
parent
d69f5e197c
commit
eb87f668fe
|
@ -164,7 +164,7 @@ void initializeFinalizeISelPass(PassRegistry&);
|
||||||
void initializeFinalizeMachineBundlesPass(PassRegistry&);
|
void initializeFinalizeMachineBundlesPass(PassRegistry&);
|
||||||
void initializeFixIrreduciblePass(PassRegistry &);
|
void initializeFixIrreduciblePass(PassRegistry &);
|
||||||
void initializeFixupStatepointCallerSavedPass(PassRegistry&);
|
void initializeFixupStatepointCallerSavedPass(PassRegistry&);
|
||||||
void initializeFlattenCFGPassPass(PassRegistry&);
|
void initializeFlattenCFGLegacyPassPass(PassRegistry &);
|
||||||
void initializeFloat2IntLegacyPassPass(PassRegistry&);
|
void initializeFloat2IntLegacyPassPass(PassRegistry&);
|
||||||
void initializeForceFunctionAttrsLegacyPassPass(PassRegistry&);
|
void initializeForceFunctionAttrsLegacyPassPass(PassRegistry&);
|
||||||
void initializeForwardControlFlowIntegrityPass(PassRegistry&);
|
void initializeForwardControlFlowIntegrityPass(PassRegistry&);
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
//===- FlattenCFG.h -------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// 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
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// The FlattenCFG pass flattens a function's CFG using the FlattenCFG utility
|
||||||
|
// function, iteratively flattening until no further changes are made.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#ifndef LLVM_TRANSFORMS_SCALAR_FLATTENCFG_H
|
||||||
|
#define LLVM_TRANSFORMS_SCALAR_FLATTENCFG_H
|
||||||
|
|
||||||
|
#include "llvm/IR/PassManager.h"
|
||||||
|
|
||||||
|
namespace llvm {
|
||||||
|
struct FlattenCFGPass : PassInfoMixin<FlattenCFGPass> {
|
||||||
|
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
|
||||||
|
};
|
||||||
|
} // namespace llvm
|
||||||
|
|
||||||
|
#endif // LLVM_TRANSFORMS_SCALAR_FLATTENCFG_H
|
|
@ -151,6 +151,7 @@
|
||||||
#include "llvm/Transforms/Scalar/DeadStoreElimination.h"
|
#include "llvm/Transforms/Scalar/DeadStoreElimination.h"
|
||||||
#include "llvm/Transforms/Scalar/DivRemPairs.h"
|
#include "llvm/Transforms/Scalar/DivRemPairs.h"
|
||||||
#include "llvm/Transforms/Scalar/EarlyCSE.h"
|
#include "llvm/Transforms/Scalar/EarlyCSE.h"
|
||||||
|
#include "llvm/Transforms/Scalar/FlattenCFG.h"
|
||||||
#include "llvm/Transforms/Scalar/Float2Int.h"
|
#include "llvm/Transforms/Scalar/Float2Int.h"
|
||||||
#include "llvm/Transforms/Scalar/GVN.h"
|
#include "llvm/Transforms/Scalar/GVN.h"
|
||||||
#include "llvm/Transforms/Scalar/GuardWidening.h"
|
#include "llvm/Transforms/Scalar/GuardWidening.h"
|
||||||
|
|
|
@ -253,6 +253,7 @@ FUNCTION_PASS("dse", DSEPass())
|
||||||
FUNCTION_PASS("dot-cfg", CFGPrinterPass())
|
FUNCTION_PASS("dot-cfg", CFGPrinterPass())
|
||||||
FUNCTION_PASS("dot-cfg-only", CFGOnlyPrinterPass())
|
FUNCTION_PASS("dot-cfg-only", CFGOnlyPrinterPass())
|
||||||
FUNCTION_PASS("fix-irreducible", FixIrreduciblePass())
|
FUNCTION_PASS("fix-irreducible", FixIrreduciblePass())
|
||||||
|
FUNCTION_PASS("flattencfg", FlattenCFGPass())
|
||||||
FUNCTION_PASS("make-guards-explicit", MakeGuardsExplicitPass())
|
FUNCTION_PASS("make-guards-explicit", MakeGuardsExplicitPass())
|
||||||
FUNCTION_PASS("gvn-hoist", GVNHoistPass())
|
FUNCTION_PASS("gvn-hoist", GVNHoistPass())
|
||||||
FUNCTION_PASS("gvn-sink", GVNSinkPass())
|
FUNCTION_PASS("gvn-sink", GVNSinkPass())
|
||||||
|
|
|
@ -13,10 +13,12 @@
|
||||||
#include "llvm/Analysis/AliasAnalysis.h"
|
#include "llvm/Analysis/AliasAnalysis.h"
|
||||||
#include "llvm/IR/CFG.h"
|
#include "llvm/IR/CFG.h"
|
||||||
#include "llvm/IR/InstrTypes.h"
|
#include "llvm/IR/InstrTypes.h"
|
||||||
|
#include "llvm/IR/PassManager.h"
|
||||||
#include "llvm/IR/ValueHandle.h"
|
#include "llvm/IR/ValueHandle.h"
|
||||||
#include "llvm/InitializePasses.h"
|
#include "llvm/InitializePasses.h"
|
||||||
#include "llvm/Pass.h"
|
#include "llvm/Pass.h"
|
||||||
#include "llvm/Transforms/Scalar.h"
|
#include "llvm/Transforms/Scalar.h"
|
||||||
|
#include "llvm/Transforms/Scalar/FlattenCFG.h"
|
||||||
#include "llvm/Transforms/Utils/Local.h"
|
#include "llvm/Transforms/Utils/Local.h"
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
@ -24,11 +26,11 @@ using namespace llvm;
|
||||||
#define DEBUG_TYPE "flattencfg"
|
#define DEBUG_TYPE "flattencfg"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
struct FlattenCFGPass : public FunctionPass {
|
struct FlattenCFGLegacyPass : public FunctionPass {
|
||||||
static char ID; // Pass identification, replacement for typeid
|
static char ID; // Pass identification, replacement for typeid
|
||||||
public:
|
public:
|
||||||
FlattenCFGPass() : FunctionPass(ID) {
|
FlattenCFGLegacyPass() : FunctionPass(ID) {
|
||||||
initializeFlattenCFGPassPass(*PassRegistry::getPassRegistry());
|
initializeFlattenCFGLegacyPassPass(*PassRegistry::getPassRegistry());
|
||||||
}
|
}
|
||||||
bool runOnFunction(Function &F) override;
|
bool runOnFunction(Function &F) override;
|
||||||
|
|
||||||
|
@ -39,21 +41,10 @@ public:
|
||||||
private:
|
private:
|
||||||
AliasAnalysis *AA;
|
AliasAnalysis *AA;
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
char FlattenCFGPass::ID = 0;
|
|
||||||
INITIALIZE_PASS_BEGIN(FlattenCFGPass, "flattencfg", "Flatten the CFG", false,
|
|
||||||
false)
|
|
||||||
INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
|
|
||||||
INITIALIZE_PASS_END(FlattenCFGPass, "flattencfg", "Flatten the CFG", false,
|
|
||||||
false)
|
|
||||||
|
|
||||||
// Public interface to the FlattenCFG pass
|
|
||||||
FunctionPass *llvm::createFlattenCFGPass() { return new FlattenCFGPass(); }
|
|
||||||
|
|
||||||
/// iterativelyFlattenCFG - Call FlattenCFG on all the blocks in the function,
|
/// iterativelyFlattenCFG - Call FlattenCFG on all the blocks in the function,
|
||||||
/// iterating until no more changes are made.
|
/// iterating until no more changes are made.
|
||||||
static bool iterativelyFlattenCFG(Function &F, AliasAnalysis *AA) {
|
bool iterativelyFlattenCFG(Function &F, AliasAnalysis *AA) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
bool LocalChange = true;
|
bool LocalChange = true;
|
||||||
|
|
||||||
|
@ -78,8 +69,22 @@ static bool iterativelyFlattenCFG(Function &F, AliasAnalysis *AA) {
|
||||||
}
|
}
|
||||||
return Changed;
|
return Changed;
|
||||||
}
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
bool FlattenCFGPass::runOnFunction(Function &F) {
|
char FlattenCFGLegacyPass::ID = 0;
|
||||||
|
|
||||||
|
INITIALIZE_PASS_BEGIN(FlattenCFGLegacyPass, "flattencfg", "Flatten the CFG",
|
||||||
|
false, false)
|
||||||
|
INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
|
||||||
|
INITIALIZE_PASS_END(FlattenCFGLegacyPass, "flattencfg", "Flatten the CFG",
|
||||||
|
false, false)
|
||||||
|
|
||||||
|
// Public interface to the FlattenCFG pass
|
||||||
|
FunctionPass *llvm::createFlattenCFGPass() {
|
||||||
|
return new FlattenCFGLegacyPass();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool FlattenCFGLegacyPass::runOnFunction(Function &F) {
|
||||||
AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
|
AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();
|
||||||
bool EverChanged = false;
|
bool EverChanged = false;
|
||||||
// iterativelyFlattenCFG can make some blocks dead.
|
// iterativelyFlattenCFG can make some blocks dead.
|
||||||
|
@ -89,3 +94,15 @@ bool FlattenCFGPass::runOnFunction(Function &F) {
|
||||||
}
|
}
|
||||||
return EverChanged;
|
return EverChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PreservedAnalyses FlattenCFGPass::run(Function &F,
|
||||||
|
FunctionAnalysisManager &AM) {
|
||||||
|
bool EverChanged = false;
|
||||||
|
AliasAnalysis *AA = &AM.getResult<AAManager>(F);
|
||||||
|
// iterativelyFlattenCFG can make some blocks dead.
|
||||||
|
while (iterativelyFlattenCFG(F, AA)) {
|
||||||
|
removeUnreachableBlocks(F);
|
||||||
|
EverChanged = true;
|
||||||
|
}
|
||||||
|
return EverChanged ? PreservedAnalyses::none() : PreservedAnalyses::all();
|
||||||
|
}
|
||||||
|
|
|
@ -54,7 +54,7 @@ void llvm::initializeScalarOpts(PassRegistry &Registry) {
|
||||||
initializeMakeGuardsExplicitLegacyPassPass(Registry);
|
initializeMakeGuardsExplicitLegacyPassPass(Registry);
|
||||||
initializeGVNHoistLegacyPassPass(Registry);
|
initializeGVNHoistLegacyPassPass(Registry);
|
||||||
initializeGVNSinkLegacyPassPass(Registry);
|
initializeGVNSinkLegacyPassPass(Registry);
|
||||||
initializeFlattenCFGPassPass(Registry);
|
initializeFlattenCFGLegacyPassPass(Registry);
|
||||||
initializeIRCELegacyPassPass(Registry);
|
initializeIRCELegacyPassPass(Registry);
|
||||||
initializeIndVarSimplifyLegacyPassPass(Registry);
|
initializeIndVarSimplifyLegacyPassPass(Registry);
|
||||||
initializeInferAddressSpacesPass(Registry);
|
initializeInferAddressSpacesPass(Registry);
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
; RUN: opt -flattencfg -S < %s -enable-new-pm=0 | FileCheck %s
|
; RUN: opt -flattencfg -S < %s -enable-new-pm=0 | FileCheck %s
|
||||||
|
; RUN: opt -passes=flattencfg -S < %s | FileCheck %s
|
||||||
|
|
||||||
|
|
||||||
; This test checks whether the pass completes without a crash.
|
; This test checks whether the pass completes without a crash.
|
||||||
|
|
Loading…
Reference in New Issue