[RISCV][GISEL] Instruction select for scalable G_SELECT
SelectionDAG has SELECT and VSELECT SELECT restricts the condition operand to an i1 and the true and false operands can be vectors. The result of a SELECT has the same type as the true and false operands. VSELECT has a vector condition operand and the true and false operands must be vectors. The result of a VSELECT has a vector result. GlobalISel has G_SELECT which has condition operand that is an i1 if the true and false operands are scalar and a vector type with i1 elements if the true and false operands are vector. A G_SELECT acts like a ISD::SELECT when the operands are all scalar, and an ISD::VSELECT when the operands are are scalar. A G_SELECT cannot act like a ISD::SELECT with an i1 condition and vector operands because the type system. In this patch, we would like to take advantage of the patterns written for SELECT and VSELECT, so we mark G_SELECT equivalent to both SELECT and VSELECT to reuse the patterns. Since we cannot write a `G_SELECT (s1), (vector-ty), (vector-ty)`, we don't have to worry about accidently matching the SDAG patterns of that nature. We will probably need a way to represent an i1 condition with vector true and false operands in the future. That can be the topic of another patch.
parent
973e9dbd
Please register or sign in to comment