https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99102

--- Comment #4 from Joel Hutton <joelh at gcc dot gnu.org> ---
It seems it is vectorizing a 'MASK_STORE' into a 'SCATTER_STORE' when it should
be using a 'MASK_SCATTER_STORE'. Currently it's choosing between
IFN_SCATTER_STORE and IFN_MASK_SCATTER_STORE based on the
'using_partial_vectors' field.

 7729   vec_loop_masks *loop_masks
 7730     = (loop_vinfo && LOOP_VINFO_FULLY_MASKED_P (loop_vinfo)
 7731        ? &LOOP_VINFO_MASKS (loop_vinfo)
 7732        : NULL);
 7733   vec_loop_lens *loop_lens
 7734     = (loop_vinfo && LOOP_VINFO_FULLY_WITH_LENGTH_P (loop_vinfo)
 7735        ? &LOOP_VINFO_LENS (loop_vinfo)
 7736        : NULL);

 806 #define LOOP_VINFO_FULLY_MASKED_P(L)>--->-------\$
 807   (LOOP_VINFO_USING_PARTIAL_VECTORS_P (L)>------\$
 808    && !LOOP_VINFO_MASKS (L).is_empty ())$
 809 $

 8005               if (memory_access_type == VMAT_GATHER_SCATTER)
 8006                 {
 8007                   tree scale = size_int (gs_info.scale);
 8008                   gcall *call;
 8009                   if (loop_masks)
 8010                     call = gimple_build_call_internal
 8011                       (IFN_MASK_SCATTER_STORE, 5, dataref_ptr,
vec_offset,
 8012                        scale, vec_oprnd, final_mask);
 8013                   else
 8014                     call = gimple_build_call_internal
 8015                       (IFN_SCATTER_STORE, 4, dataref_ptr, vec_offset,
 8016                        scale, vec_oprnd);
 8017                   gimple_call_set_nothrow (call, true);
 8018                   vect_finish_stmt_generation (vinfo, stmt_info, call,
gsi);
 8019                   new_stmt = call;
 8020                   break;
 8021                 }
 8022
 8023               if (i > 0)
 8024                 /* Bump the vector pointer.  */
 8025                 dataref_ptr = bump_vector_ptr (vinfo, dataref_ptr,
ptr_incr,
 8026                                                gsi, stmt_info, bump);
 8027
 8028               if (slp)
 8029                 vec_oprnd = vec_oprnds[i];

Reply via email to