Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 15 additions & 13 deletions llvm/lib/Transforms/Utils/SimplifyCFG.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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<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);
Expand All @@ -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;
}
Expand Down Expand Up @@ -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)
Expand All @@ -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);
Expand Down