diff options
author | Richard Biener <rguenther@suse.de> | 2016-11-25 14:05:04 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-11-25 14:05:04 +0000 |
commit | a77af1829fd2dc976599383d01ab4467c05eba5b (patch) | |
tree | f944144904fa846617008bdac25466aa470f5806 | |
parent | 3cae214f76deaf8271e26b094d6d14a31e537e00 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/ipa-prop.c | 50 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr78515.c | 26 | ||||
-rw-r--r-- | gcc/tree.def | 2 |
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. */ |