From: Richard Biener Date: Fri, 25 Nov 2016 14:05:04 +0000 (+0000) Subject: re PR ipa/78515 (ICE: in fold_binary_loc, at fold-const.c:8999 with -Os -mavx512bw) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a77af1829fd2dc976599383d01ab4467c05eba5b;p=gcc.git re PR ipa/78515 (ICE: in fold_binary_loc, at fold-const.c:8999 with -Os -mavx512bw) 2016-11-25 Richard Biener 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 18d3b3fa8c1..f87b9c5d68b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-11-25 Richard Biener + + 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 PR middle-end/78507 diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 90c19fc06c5..642111def51 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 87d6fca44dc..39465545501 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-11-25 Richard Biener + + PR ipa/78515 + * gcc.dg/torture/pr78515.c: New testcase. + 2016-11-25 Paul Thomas 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 00000000000..d700db55842 --- /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 2c355400609..e093307afb5 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. */