mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 16:33:28 +00:00
Teach cee to propagate through switch statements. This implements
Transforms/CorrelatedExprs/switch.ll Patch contributed by Eric Kidd! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26872 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2c58d3ac82
commit
273f202890
@ -267,6 +267,7 @@ namespace {
|
||||
const std::vector<BasicBlock*> &RegionExitBlocks);
|
||||
|
||||
void PropagateBranchInfo(BranchInst *BI);
|
||||
void PropagateSwitchInfo(SwitchInst *SI);
|
||||
void PropagateEquality(Value *Op0, Value *Op1, RegionInfo &RI);
|
||||
void PropagateRelation(Instruction::BinaryOps Opcode, Value *Op0,
|
||||
Value *Op1, RegionInfo &RI);
|
||||
@ -360,9 +361,12 @@ bool CEE::TransformRegion(BasicBlock *BB, std::set<BasicBlock*> &VisitedBlocks){
|
||||
// Now that all of our successors have information if they deserve it,
|
||||
// propagate any information our terminator instruction finds to our
|
||||
// successors.
|
||||
if (BranchInst *BI = dyn_cast<BranchInst>(TI))
|
||||
if (BranchInst *BI = dyn_cast<BranchInst>(TI)) {
|
||||
if (BI->isConditional())
|
||||
PropagateBranchInfo(BI);
|
||||
} else if (SwitchInst *SI = dyn_cast<SwitchInst>(TI)) {
|
||||
PropagateSwitchInfo(SI);
|
||||
}
|
||||
|
||||
// If this is a branch to a block outside our region that simply performs
|
||||
// another conditional branch, one whose outcome is known inside of this
|
||||
@ -794,6 +798,22 @@ void CEE::PropagateBranchInfo(BranchInst *BI) {
|
||||
}
|
||||
|
||||
|
||||
// PropagateSwitchInfo - We need to propagate the value tested by the
|
||||
// switch statement through each case block.
|
||||
//
|
||||
void CEE::PropagateSwitchInfo(SwitchInst *SI) {
|
||||
// Propagate information down each of our non-default case labels. We
|
||||
// don't yet propagate information down the default label, because a
|
||||
// potentially large number of inequality constraints provide less
|
||||
// benefit per unit work than a single equality constraint.
|
||||
//
|
||||
Value *cond = SI->getCondition();
|
||||
for (unsigned i = 1; i < SI->getNumSuccessors(); ++i)
|
||||
PropagateEquality(cond, SI->getSuccessorValue(i),
|
||||
getRegionInfo(SI->getSuccessor(i)));
|
||||
}
|
||||
|
||||
|
||||
// PropagateEquality - If we discover that two values are equal to each other in
|
||||
// a specified region, propagate this knowledge recursively.
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user