From 0aa749bde7c696e0522df5581ea9cc70f25e62cb Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 13 Dec 2010 04:26:26 +0000 Subject: [PATCH] merge two very similar functions into one that has a bool argument. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121678 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/SimplifyCFG.cpp | 73 ++++++++++------------------ 1 file changed, 26 insertions(+), 47 deletions(-) diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index a1e7486ba50..55c6afe52a0 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -291,61 +291,39 @@ static ConstantInt *GetConstantInt(Value *V, const TargetData *TD) { return 0; } -/// GatherConstantSetEQs - Given a potentially 'or'd together collection of -/// icmp_eq instructions that compare a value against a constant, return the -/// value being compared, and stick the constant into the Values vector. +/// GatherConstantCompares - Given a potentially 'or'd or 'and'd together +/// collection of icmp eq/ne instructions that compare a value against a +/// constant, return the value being compared, and stick the constant into the +/// Values vector. static Value * -GatherConstantSetEQs(Value *V, std::vector &Values, - const TargetData *TD) { - Instruction *Inst = dyn_cast(V); - if (Inst == 0) return 0; +GatherConstantCompares(Value *V, std::vector &Vals, Value *&Extra, + const TargetData *TD, bool isEQ) { + Instruction *I = dyn_cast(V); + if (I == 0) return 0; - if (Inst->getOpcode() == Instruction::ICmp && - cast(Inst)->getPredicate() == ICmpInst::ICMP_EQ) { - if (ConstantInt *C = GetConstantInt(Inst->getOperand(1), TD)) { - Values.push_back(C); - return Inst->getOperand(0); - } + if (ICmpInst *ICI = dyn_cast(I)) { + if (ICI->getPredicate() == (isEQ ? ICmpInst::ICMP_EQ : ICmpInst::ICMP_NE)) + if (ConstantInt *C = GetConstantInt(I->getOperand(1), TD)) { + Vals.push_back(C); + return I->getOperand(0); + } return 0; } - if (Inst->getOpcode() == Instruction::Or) { - if (Value *LHS = GatherConstantSetEQs(Inst->getOperand(0), Values, TD)) - if (Value *RHS = GatherConstantSetEQs(Inst->getOperand(1), Values, TD)) - if (LHS == RHS) - return LHS; - } - return 0; -} - -/// GatherConstantSetNEs - Given a potentially 'and'd together collection of -/// setne instructions that compare a value against a constant, return the value -/// being compared, and stick the constant into the Values vector. -static Value * -GatherConstantSetNEs(Value *V, std::vector &Values, - const TargetData *TD) { - Instruction *Inst = dyn_cast(V); - if (Inst == 0) return 0; - - if (Inst->getOpcode() == Instruction::ICmp && - cast(Inst)->getPredicate() == ICmpInst::ICMP_NE) { - if (ConstantInt *C = GetConstantInt(Inst->getOperand(1), TD)) { - Values.push_back(C); - return Inst->getOperand(0); - } + if (I->getOpcode() != (isEQ ? Instruction::Or : Instruction::And)) return 0; - } - if (Inst->getOpcode() == Instruction::And) { - if (Value *LHS = GatherConstantSetNEs(Inst->getOperand(0), Values, TD)) - if (Value *RHS = GatherConstantSetNEs(Inst->getOperand(1), Values, TD)) - if (LHS == RHS) - return LHS; + if (Value *LHS = GatherConstantCompares(I->getOperand(0), Vals, Extra, TD, + isEQ)) { + if (Value *RHS = GatherConstantCompares(I->getOperand(1), Vals, Extra, TD, + isEQ)) { + if (LHS == RHS) + return LHS; + } } return 0; } - - + static void EraseTerminatorInstAndDCECond(TerminatorInst *TI) { Instruction* Cond = 0; if (SwitchInst *SI = dyn_cast(TI)) { @@ -2070,12 +2048,13 @@ bool SimplifyCFGOpt::run(BasicBlock *BB) { Value *CompVal = 0; std::vector Values; bool TrueWhenEqual = true; + Value *ExtraCase = 0; if (Instruction *Cond = dyn_cast(BI->getCondition())) { if (Cond->getOpcode() == Instruction::Or) { - CompVal = GatherConstantSetEQs(Cond, Values, TD); + CompVal = GatherConstantCompares(Cond, Values, ExtraCase, TD, true); } else if (Cond->getOpcode() == Instruction::And) { - CompVal = GatherConstantSetNEs(Cond, Values, TD); + CompVal = GatherConstantCompares(Cond, Values, ExtraCase, TD, false); TrueWhenEqual = false; } } -- 2.34.1