mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-26 20:26:07 +00:00
Teach SimplifyCFG that (switch (select cond, X, Y)) is better expressed as a branch.
Based on a patch by Alistair Lynn. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126647 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1800,6 +1800,26 @@ static bool SimplifyTerminatorOnSelect(TerminatorInst *OldTerm, Value *Cond,
|
||||
return true;
|
||||
}
|
||||
|
||||
// SimplifySwitchOnSelect - Replaces
|
||||
// (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) {
|
||||
// Check for constant integer values in the select.
|
||||
ConstantInt *TrueVal = dyn_cast<ConstantInt>(Select->getTrueValue());
|
||||
ConstantInt *FalseVal = dyn_cast<ConstantInt>(Select->getFalseValue());
|
||||
if (!TrueVal || !FalseVal)
|
||||
return false;
|
||||
|
||||
// Find the relevant condition and destinations.
|
||||
Value *Condition = Select->getCondition();
|
||||
BasicBlock *TrueBB = SI->getSuccessor(SI->findCaseValue(TrueVal));
|
||||
BasicBlock *FalseBB = SI->getSuccessor(SI->findCaseValue(FalseVal));
|
||||
|
||||
// Perform the actual simplification.
|
||||
return SimplifyTerminatorOnSelect(SI, Condition, TrueBB, FalseBB);
|
||||
}
|
||||
|
||||
// SimplifyIndirectBrOnSelect - Replaces
|
||||
// (indirectbr (select cond, blockaddress(@fn, BlockA),
|
||||
// blockaddress(@fn, BlockB)))
|
||||
@@ -2309,7 +2329,12 @@ bool SimplifyCFGOpt::SimplifySwitch(SwitchInst *SI) {
|
||||
if (BasicBlock *OnlyPred = BB->getSinglePredecessor())
|
||||
if (SimplifyEqualityComparisonWithOnlyPredecessor(SI, OnlyPred))
|
||||
return SimplifyCFG(BB) | true;
|
||||
|
||||
|
||||
Value *Cond = SI->getCondition();
|
||||
if (SelectInst *Select = dyn_cast<SelectInst>(Cond))
|
||||
if (SimplifySwitchOnSelect(SI, Select))
|
||||
return SimplifyCFG(BB) | true;
|
||||
|
||||
// If the block only contains the switch, see if we can fold the block
|
||||
// away into any preds.
|
||||
BasicBlock::iterator BBI = BB->begin();
|
||||
|
Reference in New Issue
Block a user