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

            Bug ID: 96195
           Summary: aarch64: ICE during GIMPLE pass:vect
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: yangyang305 at huawei dot com
  Target Milestone: ---

Hi, gcc-trunk ICEs when compiling the following testcase with -ftree-vectorize
-march=armv8.2-a+sve -O1  -msve-vector-bits=128 -fopenmp-simd

testcase
---
int by;

#pragma omp declare simd
int
zp (int);

void
qh (int oh)
{
#pragma omp simd
  for (by = 0; by < oh; ++by)
    by = zp (by);
}
---
GCC version: 11.0.0 20200714 (experimental)

Result:
pr92347.c: In function ‘qh’:
pr92347.c:13:1: error: invalid conversion in gimple call
   13 | qh (int oh)
      | ^~
vector(4) int

vector(4) int

# .MEM_59 = VDEF <.MEM_13>
vect__21.16_58 = zp.simdclone.2 (vect_vec_iv_.15_56);
during GIMPLE pass: vect
pr92347.c:13:1: internal compiler error: verify_gimple failed
0xd1dcd7 verify_gimple_in_cfg(function*, bool)
        ../.././gcc/tree-cfg.c:5491
0xbe415b execute_function_todo
        ../.././gcc/passes.c:1992
0xbe505b do_per_function
        ../.././gcc/passes.c:1640
0xbe505b execute_todo
        ../.././gcc/passes.c:2046
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.

In the testcase, the following gimple call is generated:

  vect__21.16_58 = zp.simdclone.2 (vect_vec_iv_.15_56);

The TREE_TYPE of vect__21.16_58 has a different mode with the TREE_TYPE of
zp.simdclone.2 (vect_vec_iv_.15_56), leading to the crash.

It seems that a type conversion is needed when the return type of the simd
clone of the function has the same ABI identity but different TYPE_MODEs with
the vectype analyzed.

I have prepared the following patch to fix this problem, the type conversions
of
the arguments are added as well.

diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -4108,7 +4108,20 @@ vectorizable_simd_clone_call (vec_info *vinfo,
stmt_vec_info stmt_info,
                                                  vec_oprnd0);
                        }
                      if (k == 1)
-                       vargs.safe_push (vec_oprnd0);
+                       if (!useless_type_conversion_p (TREE_TYPE (vec_oprnd0),
+                                                      atype))
+                         {
+                           vec_oprnd0
+                             = build1 (VIEW_CONVERT_EXPR, atype, vec_oprnd0);
+                           gassign *new_stmt
+                             = gimple_build_assign (make_ssa_name (atype),
+                                                      vec_oprnd0);
+                           vect_finish_stmt_generation (vinfo, stmt_info,
+                                                        new_stmt, gsi);
+                           vargs.safe_push (gimple_assign_lhs (new_stmt));
+                         }
+                       else
+                         vargs.safe_push (vec_oprnd0);
                      else
                        {
                          vec_oprnd0 = build_constructor (atype, ctor_elts);
@@ -4204,8 +4217,7 @@ vectorizable_simd_clone_call (vec_info *vinfo,
stmt_vec_info stmt_info,
          gcc_assert (ratype || simd_clone_subparts (rtype) == nunits);
          if (ratype)
            new_temp = create_tmp_var (ratype);
-         else if (simd_clone_subparts (vectype)
-                  == simd_clone_subparts (rtype))
+         else if (useless_type_conversion_p (vectype, rtype))
            new_temp = make_ssa_name (vec_dest, new_call);
          else
            new_temp = make_ssa_name (rtype, new_call);
@@ -4293,6 +4305,12 @@ vectorizable_simd_clone_call (vec_info *vinfo,
stmt_vec_info stmt_info,
              vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
              vect_clobber_variable (vinfo, stmt_info, gsi, new_temp);
            }
+         else if (!useless_type_conversion_p (vectype, rtype))
+           {
+             vec_oprnd0 = build1 (VIEW_CONVERT_EXPR, vectype, new_temp);
+             new_stmt = gimple_build_assign (make_ssa_name (vec_dest),
vec_oprnd0);
+             vect_finish_stmt_generation (vinfo, stmt_info, new_stmt, gsi);
+           }
        }

       if (j == 0)

With this patch, gcc generates:

  _58 = VIEW_CONVERT_EXPR<vector(4) int>(vect_vec_iv_.15_56);
  _59 = zp.simdclone.2 (_58);
  vect__21.16_61 = VIEW_CONVERT_EXPR<vector(4) int>(_59);

Reply via email to