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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |matz at gcc dot gnu.org

--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
I have a fix for the ICE:

Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c       (revision 223529)
+++ gcc/tree-vect-stmts.c       (working copy)
@@ -3964,14 +3964,12 @@ vectorizable_conversion (gimple stmt, gi

              if (slp_node)
                SLP_TREE_VEC_STMTS (slp_node).quick_push (new_stmt);
+
+             if (!prev_stmt_info)
+               STMT_VINFO_VEC_STMT (stmt_info) = new_stmt;
              else
-               {
-                 if (!prev_stmt_info)
-                   STMT_VINFO_VEC_STMT (stmt_info) = new_stmt;
-                 else
-                   STMT_VINFO_RELATED_STMT (prev_stmt_info) = new_stmt;
-                 prev_stmt_info = vinfo_for_stmt (new_stmt);
-               }
+               STMT_VINFO_RELATED_STMT (prev_stmt_info) = new_stmt;
+             prev_stmt_info = vinfo_for_stmt (new_stmt);
            }
        }

but I'm not sure we create correct code here.  The strided-store path
looks wrong to me.  Micha?

  vect__19.9_70 = [vec_unpack_lo_expr] vect_cst_.8_69;
  vect__19.9_71 = [vec_unpack_hi_expr] vect_cst_.8_69;
  _21 = (real(kind=8)) _20;
  _82 = BIT_FIELD_REF <vect__19.9_70, 64, 0>;
  MEM[(real(kind=8) *)ivtmp_72] = _82;
  ivtmp_84 = ivtmp_72 + _81;
  _85 = BIT_FIELD_REF <vect__19.9_70, 64, 64>;
  MEM[(real(kind=8) *)ivtmp_84] = _85;

we load a v4sf and unpack to two v2df vectors (unrolling factor of two
is applied).  But then the strided store code appears to just store
from the first vector, the realpart to the first unrolled iteration
destination realpart and the imagpart to the second unrolled interation
realpart!?

(gdb) p ncopies
$1 = 1
(gdb) p vec_num
$2 = 2

you somehow miss the loop over vec_num.  Or you miss to reject the
testcase for strided stores (possibly our patches just crossed here).
That is, SLP support seems to be absent here.

Joost - can you produce a runtime testcase that verifies correctness?

Meanwhile testing the ICE fixing patch.

Reply via email to