Skip to content

Commit e812b5f

Browse files
committed
[InstCombine] Add fold for select of symmetric selects
Alive2 proof: https://alive2.llvm.org/ce/z/4QAm4K
1 parent 434c238 commit e812b5f

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3012,6 +3012,28 @@ struct DecomposedSelect {
30123012
};
30133013
} // namespace
30143014

3015+
/// Folds patterns like:
3016+
/// select c2 (select c1 a b) (select c1 b a)
3017+
/// into:
3018+
/// select (xor c1 c2) b a
3019+
static Instruction *
3020+
foldSelectOfSymmetricSelect(SelectInst &OuterSelVal,
3021+
InstCombiner::BuilderTy &Builder) {
3022+
3023+
DecomposedSelect OuterSel, InnerSel;
3024+
if (!match(&OuterSelVal, m_Select(m_Value(OuterSel.Cond),
3025+
m_Select(m_Value(InnerSel.Cond),
3026+
m_Value(InnerSel.TrueVal),
3027+
m_Value(InnerSel.FalseVal)),
3028+
m_Select(m_Deferred(InnerSel.Cond),
3029+
m_Deferred(InnerSel.FalseVal),
3030+
m_Deferred(InnerSel.TrueVal)))))
3031+
return nullptr;
3032+
3033+
Value *Xor = Builder.CreateXor(InnerSel.Cond, OuterSel.Cond);
3034+
return SelectInst::Create(Xor, InnerSel.FalseVal, InnerSel.TrueVal);
3035+
}
3036+
30153037
/// Look for patterns like
30163038
/// %outer.cond = select i1 %inner.cond, i1 %alt.cond, i1 false
30173039
/// %inner.sel = select i1 %inner.cond, i8 %inner.sel.t, i8 %inner.sel.f
@@ -3987,6 +4009,9 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
39874009
}
39884010
}
39894011

4012+
if (Instruction *I = foldSelectOfSymmetricSelect(SI, Builder))
4013+
return I;
4014+
39904015
if (Instruction *I = foldNestedSelects(SI, Builder))
39914016
return I;
39924017

0 commit comments

Comments
 (0)