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

--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed btw. have yet to reduce to sth meaningful (read: hopefully w/o LTO).

#0  internal_error (gmsgid=gmsgid@entry=0x183b3b7 "in %s, at %s:%d")
    at /space/rguenther/src/svn/trunk/gcc/diagnostic.c:1256
#1  0x00000000011c07d4 in fancy_abort (
    file=file@entry=0x12deb38
"/space/rguenther/src/svn/trunk/gcc/tree-vect-stmts.c", line=line@entry=8610, 
    function=function@entry=0x12dfe30 <vect_is_simple_use(tree_node*,
vec_info*, gimple**, vect_def_type*, tree_node**)::__FUNCTION__>
"vect_is_simple_use")
    at /space/rguenther/src/svn/trunk/gcc/diagnostic.c:1332
#2  0x0000000000c43691 in vect_is_simple_use (operand=<optimized out>, 
    vinfo=<optimized out>, def_stmt=0x7fffffffd9a0, dt=0x7fffffffd9b0, 
    vectype=0x7fffffffd998)
    at /space/rguenther/src/svn/trunk/gcc/tree-vect-stmts.c:8610
#3  0x0000000000c4fec6 in vectorizable_operation (
    stmt=stmt@entry=0x7ffff68b5bb0, gsi=gsi@entry=0x0, 
    vec_stmt=vec_stmt@entry=0x0, slp_node=slp_node@entry=0x1fd8390)
    at /space/rguenther/src/svn/trunk/gcc/tree-vect-stmts.c:4788
#4  0x0000000000c58a03 in vect_analyze_stmt (stmt=0x7ffff68b5bb0, 
    need_to_vectorize=need_to_vectorize@entry=0x7fffffffda5f, 
    node=node@entry=0x1fd8390)
    at /space/rguenther/src/svn/trunk/gcc/tree-vect-stmts.c:7950
#5  0x0000000000c6fc03 in vect_slp_analyze_node_operations (node=0x1fd8390)
    at /space/rguenther/src/svn/trunk/gcc/tree-vect-slp.c:2215
#6  0x0000000000c6fb5f in vect_slp_analyze_node_operations (node=0x1d7ac60)
    at /space/rguenther/src/svn/trunk/gcc/tree-vect-slp.c:2206
#7  0x0000000000c744e2 in vect_slp_analyze_operations (slp_instances=..., 
    data=0x1e02ca0) at /space/rguenther/src/svn/trunk/gcc/tree-vect-slp.c:2238
#8  0x0000000000c78c95 in vect_slp_analyze_bb_1 (fatal=<synthetic pointer>, 
    n_stmts=<optimized out>, datarefs=..., region_end=..., region_begin=...)
    at /space/rguenther/src/svn/trunk/gcc/tree-vect-slp.c:2522
#9  vect_slp_bb (bb=bb@entry=0x7ffff65dd5b0)
    at /space/rguenther/src/svn/trunk/gcc/tree-vect-slp.c:2608

(gdb) p expand_location (vect_location)
$2 = {file = 0x1d7e750 "mol.fppized.f90", line = 8342, column = 0, 
  data = 0x7ffff62e8d20, sysp = false}

The BB part in question is

_1280 = REALPART_EXPR <_380>;
_254 = IMAGPART_EXPR <_380>;
ft_ab2$real_1281 = _1280 * prephitmp_2576;
ft_ab2$imag_258 = _254 * prephitmp_2576;
parm.3489 ={v} {CLOBBER};
_383 = _191 * k_375;
_384 = _383 - _191;
x_385 = MEM[(double[0:D.9712] *)k_pts.0_181][_384];
_388 = _383 + _2591;
y_389 = MEM[(double[0:D.9712] *)k_pts.0_181][_388];
...
REALPART_EXPR <MEM[(complex double[0:D.9703] *)res.0_195][_465]> = _834;
IMAGPART_EXPR <MEM[(complex double[0:D.9703] *)res.0_195][_465]> = _1273;
k_468 = k_375 + 1;
if (_366 == k_375)
  goto <bb 59>;
else
  goto <bb 66>;

thus corresponding roughly to

           x = k_pts(k,1)            ! SBh_x
           y = k_pts(k,2)            ! SBh_y
           z = k_pts(k,3)            ! SBh_z
           tmp1 = ft_ab2 * x
           tmp2 = ft_ab2 * y
           res(basea+1,k) = res(basea+1,k) + tmp1 * x
           res(basea+2,k) = res(basea+2,k) + tmp1 * y
           res(basea+3,k) = res(basea+3,k) + tmp1 * z
           res(basea+4,k) = res(basea+4,k) + tmp2 * y
           res(basea+5,k) = res(basea+5,k) + tmp2 * z
           res(basea+6,k) = res(basea+6,k) + ft_ab2 * z * z
           res(baseb+1,k) = res(baseb+1,k) + tmp1 * x
           res(baseb+2,k) = res(baseb+2,k) + tmp1 * y
           res(baseb+3,k) = res(baseb+3,k) + tmp1 * z
           res(baseb+4,k) = res(baseb+4,k) + tmp2 * y
           res(baseb+5,k) = res(baseb+5,k) + tmp2 * z
           res(baseb+6,k) = res(baseb+6,k) + ft_ab2 * z * z

and the SLP instance that fails analyzing has the root

REALPART_EXPR <MEM[(complex double[0:D.9703] *)res.0_195][_433]> = _962;
IMAGPART_EXPR <MEM[(complex double[0:D.9703] *)res.0_195][_433]> = _852;

and thus corresponds to

_1280 = REALPART_EXPR <_380>;
_254 = IMAGPART_EXPR <_380>;
ft_ab2$real_1281 = _1280 * prephitmp_2576;
ft_ab2$imag_258 = _254 * prephitmp_2576;
...
z_393 = MEM[(double[0:D.9712] *)k_pts.0_181 clique 12 base 2][_392];
...
_1637 = REALPART_EXPR <MEM[(complex double[0:D.9703] *)res.0_195][_433]>;
_1645 = IMAGPART_EXPR <MEM[(complex double[0:D.9703] *)res.0_195][_433]>;
_1205 = z_393 * ft_ab2$real_1281;
_1188 = z_393 * ft_ab2$imag_258;
_1171 = z_393 * _1205;              <--- this is the def missing a vector type
_1057 = z_393 * _1188;
_962 = _1171 + _1637;
_852 = _1057 + _1645;
REALPART_EXPR <MEM[(complex double[0:D.9703] *)res.0_195][_433]> = _962;
IMAGPART_EXPR <MEM[(complex double[0:D.9703] *)res.0_195][_433]> = _852;

the stmt misses a vector type because it is supposed to be built up from
scalars.

And this likely fails to be detected in vect_is_simple_use because of some
issue I waited to have a testcase for ... a case where we have two
SLP instances with conflicting ideas of whether a DEF is to be built from
scalars or not (and thus the "trick" of using STMT_VINFO_VECTORIZABLE
to mark vect_external_defs falls apart).

So maybe I should just try harder to create an artificial testcase for this.

Here some aliasing probably forces both ops to be built from scalar which
then makes us instead build the def from scalars.

The other SLP instance is likely

_1225 = REALPART_EXPR <MEM[(complex double[0:D.9703] *)res.0_195][_465]>;
_151 = IMAGPART_EXPR <MEM[(complex double[0:D.9703] *)res.0_195][_465]>;
_834 = _1171 + _1225;
_1273 = _1057 + _151;
REALPART_EXPR <MEM[(complex double[0:D.9703] *)res.0_195][_465]> = _834;
IMAGPART_EXPR <MEM[(complex double[0:D.9703] *)res.0_195][_465]> = _1273;

Reply via email to