diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 29ecf36f707..7932194836c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-06-29 Jakub Jelinek + + * tree-vect-stmts.c (vectorizable_operation): Check both + VEC_WIDEN_MULT_LO_EXPR and VEC_WIDEN_MULT_HI_EXPR optabs. + Verify that operand[0]'s mode is TYPE_MODE (wide_vectype). + 2012-06-28 Richard Henderson * doc/generic.texi (MULT_HIGHPART_EXPR): Document it. diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index b40e68c4060..a0a03c56d13 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -3504,14 +3504,19 @@ vectorizable_operation (gimple stmt, gimple_stmt_iterator *gsi, { decl1 = NULL_TREE; decl2 = NULL_TREE; - optab = optab_for_tree_code (VEC_WIDEN_MULT_HI_EXPR, + optab = optab_for_tree_code (VEC_WIDEN_MULT_LO_EXPR, vectype, optab_default); optab2 = optab_for_tree_code (VEC_WIDEN_MULT_HI_EXPR, vectype, optab_default); if (optab != NULL && optab2 != NULL && optab_handler (optab, vec_mode) != CODE_FOR_nothing - && optab_handler (optab2, vec_mode) != CODE_FOR_nothing) + && optab_handler (optab2, vec_mode) != CODE_FOR_nothing + && insn_data[optab_handler (optab, vec_mode)].operand[0].mode + == TYPE_MODE (wide_vectype) + && insn_data[optab_handler (optab2, + vec_mode)].operand[0].mode + == TYPE_MODE (wide_vectype)) { for (i = 0; i < nunits_in; i++) sel[i] = !BYTES_BIG_ENDIAN + 2 * i;