public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-5001] Expand: Checking available optabs for scalar modes in by pieces operations
@ 2023-10-30  3:03 HaoChen Gui
  0 siblings, 0 replies; only message in thread
From: HaoChen Gui @ 2023-10-30  3:03 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:8111b5c23bd14f80607bd35af58ec31e38a0378e

commit r14-5001-g8111b5c23bd14f80607bd35af58ec31e38a0378e
Author: Haochen Gui <guihaoc@gcc.gnu.org>
Date:   Mon Oct 30 10:59:51 2023 +0800

    Expand: Checking available optabs for scalar modes in by pieces operations
    
    The former patch (f08ca5903c7) examines the scalar modes by target
    hook scalar_mode_supported_p.  It causes some i386 regression cases
    as XImode and OImode are not enabled in i386 target function.  This
    patch examines the scalar mode by checking if the corresponding optabs
    are available for the mode.
    
    gcc/
            PR target/111449
            * expr.cc (qi_vector_mode_supported_p): Rename to...
            (by_pieces_mode_supported_p): ...this, and extends it to do
            the checking for both scalar and vector mode.
            (widest_fixed_size_mode_for_size): Call
            by_pieces_mode_supported_p to examine the mode.
            (op_by_pieces_d::smallest_fixed_size_mode_for_size): Likewise.

Diff:
---
 gcc/expr.cc | 23 +++++++++++++----------
 1 file changed, 13 insertions(+), 10 deletions(-)

diff --git a/gcc/expr.cc b/gcc/expr.cc
index 7aac575eff8a..ed4dbb13d893 100644
--- a/gcc/expr.cc
+++ b/gcc/expr.cc
@@ -1000,18 +1000,21 @@ can_use_qi_vectors (by_pieces_operation op)
 /* Return true if optabs exists for the mode and certain by pieces
    operations.  */
 static bool
-qi_vector_mode_supported_p (fixed_size_mode mode, by_pieces_operation op)
+by_pieces_mode_supported_p (fixed_size_mode mode, by_pieces_operation op)
 {
+  if (optab_handler (mov_optab, mode) == CODE_FOR_nothing)
+    return false;
+
   if ((op == SET_BY_PIECES || op == CLEAR_BY_PIECES)
-      && optab_handler (vec_duplicate_optab, mode) != CODE_FOR_nothing)
-    return true;
+      && VECTOR_MODE_P (mode)
+      && optab_handler (vec_duplicate_optab, mode) == CODE_FOR_nothing)
+    return false;
 
   if (op == COMPARE_BY_PIECES
-      && optab_handler (mov_optab, mode) != CODE_FOR_nothing
-      && can_compare_p (EQ, mode, ccp_jump))
-    return true;
+      && !can_compare_p (EQ, mode, ccp_jump))
+    return false;
 
-  return false;
+  return true;
 }
 
 /* Return the widest mode that can be used to perform part of an
@@ -1035,7 +1038,7 @@ widest_fixed_size_mode_for_size (unsigned int size, by_pieces_operation op)
 	  {
 	    if (GET_MODE_SIZE (candidate) >= size)
 	      break;
-	    if (qi_vector_mode_supported_p (candidate, op))
+	    if (by_pieces_mode_supported_p (candidate, op))
 	      result = candidate;
 	  }
 
@@ -1049,7 +1052,7 @@ widest_fixed_size_mode_for_size (unsigned int size, by_pieces_operation op)
     {
       mode = tmode.require ();
       if (GET_MODE_SIZE (mode) < size
-	  && targetm.scalar_mode_supported_p (mode))
+	  && by_pieces_mode_supported_p (mode, op))
       result = mode;
     }
 
@@ -1454,7 +1457,7 @@ op_by_pieces_d::smallest_fixed_size_mode_for_size (unsigned int size)
 	      break;
 
 	    if (GET_MODE_SIZE (candidate) >= size
-		&& qi_vector_mode_supported_p (candidate, m_op))
+		&& by_pieces_mode_supported_p (candidate, m_op))
 	      return candidate;
 	  }
     }

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-10-30  3:03 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-30  3:03 [gcc r14-5001] Expand: Checking available optabs for scalar modes in by pieces operations HaoChen Gui

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).