diff options
author | Haochen Gui <guihaoc@gcc.gnu.org> | 2023-10-30 10:59:51 +0800 |
---|---|---|
committer | Haochen Gui <guihaoc@gcc.gnu.org> | 2023-10-30 11:02:29 +0800 |
commit | 8111b5c23bd14f80607bd35af58ec31e38a0378e (patch) | |
tree | 6ca43cab55dac03c891a9dfe86290e487701fec0 /gcc/expr.cc | |
parent | 39a11d8e0b9cc3ac5d7d1bfaef75639fc557fbe0 (diff) | |
download | gcc-8111b5c23bd14f80607bd35af58ec31e38a0378e.zip gcc-8111b5c23bd14f80607bd35af58ec31e38a0378e.tar.gz gcc-8111b5c23bd14f80607bd35af58ec31e38a0378e.tar.bz2 |
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.
Diffstat (limited to 'gcc/expr.cc')
-rw-r--r-- | gcc/expr.cc | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/gcc/expr.cc b/gcc/expr.cc index 7aac575..ed4dbb1 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; } } |