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

--- Comment #8 from JuzheZhong <juzhe.zhong at rivai dot ai> ---
(In reply to Tamar Christina from comment #7)
> You may be able to use the same approach as
> 
>   else if (LOOP_VINFO_FULLY_MASKED_P (loop_vinfo))
> 
> that is, reverse both the mask and the vector and using extract last.
> It's not going to be performance critical so it's more important to be
> correct rather than fast.

I just carefully read this code:

      /* For an inverted control flow with early breaks we want EXTRACT_FIRST
         instead of EXTRACT_LAST.  Emulate by reversing the vector and mask. */
      if (restart_loop && LOOP_VINFO_EARLY_BREAKS (loop_vinfo))
        {
          /* First create the permuted mask.  */
          tree perm_mask = perm_mask_for_reverse (TREE_TYPE (mask));
          tree perm_dest = copy_ssa_name (mask);
          gimple *perm_stmt
                = gimple_build_assign (perm_dest, VEC_PERM_EXPR, mask,
                                       mask, perm_mask);
          vect_finish_stmt_generation (loop_vinfo, stmt_info, perm_stmt,
                                       &gsi);
          mask = perm_dest;

          /* Then permute the vector contents.  */
          tree perm_elem = perm_mask_for_reverse (vectype);
          perm_dest = copy_ssa_name (vec_lhs_phi);
          perm_stmt
                = gimple_build_assign (perm_dest, VEC_PERM_EXPR, vec_lhs_phi,
                                       vec_lhs_phi, perm_elem);
          vect_finish_stmt_generation (loop_vinfo, stmt_info, perm_stmt,
                                       &gsi);
          vec_lhs_phi = perm_dest;
        }


Suppose the loop mask is generated by whilelo instruction of ARM SVE.

Suppose we have 8 elements in a single whole vector.

mask = whilo (0, res) if res = 6, then mask = 11111000.
data = 12345678

Then if it is early break. You are reversing both data and mask as follows:

new_mask = 00011111
new_data = 87654321

Then use the EXTRACT_LAST, we will get value = 1 for early break.

Am I right ?

Reply via email to