--- /dev/null
+/* { dg-do compile } */
+/* { dg-options "-O3 -fdump-tree-forwprop1-details -Wno-psabi" } */
+/* { dg-additional-options "-msse2" { target i?86-*-* x86_64-*-* } } */
+
+typedef int vec __attribute__((vector_size(16)));
+vec f1_p_v_in, f1_sel00, f1_sel11, f1_sel, f1_v_out_2;
+void f1() {
+ vec v_1, v_2, v_x, v_y;
+ v_1 = __builtin_shuffle(f1_p_v_in, f1_sel00);
+ v_2 = __builtin_shuffle(f1_p_v_in, f1_sel11);
+ v_x = v_2 - v_1;
+ v_y = v_1 + v_2;
+ f1_v_out_2 = __builtin_shuffle(v_y, v_x, f1_sel);
+}
+
+/* Won't blend because masks (e.g. f1_sel00) are not VECTOR_CSTs. */
+
+/* { dg-final { scan-tree-dump-not "Vec perm simplify sequences have been merged" "forwprop1" } } */
tree v_y = gimple_assign_rhs2 (stmt);
tree sel = gimple_assign_rhs3 (stmt);
- if (!VECTOR_CST_NELTS (sel).is_constant (&nelts)
+ if (TREE_CODE (sel) != VECTOR_CST
+ || !VECTOR_CST_NELTS (sel).is_constant (&nelts)
|| TREE_CODE (v_x) != SSA_NAME
|| TREE_CODE (v_y) != SSA_NAME
|| !has_single_use (v_x)
return false;
unsigned HOST_WIDE_INT v_1_nelts, v_2_nelts;
- if (!VECTOR_CST_NELTS (v_1_sel).is_constant (&v_1_nelts)
+ if (TREE_CODE (v_1_sel) != VECTOR_CST
+ || !VECTOR_CST_NELTS (v_1_sel).is_constant (&v_1_nelts)
+ || TREE_CODE (v_2_sel) != VECTOR_CST
|| !VECTOR_CST_NELTS (v_2_sel).is_constant (&v_2_nelts))
return false;