https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121714
--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Or maybe we should try vector of QI mode for sizes larger than word_mode. Like what is done for op_by_pieces_d. ``` /* Use QI vector only if size is wider than a WORD. */ if (can_use_qi_vectors (op)) { machine_mode mode; fixed_size_mode candidate; FOR_EACH_MODE_IN_CLASS (mode, MODE_VECTOR_INT) if (is_a<fixed_size_mode> (mode, &candidate) && GET_MODE_SIZE (candidate) > UNITS_PER_WORD && GET_MODE_INNER (candidate) == QImode) { if (GET_MODE_SIZE (candidate) >= size) break; if (by_pieces_mode_supported_p (candidate, op)) result = candidate; } if (result != NARROWEST_INT_MODE) return result; } ``` can_use_qi_vectors returns true for COMPARE_BY_PIECES. And by_pieces_mode_supported_p is defined like: ``` static bool 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 == COMPARE_BY_PIECES && !can_compare_p (EQ, mode, ccp_jump)) return false; ``` Though for gimple level we should use: if (expand_vec_cmp_expr_p (TREE_TYPE (op0), type, code)) return NULL_TREE; Or: get_vec_cmp_eq_icode (mode, TYPE_MODE (boolean_type_node)) != CODE_FOR_nothing