@@ -3012,6 +3012,28 @@ struct DecomposedSelect {
3012
3012
};
3013
3013
} // namespace
3014
3014
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
+
3015
3037
// / Look for patterns like
3016
3038
// / %outer.cond = select i1 %inner.cond, i1 %alt.cond, i1 false
3017
3039
// / %inner.sel = select i1 %inner.cond, i8 %inner.sel.t, i8 %inner.sel.f
@@ -3987,6 +4009,9 @@ Instruction *InstCombinerImpl::visitSelectInst(SelectInst &SI) {
3987
4009
}
3988
4010
}
3989
4011
4012
+ if (Instruction *I = foldSelectOfSymmetricSelect (SI, Builder))
4013
+ return I;
4014
+
3990
4015
if (Instruction *I = foldNestedSelects (SI, Builder))
3991
4016
return I;
3992
4017
0 commit comments