From 395252d93eb68e1c3e9bbd8106f1512abd745761 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 13 Dec 2010 04:15:19 +0000 Subject: [PATCH] inline a function, making the result much simpler. llvm-svn: 121675 --- llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 38 +++++++---------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 68f6905d4b54..d3181b138a77 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -347,31 +347,6 @@ GatherConstantSetNEs(Value *V, std::vector &Values, return 0; } -/// GatherValueComparisons - If the specified Cond is an 'and' or 'or' of a -/// bunch of comparisons of one value against constants, return the value and -/// the constants being compared. -static bool GatherValueComparisons(Value *CondV, Value *&CompVal, - std::vector &Values, - const TargetData *TD) { - Instruction *Cond = dyn_cast(CondV); - if (Cond == 0) return false; - - if (Cond->getOpcode() == Instruction::Or) { - CompVal = GatherConstantSetEQs(Cond, Values, TD); - - // Return true to indicate that the condition is true if the CompVal is - // equal to one of the constants. - return true; - } - if (Cond->getOpcode() == Instruction::And) { - CompVal = GatherConstantSetNEs(Cond, Values, TD); - - // Return false to indicate that the condition is false if the CompVal is - // equal to one of the constants. - return false; - } - return false; -} static void EraseTerminatorInstAndDCECond(TerminatorInst *TI) { Instruction* Cond = 0; @@ -2096,8 +2071,17 @@ bool SimplifyCFGOpt::run(BasicBlock *BB) { // 'setne's and'ed together, collect them. Value *CompVal = 0; std::vector Values; - bool TrueWhenEqual = GatherValueComparisons(BI->getCondition(), CompVal, - Values, TD); + bool TrueWhenEqual = true; + + if (Instruction *Cond = dyn_cast(BI->getCondition())) { + if (Cond->getOpcode() == Instruction::Or) { + CompVal = GatherConstantSetEQs(Cond, Values, TD); + } else if (Cond->getOpcode() == Instruction::And) { + CompVal = GatherConstantSetNEs(Cond, Values, TD); + TrueWhenEqual = false; + } + } + if (CompVal) { // There might be duplicate constants in the list, which the switch // instruction can't handle, remove them now.