diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 0ca7188470d8e..055e8cadaab76 100644 --- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp @@ -565,6 +565,9 @@ struct ConstantComparesGatherer { /// Number of comparisons matched in the and/or chain unsigned UsedICmps = 0; + /// If the elements in Vals matches the comparisons + bool IsEq = false; + /// Construct and compute the result for the comparison instruction Cond ConstantComparesGatherer(Instruction *Cond, const DataLayout &DL) : DL(DL) { gather(Cond); @@ -736,23 +739,23 @@ struct ConstantComparesGatherer { /// vector. /// One "Extra" case is allowed to differ from the other. void gather(Value *V) { - bool isEQ = match(V, m_LogicalOr(m_Value(), m_Value())); - + Value *Op0, *Op1; + if (match(V, m_LogicalOr(m_Value(Op0), m_Value(Op1)))) + IsEq = true; + else if (match(V, m_LogicalAnd(m_Value(Op0), m_Value(Op1)))) + IsEq = false; + else + return; // Keep a stack (SmallVector for efficiency) for depth-first traversal - SmallVector DFT; - SmallPtrSet Visited; - - // Initialize - Visited.insert(V); - DFT.push_back(V); + SmallVector DFT{Op0, Op1}; + SmallPtrSet Visited{V, Op0, Op1}; while (!DFT.empty()) { V = DFT.pop_back_val(); if (Instruction *I = dyn_cast(V)) { // If it is a || (or && depending on isEQ), process the operands. - Value *Op0, *Op1; - if (isEQ ? match(I, m_LogicalOr(m_Value(Op0), m_Value(Op1))) + if (IsEq ? match(I, m_LogicalOr(m_Value(Op0), m_Value(Op1))) : match(I, m_LogicalAnd(m_Value(Op0), m_Value(Op1)))) { if (Visited.insert(Op1).second) DFT.push_back(Op1); @@ -763,7 +766,7 @@ struct ConstantComparesGatherer { } // Try to match the current instruction - if (matchInstruction(I, isEQ)) + if (matchInstruction(I, IsEq)) // Match succeed, continue the loop continue; } @@ -5103,6 +5106,7 @@ bool SimplifyCFGOpt::simplifyBranchOnICmpChain(BranchInst *BI, Value *CompVal = ConstantCompare.CompValue; unsigned UsedICmps = ConstantCompare.UsedICmps; Value *ExtraCase = ConstantCompare.Extra; + bool TrueWhenEqual = ConstantCompare.IsEq; // If we didn't have a multiply compared value, fail. if (!CompVal) @@ -5112,8 +5116,6 @@ bool SimplifyCFGOpt::simplifyBranchOnICmpChain(BranchInst *BI, if (UsedICmps <= 1) return false; - bool TrueWhenEqual = match(Cond, m_LogicalOr(m_Value(), m_Value())); - // There might be duplicate constants in the list, which the switch // instruction can't handle, remove them now. array_pod_sort(Values.begin(), Values.end(), constantIntSortPredicate);