[Bug target/115659] powerpc fallout from removing vcond{,u,eq} patterns

2024-06-26 Thread linkw at gcc dot gnu.org via Gcc-bugs
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?

[Bug target/115659] powerpc fallout from removing vcond{,u,eq} patterns

2024-06-25 Thread linkw at gcc dot gnu.org via Gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115659

Kewen Lin  changed:

   What|Removed |Added

 Blocks||114189
 CC||bergner at gcc dot gnu.org,
   ||rguenth at gcc dot gnu.org,
   ||rsandifo at gcc dot gnu.org,
   ||segher at gcc dot gnu.org
 Target||powerpc*
 Status|UNCONFIRMED |ASSIGNED
   Last reconfirmed||2024-06-26
   Keywords||missed-optimization
   Target Milestone|--- |15.0
   Assignee|unassigned at gcc dot gnu.org  |linkw at gcc dot gnu.org
 Ever confirmed|0   |1


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114189
[Bug 114189] Target implements obsolete vcond{,u,eq} expanders