diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f370075e1fd..3ade7c76e27 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2017-01-23 Martin Jambor + + * ipa-prop.c (load_from_param_1): Removed. + (load_from_unmodified_param): Bits from load_from_param_1 put back + here. + (load_from_param): Removed. + (compute_complex_assign_jump_func): Removed stmt2 and just replaced it + with stmt. Reverted back to use of load_from_unmodified_param. + 2017-01-23 Martin Jambor PR ipa/79108 diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c index 4d77c9b25ef..512bcbed0cb 100644 --- a/gcc/ipa-prop.c +++ b/gcc/ipa-prop.c @@ -862,19 +862,21 @@ parm_preserved_before_stmt_p (struct ipa_func_body_info *fbi, int index, return !modified; } -/* Main worker for load_from_unmodified_param and load_from_param. - If STMT is an assignment that loads a value from an parameter declaration, - return the index of the parameter in ipa_node_params. Otherwise return -1. */ +/* If STMT is an assignment that loads a value from an parameter declaration, + return the index of the parameter in ipa_node_params which has not been + modified. Otherwise return -1. */ static int -load_from_param_1 (struct ipa_func_body_info *fbi, - vec *descriptors, - gimple *stmt) +load_from_unmodified_param (struct ipa_func_body_info *fbi, + vec *descriptors, + gimple *stmt) { int index; tree op1; - gcc_checking_assert (is_gimple_assign (stmt)); + if (!gimple_assign_single_p (stmt)) + return -1; + op1 = gimple_assign_rhs1 (stmt); if (TREE_CODE (op1) != PARM_DECL) return -1; @@ -887,40 +889,6 @@ load_from_param_1 (struct ipa_func_body_info *fbi, return index; } -/* If STMT is an assignment that loads a value from an parameter declaration, - return the index of the parameter in ipa_node_params which has not been - modified. Otherwise return -1. */ - -static int -load_from_unmodified_param (struct ipa_func_body_info *fbi, - vec *descriptors, - gimple *stmt) -{ - if (!gimple_assign_single_p (stmt)) - return -1; - - return load_from_param_1 (fbi, descriptors, stmt); -} - -/* If STMT is an assignment that loads a value from an parameter declaration, - return the index of the parameter in ipa_node_params. Otherwise return -1. */ - -static int -load_from_param (struct ipa_func_body_info *fbi, - vec *descriptors, - gimple *stmt) -{ - if (!is_gimple_assign (stmt)) - return -1; - - enum tree_code rhs_code = gimple_assign_rhs_code (stmt); - if ((get_gimple_rhs_class (rhs_code) != GIMPLE_SINGLE_RHS) - && (get_gimple_rhs_class (rhs_code) != GIMPLE_UNARY_RHS)) - return -1; - - return load_from_param_1 (fbi, descriptors, stmt); -} - /* Return true if memory reference REF (which must be a load through parameter with INDEX) loads data that are known to be unmodified in this function before reaching statement STMT. */ @@ -1154,7 +1122,6 @@ compute_complex_assign_jump_func (struct ipa_func_body_info *fbi, tree op1, tc_ssa, base, ssa; bool reverse; int index; - gimple *stmt2 = stmt; op1 = gimple_assign_rhs1 (stmt); @@ -1163,16 +1130,13 @@ compute_complex_assign_jump_func (struct ipa_func_body_info *fbi, if (SSA_NAME_IS_DEFAULT_DEF (op1)) index = ipa_get_param_decl_index (info, SSA_NAME_VAR (op1)); else - { - index = load_from_param (fbi, info->descriptors, - SSA_NAME_DEF_STMT (op1)); - stmt2 = SSA_NAME_DEF_STMT (op1); - } + index = load_from_unmodified_param (fbi, info->descriptors, + SSA_NAME_DEF_STMT (op1)); tc_ssa = op1; } else { - index = load_from_param (fbi, info->descriptors, stmt); + index = load_from_unmodified_param (fbi, info->descriptors, stmt); tc_ssa = gimple_assign_lhs (stmt); } @@ -1202,11 +1166,11 @@ compute_complex_assign_jump_func (struct ipa_func_body_info *fbi, 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))) + if (is_gimple_assign (stmt) + && gimple_assign_rhs_class (stmt) == GIMPLE_UNARY_RHS + && ! CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt))) ipa_set_jf_unary_pass_through (jfunc, index, - gimple_assign_rhs_code (stmt2)); + gimple_assign_rhs_code (stmt)); default:; } return; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2ac5e2371fc..d53090552ac 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-01-23 Martin Jambor + + * gcc.dg/ipa/vrp8.c: New test. + 2017-01-23 Martin Jambor PR ipa/79108 diff --git a/gcc/testsuite/gcc.dg/ipa/vrp8.c b/gcc/testsuite/gcc.dg/ipa/vrp8.c new file mode 100644 index 00000000000..55832b0886e --- /dev/null +++ b/gcc/testsuite/gcc.dg/ipa/vrp8.c @@ -0,0 +1,42 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-ipa-cp-details" } */ + +volatile int cond; +int abs (int); + +volatile int g; + +int __attribute__((noinline, noclone)) +take_address (int *p) +{ + g = *p; +} + +static int __attribute__((noinline, noclone)) +foo (int i) +{ + if (i < 5) + __builtin_abort (); + return 0; +} + +static int __attribute__((noinline, noclone)) +bar (int j) +{ + foo (~j); + foo (abs (j)); + foo (j); + take_address (&j); + return 0; +} + +int +main () +{ + for (unsigned int i = 0; i < 10; ++i) + bar (i); + + return 0; +} + +/* { dg-final { scan-ipa-dump-times "Setting value range of param 0 \\\[-10, 9\\\]" 1 "cp" } } */