aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-11-25 14:05:04 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-11-25 14:05:04 +0000
commita77af1829fd2dc976599383d01ab4467c05eba5b (patch)
treef944144904fa846617008bdac25466aa470f5806
parent3cae214f76deaf8271e26b094d6d14a31e537e00 (diff)
downloadgcc-a77af1829fd2dc976599383d01ab4467c05eba5b.zip
gcc-a77af1829fd2dc976599383d01ab4467c05eba5b.tar.gz
gcc-a77af1829fd2dc976599383d01ab4467c05eba5b.tar.bz2
re PR ipa/78515 (ICE: in fold_binary_loc, at fold-const.c:8999 with -Os -mavx512bw)
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/ipa-prop.c50
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr78515.c26
-rw-r--r--gcc/tree.def2
5 files changed, 68 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 18d3b3f..f87b9c5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 90c19fc..642111d 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -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;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 87d6fca..3946554 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..d700db5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr78515.c
@@ -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]};
+}
diff --git a/gcc/tree.def b/gcc/tree.def
index 2c35540..e093307 100644
--- a/gcc/tree.def
+++ b/gcc/tree.def
@@ -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. */