http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46805

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2010.12.05 11:07:21
     Ever Confirmed|0                           |1

--- Comment #1 from Richard Guenther <rguenth at gcc dot gnu.org> 2010-12-05 
11:07:21 UTC ---
A non-Go testcase would be nice ...

#1  0x0000000100b3ce41 in supportable_widening_operation (code=NOP_EXPR, 
    stmt=0x141d3d0a0, vectype_out=0x141d3cdc8, vectype_in=0x141d3cf18, 
    decl1=0x7fff5fbff1d0, decl2=0x7fff5fbff1c8, code1=0x7fff5fbff238, 
    code2=0x7fff5fbff234, multi_step_cvt=0x7fff5fbff218, 
    interm_types=0x7fff5fbff170) at ../../src/trunk/gcc/tree-vect-stmts.c:5521
5521              optab3 = optab_for_tree_code (c1, intermediate_type,
optab_default);
(gdb) p intermediate_type
$1 = (tree) 0x0


      for (i = 0; i < 3; i++)
        {
          intermediate_mode = insn_data[icode1].operand[0].mode;
          intermediate_type = lang_hooks.types.type_for_mode
(intermediate_mode,
                                                     TYPE_UNSIGNED
(prev_type));
          optab3 = optab_for_tree_code (c1, intermediate_type, optab_default);

lang_hooks.types.type_for_mode can return NULL, there is no suitable hook
that will a) return non-NULL always, b) always returns a type for the requested
mode(!)

I doubt a non-Go testcase exists.

Ideally we'd never use lang_hooks.types.type_for_mode (or _for_size) in the
middle-end but had a pure middle-end based implementation.  A manual
middle-end substitute would be

  build_nonstandard_integer_type (GET_MODE_PRECISION (intermediate_mode),
                                  TYPE_UNSIGNED (prev_type));

More uses of type_for_mode exist.

With the vectorizer bits fixed we fall into tree-vect-generic.c which does

577       else
578         /* There is no operation in hardware, so fall back to scalars.  */
579         compute_type = TREE_TYPE (type);

where type is already a TImode integer (and TREE_TYPE of it is NULL).

This is because appearantly Go has a DImode integer type but not a SImode
one.  Huh.  So we have

V2DI = VEC_UNPACK_LO_EXPR <TI>

where the TImode rhs is really V4SI.

The generic vector lowering code is confused by this.

Go -> low priority.

The following vectorizer patch leads to the above failure:

Index: tree-vect-stmts.c
===================================================================
--- tree-vect-stmts.c    (revision 167471)
+++ tree-vect-stmts.c    (working copy)
@@ -5516,7 +5516,7 @@
       for (i = 0; i < 3; i++)
         {
           intermediate_mode = insn_data[icode1].operand[0].mode;
-          intermediate_type = lang_hooks.types.type_for_mode
(intermediate_mode,
+          intermediate_type = build_nonstandard_integer_type
(GET_MODE_PRECISION (intermediate_mode),
                                                      TYPE_UNSIGNED
(prev_type));
           optab3 = optab_for_tree_code (c1, intermediate_type, optab_default);
           optab4 = optab_for_tree_code (c2, intermediate_type, optab_default);
@@ -5637,7 +5637,7 @@
       for (i = 0; i < 3; i++)
         {
           intermediate_mode = insn_data[icode1].operand[0].mode;
-          intermediate_type = lang_hooks.types.type_for_mode
(intermediate_mode,
+          intermediate_type = build_nonstandard_integer_type
(GET_MODE_PRECISION (intermediate_mode),
                                                      TYPE_UNSIGNED
(prev_type));
           interm_optab = optab_for_tree_code (c1, intermediate_type,
                                               optab_default);


another fix would be to catch intermediate_type == NULL here and fail
vectorization (but using the langhook is wrong here anyways).

Confirmed at least.

Reply via email to