]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Re: [PATCH] match: Check else value compatibility [PR123268].
authorRobin Dapp <rdapp.gcc@gmail.com>
Thu, 8 Jan 2026 15:35:52 +0000 (08:35 -0700)
committerJeff Law <jeffrey.law@oss.qualcomm.com>
Thu, 8 Jan 2026 15:35:52 +0000 (08:35 -0700)
In PR123268 we transform x * { 0 or 1, 0 or 1, ... } into
x & { 0 or -1, 0 or -1, ...} which is a match.pd pattern.

We start out with
  vect_b_28.48_48 = .COND_LEN_MUL ({ -1, -1, -1, -1 }, a, b, { 0.0, 0.0, 0.0, 0.0 }, 4, 0);
and simplify to

_67 = .COND_LEN_AND ({ -1, -1, -1, -1 }, _60, { 4294967295, 0, 0, 0 }, { 0.0, 0.0, 0.0, 0.0 }, 4, 0);

where the operation type is int but the else value (that we just copied
over from the original op) is still float.

In order to catch that, this patch checks if the operation type and the
else value type are compatible while reassembling the conditional
operation.

PR target/123268
gcc/ChangeLog:

* gimple-match-exports.cc (convert_conditional_op): Check if
orig_op->type and type of else value match.

gcc/gimple-match-exports.cc

index 2f4ac960cb11a46dac2249b1ef39f4bbd8a5a1bd..5fd1baba7a41bae9ac2c419081595ae0501cfbbd 100644 (file)
@@ -184,6 +184,13 @@ convert_conditional_op (gimple_match_op *orig_op,
   for (unsigned int i = 0; i < num_ops; ++i)
     new_op->ops[i + 1] = orig_op->ops[i];
   tree else_value = orig_op->cond.else_value;
+  /* Some patterns convert operand types, e.g. from float to int.
+     If we had a real else value before (e.g. float) it won't match
+     the type.  Verify that here.  */
+  if (else_value
+      && !types_compatible_p (orig_op->type, TREE_TYPE (else_value)))
+    return false;
+
   if (!else_value)
     else_value = targetm.preferred_else_value (ifn, orig_op->type,
                                               num_ops, orig_op->ops);