[SimplifyCFG] Avoid redundant calls in gather. (NFC) (#154133)
Split out from https://github.com/llvm/llvm-project/pull/154007 as it showed compile time improvements NFC as there needs to be at least two icmps that is part of the chain.
This commit is contained in:
parent
4a9d038acd
commit
1b60236200
@ -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 @@ private:
|
||||
/// 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<Value *, 8> DFT;
|
||||
SmallPtrSet<Value *, 8> Visited;
|
||||
|
||||
// Initialize
|
||||
Visited.insert(V);
|
||||
DFT.push_back(V);
|
||||
SmallVector<Value *, 8> DFT{Op0, Op1};
|
||||
SmallPtrSet<Value *, 8> Visited{V, Op0, Op1};
|
||||
|
||||
while (!DFT.empty()) {
|
||||
V = DFT.pop_back_val();
|
||||
|
||||
if (Instruction *I = dyn_cast<Instruction>(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 @@ private:
|
||||
}
|
||||
|
||||
// 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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user