From 2b5bb7da8fbc4b028d7cf20f3fa3484c3d86f5e7 Mon Sep 17 00:00:00 2001
From: Jakub Jelinek <jakub@redhat.com>
Date: Fri, 29 Jun 2012 07:51:08 +0200
Subject: [PATCH] tree-vect-stmts.c (vectorizable_operation): Check both
 VEC_WIDEN_MULT_LO_EXPR and VEC_WIDEN_MULT_HI_EXPR optabs.

	* 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).

From-SVN: r189064
---
 gcc/ChangeLog         | 6 ++++++
 gcc/tree-vect-stmts.c | 9 +++++++--
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 29ecf36f7074..7932194836c0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-06-29  Jakub Jelinek  <jakub@redhat.com>
+
+	* 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  <rth@redhat.com>
 
 	* doc/generic.texi (MULT_HIGHPART_EXPR): Document it.
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index b40e68c4060f..a0a03c56d13a 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;
-- 
GitLab