[gcc r10-11052] Fix VCOND expansion

Eric Botcazou ebotcazou@gcc.gnu.org
Fri Oct 21 14:10:18 GMT 2022


https://gcc.gnu.org/g:5076eefe23b96279e34351a2a044858bae3251ae

commit r10-11052-g5076eefe23b96279e34351a2a044858bae3251ae
Author: Eric Botcazou <ebotcazou@adacore.com>
Date:   Fri Oct 21 15:46:37 2022 +0200

    Fix VCOND expansion
    
    Instead of only allowing the signed optab to provide EQ/NE compares, we
    allow both here since there seems to be no documented canonicalization.
    
    gcc/
            PR target/107336
            * optabs.c (expand_vec_cond_expr): Query both VCOND and VCONDU for
            EQ and NE.

Diff:
---
 gcc/optabs.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/gcc/optabs.c b/gcc/optabs.c
index 64f23d2c293..93f99423727 100644
--- a/gcc/optabs.c
+++ b/gcc/optabs.c
@@ -5902,6 +5902,14 @@ expand_vec_cond_expr (tree vec_cond_type, tree op0, tree op1, tree op2,
 			   GET_MODE_NUNITS (cmp_op_mode)));
 
   icode = get_vcond_icode (mode, cmp_op_mode, unsignedp);
+  /* Some targets do not have vcondeq and only vcond with NE/EQ
+     but not vcondu, so make sure to also try vcond here as
+     vcond_icode_p would canonicalize the optab query to.  */
+  if (icode == CODE_FOR_nothing
+      && (tcode == NE_EXPR || tcode == EQ_EXPR)
+      && ((icode = get_vcond_icode (mode, cmp_op_mode, !unsignedp))
+	  != CODE_FOR_nothing))
+    unsignedp = !unsignedp;
   if (icode == CODE_FOR_nothing)
     {
       if (tcode == LT_EXPR


More information about the Gcc-cvs mailing list