diff --git a/gcc/c-family/c-attribs.cc b/gcc/c-family/c-attribs.cc
index 4fb5dbd14091bdf550921bd2b090784d665dd129..3849dba90b2fd7e86fb960bf092c085f36822b45 100644
--- a/gcc/c-family/c-attribs.cc
+++ b/gcc/c-family/c-attribs.cc
@@ -129,6 +129,8 @@ static tree handle_unavailable_attribute (tree *, tree, tree, int,
 					  bool *);
 static tree handle_vector_size_attribute (tree *, tree, tree, int,
 					  bool *) ATTRIBUTE_NONNULL(3);
+static tree handle_vector_mask_attribute (tree *, tree, tree, int,
+					  bool *) ATTRIBUTE_NONNULL(3);
 static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *);
 static tree handle_nonstring_attribute (tree *, tree, tree, int, bool *);
 static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *);
@@ -417,6 +419,8 @@ const struct attribute_spec c_common_attribute_table[] =
 			      handle_unavailable_attribute, NULL },
   { "vector_size",	      1, 1, false, true, false, true,
 			      handle_vector_size_attribute, NULL },
+  { "vector_mask",	      0, 0, false, true, false, true,
+			      handle_vector_mask_attribute, NULL },
   { "visibility",	      1, 1, false, false, false, false,
 			      handle_visibility_attribute, NULL },
   { "tls_model",	      1, 1, true,  false, false, false,
@@ -4419,6 +4423,38 @@ handle_vector_size_attribute (tree *node, tree name, tree args,
   return NULL_TREE;
 }
 
+/* Handle a "vector_mask" attribute; arguments as in
+   struct attribute_spec.handler.  */
+
+static tree
+handle_vector_mask_attribute (tree *node, tree name, tree,
+			      int ARG_UNUSED (flags),
+			      bool *no_add_attrs)
+{
+  *no_add_attrs = true;
+  if (!flag_gimple)
+    {
+      warning (OPT_Wattributes, "%qE attribute ignored", name);
+      return NULL_TREE;
+    }
+
+  /* Determine the "base" type to apply the attribute to.  */
+  tree type = type_for_vector_size (*node);
+  if (!VECTOR_TYPE_P (type) || VECTOR_BOOLEAN_TYPE_P (type))
+    {
+      warning (OPT_Wattributes, "%qE attribute only supported on "
+	       "non-mask vector types", name);
+      return NULL_TREE;
+    }
+
+  tree new_type = truth_type_for (type);
+
+  /* Build back pointers if needed.  */
+  *node = lang_hooks.types.reconstruct_complex_type (*node, new_type);
+
+  return NULL_TREE;
+}
+
 /* Handle the "nonnull" attribute.  */
 
 static tree
diff --git a/gcc/c/gimple-parser.cc b/gcc/c/gimple-parser.cc
index 51ddd86f23af942594ec9b4ced6ca10213f071c9..31075237c986b4ac77014f0a8a6fdb04602d8269 100644
--- a/gcc/c/gimple-parser.cc
+++ b/gcc/c/gimple-parser.cc
@@ -860,9 +860,10 @@ c_parser_gimple_statement (gimple_parser &parser, gimple_seq *seq)
   if (lhs.value != error_mark_node
       && rhs.value != error_mark_node)
     {
-      /* If we parsed a comparison and the next token is a '?' then
-         parse a conditional expression.  */
-      if (COMPARISON_CLASS_P (rhs.value)
+      /* If we parsed a comparison or an identifier and the next token
+	 is a '?' then parse a conditional expression.  */
+      if ((COMPARISON_CLASS_P (rhs.value)
+	   || SSA_VAR_P (rhs.value))
 	  && c_parser_next_token_is (parser, CPP_QUERY))
 	{
 	  struct c_expr trueval, falseval;
@@ -874,7 +875,10 @@ c_parser_gimple_statement (gimple_parser &parser, gimple_seq *seq)
 	  if (trueval.value == error_mark_node
 	      || falseval.value == error_mark_node)
 	    return;
-	  rhs.value = build3_loc (loc, COND_EXPR, TREE_TYPE (trueval.value),
+	  rhs.value = build3_loc (loc,
+				  VECTOR_TYPE_P (TREE_TYPE (rhs.value))
+				  ? VEC_COND_EXPR : COND_EXPR,
+				  TREE_TYPE (trueval.value),
 				  rhs.value, trueval.value, falseval.value);
 	}
       if (get_gimple_rhs_class (TREE_CODE (rhs.value)) == GIMPLE_INVALID_RHS)
diff --git a/gcc/testsuite/gcc.dg/gimplefe-48.c b/gcc/testsuite/gcc.dg/gimplefe-48.c
new file mode 100644
index 0000000000000000000000000000000000000000..1399cc9d79a627dbe3725013c9b0d64c564a9672
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gimplefe-48.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O -fgimple -Wno-psabi -w" } */
+/* { dg-additional-options "-mavx2" { target x86_64-*-* i?86-*-* } } */
+
+typedef int v8si __attribute__((vector_size(8*sizeof(int))));
+typedef v8si v8sib __attribute__((vector_mask));
+
+v8si res;
+
+void __GIMPLE (ssa) foo (v8si v1, v8si v2, v8si v3, v8si v4)
+{
+  v8sib tem;
+  v8si resr;
+
+__BB(2):
+  tem_3 = v1_1(D) <= v2_2(D);
+  resr_4 = tem_3 ? v3_5(D) : v4_6(D);
+  res = resr_4;
+  return;
+}