diff options
author | Andreas Jonson <andjo403@hotmail.com> | 2025-08-18 18:45:52 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-18 18:45:52 +0200 |
commit | 1b60236200735abc39e5bd3a2280123e9789dec5 (patch) | |
tree | ee99d47dab0c7b3d2c4cd38602365791645e34cf /llvm/lib/Transforms/Utils/SimplifyCFG.cpp | |
parent | 4a9d038acd637c5742e6d1622d4ad803059825bd (diff) | |
download | llvm-1b60236200735abc39e5bd3a2280123e9789dec5.zip llvm-1b60236200735abc39e5bd3a2280123e9789dec5.tar.gz llvm-1b60236200735abc39e5bd3a2280123e9789dec5.tar.bz2 |
[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.
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyCFG.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/SimplifyCFG.cpp | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp index 0ca7188..055e8ca 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 @@ 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); |