https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115659
--- Comment #1 from Kewen Lin ---
Now isel has some handling on x CMP y ? -1 : 0 to x CMP y,
/* Try to fold x CMP y ? -1 : 0 to x CMP y. */
if (can_compute_op0
&& integer_minus_onep (op1)
&& integer_zerop (op2)
&& TYPE_MODE (TREE_TYPE (lhs)) == TYPE_MODE (TREE_TYPE (op0)))
{
tree conv_op = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (lhs), op0);
gassign *new_stmt = gimple_build_assign (lhs, conv_op);
gsi_replace (gsi, new_stmt, true);
return new_stmt;
}
it looks can be extended to cover:
c = x CMP y
r = c ? -1 : z => r = c ? c : z
r = c ? z : 0 => r = c ? z : c
, but better to be supported in match.pd?
The handling in rs6000_emit_vector_cond_expr already knows inversion happens or
not, so it further handles the case like:
c = x CMP y // c' = x OP y, c = ~c'
r = c ? 0 : z => r = c' ? z : c'
r = c ? z : -1 => r = c' ? c' : z
it seems to need a helper to query whether if target would expand with
inversion for one given comparison operator?