I noticed when trying to fix PR52584 that vector lowering always creates unsigned vector types. The following fixes that, also getting rid of the weird use of a langhook.
Bootstrapped and tested on x86_64-unknown-linux-gnu. Richard. 2012-03-14 Richard Guenther <rguent...@suse.de> PR middle-end/52584 * tree-vect-generic.c (type_for_widest_vector_mode): Take element type instead of mode, use build_vector_type_for_mode instead of the langhook, build a vector of proper signedness. (expand_vector_operations_1): Adjust. Index: gcc/tree-vect-generic.c =================================================================== *** gcc/tree-vect-generic.c (revision 185379) --- gcc/tree-vect-generic.c (working copy) *************** expand_vector_operation (gimple_stmt_ite *** 471,483 **** gimple_assign_rhs2 (assign), code); } ! /* Return a type for the widest vector mode whose components are of mode ! INNER_MODE, or NULL_TREE if none is found. ! SATP is true for saturating fixed-point types. */ static tree ! type_for_widest_vector_mode (enum machine_mode inner_mode, optab op, int satp) { enum machine_mode best_mode = VOIDmode, mode; int best_nunits = 0; --- 471,483 ---- gimple_assign_rhs2 (assign), code); } ! /* Return a type for the widest vector mode whose components are of type ! TYPE, or NULL_TREE if none is found. */ static tree ! type_for_widest_vector_mode (tree type, optab op) { + enum machine_mode inner_mode = TYPE_MODE (type); enum machine_mode best_mode = VOIDmode, mode; int best_nunits = 0; *************** type_for_widest_vector_mode (enum machin *** 503,515 **** if (best_mode == VOIDmode) return NULL_TREE; else ! { ! /* For fixed-point modes, we need to pass satp as the 2nd parameter. */ ! 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); ! } } --- 503,509 ---- if (best_mode == VOIDmode) return NULL_TREE; else ! return build_vector_type_for_mode (type, best_mode); } *************** expand_vector_operations_1 (gimple_stmt_ *** 856,863 **** if (!VECTOR_MODE_P (TYPE_MODE (type)) && op) { tree vector_compute_type ! = type_for_widest_vector_mode (TYPE_MODE (TREE_TYPE (type)), op, ! TYPE_SATURATING (TREE_TYPE (type))); if (vector_compute_type != NULL_TREE && (TYPE_VECTOR_SUBPARTS (vector_compute_type) < TYPE_VECTOR_SUBPARTS (compute_type)) --- 850,856 ---- if (!VECTOR_MODE_P (TYPE_MODE (type)) && op) { tree vector_compute_type ! = type_for_widest_vector_mode (TREE_TYPE (type), op); if (vector_compute_type != NULL_TREE && (TYPE_VECTOR_SUBPARTS (vector_compute_type) < TYPE_VECTOR_SUBPARTS (compute_type))