mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-14 23:10:54 +00:00
[NFC] Refactor SimplifyCFG to make propagating information easier.
Reviewers: jdoerfert Reviewed By: jdoerfert Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D77742
This commit is contained in:
parent
79feafa514
commit
97ecd91e20
@ -202,10 +202,23 @@ class SimplifyCFGOpt {
|
||||
bool simplifyBranch(BranchInst *Branch, IRBuilder<> &Builder);
|
||||
bool simplifyUncondBranch(BranchInst *BI, IRBuilder<> &Builder);
|
||||
bool simplifyCondBranch(BranchInst *BI, IRBuilder<> &Builder);
|
||||
bool SimplifyCondBranchToTwoReturns(BranchInst *BI, IRBuilder<> &Builder);
|
||||
|
||||
bool tryToSimplifyUncondBranchWithICmpInIt(ICmpInst *ICI,
|
||||
IRBuilder<> &Builder);
|
||||
|
||||
bool HoistThenElseCodeToIf(BranchInst *BI, const TargetTransformInfo &TTI);
|
||||
bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
|
||||
const TargetTransformInfo &TTI);
|
||||
bool SimplifyTerminatorOnSelect(Instruction *OldTerm, Value *Cond,
|
||||
BasicBlock *TrueBB, BasicBlock *FalseBB,
|
||||
uint32_t TrueWeight, uint32_t FalseWeight);
|
||||
bool SimplifyBranchOnICmpChain(BranchInst *BI, IRBuilder<> &Builder,
|
||||
const DataLayout &DL);
|
||||
bool SimplifySwitchOnSelect(SwitchInst *SI, SelectInst *Select);
|
||||
bool SimplifyIndirectBrOnSelect(IndirectBrInst *IBI, SelectInst *SI);
|
||||
bool TurnSwitchRangeIntoICmp(SwitchInst *SI, IRBuilder<> &Builder);
|
||||
|
||||
public:
|
||||
SimplifyCFGOpt(const TargetTransformInfo &TTI, const DataLayout &DL,
|
||||
SmallPtrSetImpl<BasicBlock *> *LoopHeaders,
|
||||
@ -1235,8 +1248,8 @@ static bool passingValueIsAlwaysUndefined(Value *V, Instruction *I);
|
||||
/// Given a conditional branch that goes to BB1 and BB2, hoist any common code
|
||||
/// in the two blocks up into the branch block. The caller of this function
|
||||
/// guarantees that BI's block dominates BB1 and BB2.
|
||||
static bool HoistThenElseCodeToIf(BranchInst *BI,
|
||||
const TargetTransformInfo &TTI) {
|
||||
bool SimplifyCFGOpt::HoistThenElseCodeToIf(BranchInst *BI,
|
||||
const TargetTransformInfo &TTI) {
|
||||
// This does very trivial matching, with limited scanning, to find identical
|
||||
// instructions in the two blocks. In particular, we don't want to get into
|
||||
// O(M*N) situations here where M and N are the sizes of BB1 and BB2. As
|
||||
@ -1969,8 +1982,8 @@ static Value *isSafeToSpeculateStore(Instruction *I, BasicBlock *BrBB,
|
||||
/// \endcode
|
||||
///
|
||||
/// \returns true if the conditional block is removed.
|
||||
static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
|
||||
const TargetTransformInfo &TTI) {
|
||||
bool SimplifyCFGOpt::SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
|
||||
const TargetTransformInfo &TTI) {
|
||||
// Be conservative for now. FP select instruction can often be expensive.
|
||||
Value *BrCond = BI->getCondition();
|
||||
if (isa<FCmpInst>(BrCond))
|
||||
@ -2462,8 +2475,8 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI,
|
||||
/// If we found a conditional branch that goes to two returning blocks,
|
||||
/// try to merge them together into one return,
|
||||
/// introducing a select if the return values disagree.
|
||||
static bool SimplifyCondBranchToTwoReturns(BranchInst *BI,
|
||||
IRBuilder<> &Builder) {
|
||||
bool SimplifyCFGOpt::SimplifyCondBranchToTwoReturns(BranchInst *BI,
|
||||
IRBuilder<> &Builder) {
|
||||
assert(BI->isConditional() && "Must be a conditional branch");
|
||||
BasicBlock *TrueSucc = BI->getSuccessor(0);
|
||||
BasicBlock *FalseSucc = BI->getSuccessor(1);
|
||||
@ -3522,10 +3535,11 @@ static bool SimplifyCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI,
|
||||
// Takes care of updating the successors and removing the old terminator.
|
||||
// Also makes sure not to introduce new successors by assuming that edges to
|
||||
// non-successor TrueBBs and FalseBBs aren't reachable.
|
||||
static bool SimplifyTerminatorOnSelect(Instruction *OldTerm, Value *Cond,
|
||||
BasicBlock *TrueBB, BasicBlock *FalseBB,
|
||||
uint32_t TrueWeight,
|
||||
uint32_t FalseWeight) {
|
||||
bool SimplifyCFGOpt::SimplifyTerminatorOnSelect(Instruction *OldTerm,
|
||||
Value *Cond, BasicBlock *TrueBB,
|
||||
BasicBlock *FalseBB,
|
||||
uint32_t TrueWeight,
|
||||
uint32_t FalseWeight) {
|
||||
// Remove any superfluous successor edges from the CFG.
|
||||
// First, figure out which successors to preserve.
|
||||
// If TrueBB and FalseBB are equal, only try to preserve one copy of that
|
||||
@ -3585,7 +3599,8 @@ static bool SimplifyTerminatorOnSelect(Instruction *OldTerm, Value *Cond,
|
||||
// (switch (select cond, X, Y)) on constant X, Y
|
||||
// with a branch - conditional if X and Y lead to distinct BBs,
|
||||
// unconditional otherwise.
|
||||
static bool SimplifySwitchOnSelect(SwitchInst *SI, SelectInst *Select) {
|
||||
bool SimplifyCFGOpt::SimplifySwitchOnSelect(SwitchInst *SI,
|
||||
SelectInst *Select) {
|
||||
// Check for constant integer values in the select.
|
||||
ConstantInt *TrueVal = dyn_cast<ConstantInt>(Select->getTrueValue());
|
||||
ConstantInt *FalseVal = dyn_cast<ConstantInt>(Select->getFalseValue());
|
||||
@ -3621,7 +3636,8 @@ static bool SimplifySwitchOnSelect(SwitchInst *SI, SelectInst *Select) {
|
||||
// blockaddress(@fn, BlockB)))
|
||||
// with
|
||||
// (br cond, BlockA, BlockB).
|
||||
static bool SimplifyIndirectBrOnSelect(IndirectBrInst *IBI, SelectInst *SI) {
|
||||
bool SimplifyCFGOpt::SimplifyIndirectBrOnSelect(IndirectBrInst *IBI,
|
||||
SelectInst *SI) {
|
||||
// Check that both operands of the select are block addresses.
|
||||
BlockAddress *TBA = dyn_cast<BlockAddress>(SI->getTrueValue());
|
||||
BlockAddress *FBA = dyn_cast<BlockAddress>(SI->getFalseValue());
|
||||
@ -3756,8 +3772,9 @@ bool SimplifyCFGOpt::tryToSimplifyUncondBranchWithICmpInIt(
|
||||
/// The specified branch is a conditional branch.
|
||||
/// Check to see if it is branching on an or/and chain of icmp instructions, and
|
||||
/// fold it into a switch instruction if so.
|
||||
static bool SimplifyBranchOnICmpChain(BranchInst *BI, IRBuilder<> &Builder,
|
||||
const DataLayout &DL) {
|
||||
bool SimplifyCFGOpt::SimplifyBranchOnICmpChain(BranchInst *BI,
|
||||
IRBuilder<> &Builder,
|
||||
const DataLayout &DL) {
|
||||
Instruction *Cond = dyn_cast<Instruction>(BI->getCondition());
|
||||
if (!Cond)
|
||||
return false;
|
||||
@ -4407,7 +4424,8 @@ static void createUnreachableSwitchDefault(SwitchInst *Switch) {
|
||||
|
||||
/// Turn a switch with two reachable destinations into an integer range
|
||||
/// comparison and branch.
|
||||
static bool TurnSwitchRangeIntoICmp(SwitchInst *SI, IRBuilder<> &Builder) {
|
||||
bool SimplifyCFGOpt::TurnSwitchRangeIntoICmp(SwitchInst *SI,
|
||||
IRBuilder<> &Builder) {
|
||||
assert(SI->getNumCases() > 1 && "Degenerate switch?");
|
||||
|
||||
bool HasDefault =
|
||||
|
Loading…
x
Reference in New Issue
Block a user