re PR ipa/78515 (ICE: in fold_binary_loc, at fold-const.c:8999 with -Os -mavx512bw)
authorRichard Biener <rguenther@suse.de>
Fri, 25 Nov 2016 14:05:04 +0000 (14:05 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 25 Nov 2016 14:05:04 +0000 (14:05 +0000)
2016-11-25  Richard Biener  <rguenther@suse.de>

PR ipa/78515
* ipa-prop.c (compute_complex_assign_jump_func): Properly identify
unary, binary and single RHSs.
* tree.def (BIT_INSERT_EXPR): Adjust tree code name.

* gcc.dg/torture/pr78515.c: New testcase.

From-SVN: r242876

gcc/ChangeLog
gcc/ipa-prop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr78515.c [new file with mode: 0644]
gcc/tree.def

index 18d3b3fa8c159a72601cf35ebf13a4b7c37cccc1..f87b9c5d68b9f2d1755c7814cd09ff9d9f76d35d 100644 (file)
@@ -1,3 +1,10 @@
+2016-11-25  Richard Biener  <rguenther@suse.de>
+
+       PR ipa/78515
+       * ipa-prop.c (compute_complex_assign_jump_func): Properly identify
+       unary, binary and single RHSs.
+       * tree.def (BIT_INSERT_EXPR): Adjust tree code name.
+
 2016-11-25  Bin Cheng  <bin.cheng@arm.com>
 
        PR middle-end/78507
index 90c19fc06c514b5d0d67eb83397944a9be93f9a8..642111def51e4e4098fed77a79c17116b105319b 100644 (file)
@@ -1177,29 +1177,37 @@ compute_complex_assign_jump_func (struct ipa_func_body_info *fbi,
 
   if (index >= 0)
     {
-      tree op2 = gimple_assign_rhs2 (stmt);
-
-      if (op2)
+      switch (gimple_assign_rhs_class (stmt))
        {
-         if (!is_gimple_ip_invariant (op2)
-             || (TREE_CODE_CLASS (gimple_expr_code (stmt)) != tcc_comparison
-                 && !useless_type_conversion_p (TREE_TYPE (name),
-                                                TREE_TYPE (op1))))
-           return;
-
-         ipa_set_jf_arith_pass_through (jfunc, index, op2,
-                                        gimple_assign_rhs_code (stmt));
-       }
-      else if (gimple_assign_single_p (stmt))
-       {
-         bool agg_p = parm_ref_data_pass_through_p (fbi, index, call, tc_ssa);
-         ipa_set_jf_simple_pass_through (jfunc, index, agg_p);
+       case GIMPLE_BINARY_RHS:
+         {
+           tree op2 = gimple_assign_rhs2 (stmt);
+           if (!is_gimple_ip_invariant (op2)
+               || ((TREE_CODE_CLASS (gimple_assign_rhs_code (stmt))
+                    != tcc_comparison)
+                   && !useless_type_conversion_p (TREE_TYPE (name),
+                                                  TREE_TYPE (op1))))
+             return;
+
+           ipa_set_jf_arith_pass_through (jfunc, index, op2,
+                                          gimple_assign_rhs_code (stmt));
+           break;
+         }
+       case GIMPLE_SINGLE_RHS:
+         {
+           bool agg_p = parm_ref_data_pass_through_p (fbi, index, call,
+                                                      tc_ssa);
+           ipa_set_jf_simple_pass_through (jfunc, index, agg_p);
+           break;
+         }
+       case GIMPLE_UNARY_RHS:
+         if (is_gimple_assign (stmt2)
+             && gimple_assign_rhs_class (stmt2) == GIMPLE_UNARY_RHS
+             && ! CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt2)))
+           ipa_set_jf_unary_pass_through (jfunc, index,
+                                          gimple_assign_rhs_code (stmt2));
+       default:;
        }
-      else if (is_gimple_assign (stmt2)
-              && (gimple_expr_code (stmt2) != NOP_EXPR)
-              && (TREE_CODE_CLASS (gimple_expr_code (stmt2)) == tcc_unary))
-       ipa_set_jf_unary_pass_through (jfunc, index,
-                                      gimple_assign_rhs_code (stmt2));
       return;
     }
 
index 87d6fca44dc5ab2d11bb5d368c7c1e6c8e9416cd..394655455014eda27cfe1c95818c08f28ba77161 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-25  Richard Biener  <rguenther@suse.de>
+
+       PR ipa/78515
+       * gcc.dg/torture/pr78515.c: New testcase.
+
 2016-11-25  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/78293
diff --git a/gcc/testsuite/gcc.dg/torture/pr78515.c b/gcc/testsuite/gcc.dg/torture/pr78515.c
new file mode 100644 (file)
index 0000000..d700db5
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-mavx512bw" { target x86_64-*-* i?86-*-* } } */
+
+typedef unsigned V __attribute__ ((vector_size (64)));
+
+V g;
+
+static V
+baz (V u, V v)
+{
+  g += u;
+  return v + g + 1;
+}
+
+static V
+bar (V u)
+{
+  u[0] = 0;
+  return baz(u, (V){});
+}
+
+V
+foo ()
+{
+  return (V){bar((V){})[0]};
+}
index 2c35540060954aafe68cc282d1b2c24a73f6351f..e093307afb5dfadf5956e8022658e9b0fbbf82cb 100644 (file)
@@ -865,7 +865,7 @@ DEFTREECODE (FDESC_EXPR, "fdesc_expr", tcc_expression, 2)
    introducing a quaternary operation.
    The replaced bits shall be fully inside the container.  If the container
    is of vector type, then these bits shall be aligned with its elements.  */
-DEFTREECODE (BIT_INSERT_EXPR, "bit_field_insert", tcc_expression, 3)
+DEFTREECODE (BIT_INSERT_EXPR, "bit_insert_expr", tcc_expression, 3)
 
 /* Given two real or integer operands of the same type,
    returns a complex value of the corresponding complex type.  */