On Thu, 17 May 2012, David Miller wrote:

> 
> Richard, I was looking into a testsuite failure on the 4.7 branch
> on sparc and I think your fix for 52584 would fix it too.
> 
> The problem eminates in gcc.c-torture/execute/vector-shift2.c with -O0
> 
> The 4 integer vector shifts get lowered to 2 integer vector shifts,
> since that is what the VIS3 shifts are capable of.
> 
> However, type_for_widest_vector_mode does not take the signedness into
> consideration.  So:
> 
>       signed_vector >> unsigned_vector
> 
> gets lowered into:
> 
>       unsigned_vector >> unsigned_vector
> 
> since type_for_widest_vector_mode unconditionally always passes
> '1' for "unsignedp", and thus the testcase aborts since we use
> a logical shift instead of an arithmetic one.
> 
> I came up with the crude fix below, but then I noticed in mainline
> the change you made in order to resolve 52584.

Backporting that change is fine with me if you can take care to
do the bootstrap & testing on the 4.7 branch.

Thanks,
Richard.

> I'd like to see this fixed on the 4.7 branch since the problem
> generates incorrect code, rather than merely miss an optimization
> opportunity.
> 
> diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c
> index be54710..aa7b774 100644
> --- a/gcc/tree-vect-generic.c
> +++ b/gcc/tree-vect-generic.c
> @@ -476,7 +476,8 @@ expand_vector_operation (gimple_stmt_iterator *gsi, tree 
> type, tree compute_type
>     SATP is true for saturating fixed-point types.  */
>  
>  static tree
> -type_for_widest_vector_mode (enum machine_mode inner_mode, optab op, int 
> satp)
> +type_for_widest_vector_mode (enum machine_mode inner_mode, optab op, int 
> satp,
> +                          int unsignedp)
>  {
>    enum machine_mode best_mode = VOIDmode, mode;
>    int best_nunits = 0;
> @@ -508,7 +509,7 @@ type_for_widest_vector_mode (enum machine_mode 
> inner_mode, optab op, int satp)
>        if (ALL_FIXED_POINT_MODE_P (best_mode))
>       return lang_hooks.types.type_for_mode (best_mode, satp);
>  
> -      return lang_hooks.types.type_for_mode (best_mode, 1);
> +      return lang_hooks.types.type_for_mode (best_mode, unsignedp);
>      }
>  }
>  
> @@ -858,7 +859,8 @@ expand_vector_operations_1 (gimple_stmt_iterator *gsi)
>      {
>        tree vector_compute_type
>          = type_for_widest_vector_mode (TYPE_MODE (TREE_TYPE (type)), op,
> -                                    TYPE_SATURATING (TREE_TYPE (type)));
> +                                    TYPE_SATURATING (TREE_TYPE (type)),
> +                                    TYPE_UNSIGNED (TREE_TYPE (type)));
>        if (vector_compute_type != NULL_TREE
>         && (TYPE_VECTOR_SUBPARTS (vector_compute_type)
>             < TYPE_VECTOR_SUBPARTS (compute_type))
> 
> 

-- 
Richard Guenther <rguent...@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer

Reply via email to