Index: gcc/tree-vect-loop.c
===================================================================
--- gcc/tree-vect-loop.c
+++ gcc/tree-vect-loop.c
@@ -232,7 +232,7 @@
                   dump_printf (MSG_NOTE, "\n");
 		}
 
-	      vectype = get_vectype_for_scalar_type (scalar_type);
+	      vectype = get_vectype_for_scalar_type (scalar_type, true);
 	      if (!vectype)
 		{
 		  if (dump_enabled_p ())
@@ -465,7 +465,7 @@
 		  dump_generic_expr (MSG_NOTE, TDF_SLIM, scalar_type);
                   dump_printf (MSG_NOTE, "\n");
 		}
-	      vectype = get_vectype_for_scalar_type (scalar_type);
+	      vectype = get_vectype_for_scalar_type (scalar_type, true);
 	      if (!vectype)
 		{
 		  if (dump_enabled_p ())
@@ -510,7 +510,7 @@
 		  dump_generic_expr (MSG_NOTE, TDF_SLIM, scalar_type);
 		  dump_printf (MSG_NOTE, "\n");
 		}
-	      vf_vectype = get_vectype_for_scalar_type (scalar_type);
+	      vf_vectype = get_vectype_for_scalar_type (scalar_type, true);
 	    }
 	  if (!vf_vectype)
 	    {
@@ -3673,7 +3673,7 @@
 
   reduction_op = get_reduction_op (stmt, reduc_index);
 
-  vectype = get_vectype_for_scalar_type (TREE_TYPE (reduction_op));
+  vectype = get_vectype_for_scalar_type (TREE_TYPE (reduction_op), true);
   if (!vectype)
     {
       if (dump_enabled_p ())
@@ -4202,7 +4202,7 @@
   loop_vec_info loop_vinfo = STMT_VINFO_LOOP_VINFO (stmt_vinfo);
   struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
   tree scalar_type = TREE_TYPE (init_val);
-  tree vectype = get_vectype_for_scalar_type (scalar_type);
+  tree vectype = get_vectype_for_scalar_type (scalar_type, true);
   int nunits;
   enum tree_code code = gimple_assign_rhs_code (stmt);
   tree def_for_init;
@@ -4455,7 +4455,7 @@
 
   reduction_op = get_reduction_op (stmt, reduc_index);
 
-  vectype = get_vectype_for_scalar_type (TREE_TYPE (reduction_op));
+  vectype = get_vectype_for_scalar_type (TREE_TYPE (reduction_op), true);
   gcc_assert (vectype);
   mode = TYPE_MODE (vectype);
 
Index: gcc/tree-vect-patterns.c
===================================================================
--- gcc/tree-vect-patterns.c
+++ gcc/tree-vect-patterns.c
@@ -4176,12 +4176,22 @@
       type_in = get_vectype_for_scalar_type (type_in);
       if (!type_in)
 	return false;
+
+      tree type_out_backup = type_out;
       if (type_out)
 	type_out = get_vectype_for_scalar_type (type_out);
       else
 	type_out = type_in;
       if (!type_out)
-	return false;
+	{
+	  /* dot_prod is vector reduction operation that we want allow
+	     single element vector types.  */
+	  if (!strcmp (recog_func->name, "dot_prod"))
+	    type_out = get_vectype_for_scalar_type (type_out_backup, true);
+
+	  if (!type_out)
+	    return false;
+	}
       pattern_vectype = type_out;
 
       if (is_gimple_assign (pattern_stmt))
Index: gcc/tree-vect-stmts.c
===================================================================
--- gcc/tree-vect-stmts.c
+++ gcc/tree-vect-stmts.c
@@ -8985,7 +8985,8 @@
    by the target.  */
 
 static tree
-get_vectype_for_scalar_type_and_size (tree scalar_type, unsigned size)
+get_vectype_for_scalar_type_and_size (tree scalar_type, unsigned size,
+				      bool reduct_p = false)
 {
   tree orig_scalar_type = scalar_type;
   machine_mode inner_mode = TYPE_MODE (scalar_type);
@@ -9039,7 +9040,7 @@
   else
     simd_mode = mode_for_vector (inner_mode, size / nbytes);
   nunits = GET_MODE_SIZE (simd_mode) / nbytes;
-  if (nunits < 1) /* Support V1SI.  */
+  if (nunits < 1 || (nunits == 1 && !reduct_p))
     return NULL_TREE;
 
   vectype = build_vector_type (scalar_type, nunits);
@@ -9065,11 +9066,12 @@
    by the target.  */
 
 tree
-get_vectype_for_scalar_type (tree scalar_type)
+get_vectype_for_scalar_type (tree scalar_type, bool reduct_p)
 {
   tree vectype;
   vectype = get_vectype_for_scalar_type_and_size (scalar_type,
-						  current_vector_size);
+						  current_vector_size,
+						  reduct_p);
   if (vectype
       && current_vector_size == 0)
     current_vector_size = GET_MODE_SIZE (TYPE_MODE (vectype));
Index: gcc/tree-vectorizer.h
===================================================================
--- gcc/tree-vectorizer.h
+++ gcc/tree-vectorizer.h
@@ -1062,7 +1062,7 @@
 
 /* In tree-vect-stmts.c.  */
 extern unsigned int current_vector_size;
-extern tree get_vectype_for_scalar_type (tree);
+extern tree get_vectype_for_scalar_type (tree, bool = false);
 extern tree get_mask_type_for_scalar_type (tree);
 extern tree get_same_sized_vectype (tree, tree);
 extern bool vect_is_simple_use (tree, vec_info *, gimple **,
