Commit bda2bc48 by Martin Jambor Committed by Martin Jambor

Fix compute_complex_assign_jump_func

2017-01-23  Martin Jambor  <mjambor@suse.cz>

	* 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.

testsuite/
	* gcc.dg/ipa/vrp8.c: New test.

From-SVN: r244803
parent f65f1ae3
2017-01-23 Martin Jambor <mjambor@suse.cz> 2017-01-23 Martin Jambor <mjambor@suse.cz>
* 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 <mjambor@suse.cz>
PR ipa/79108 PR ipa/79108
* ipa-prop.h (ipa_param_descriptor): Anotate with with GTY(()). * ipa-prop.h (ipa_param_descriptor): Anotate with with GTY(()).
(ipa_node_params): Annotate with GTY((for_user)). Make descriptors (ipa_node_params): Annotate with GTY((for_user)). Make descriptors
......
...@@ -862,31 +862,6 @@ parm_preserved_before_stmt_p (struct ipa_func_body_info *fbi, int index, ...@@ -862,31 +862,6 @@ parm_preserved_before_stmt_p (struct ipa_func_body_info *fbi, int index,
return !modified; 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. */
static int
load_from_param_1 (struct ipa_func_body_info *fbi,
vec<ipa_param_descriptor, va_gc> *descriptors,
gimple *stmt)
{
int index;
tree op1;
gcc_checking_assert (is_gimple_assign (stmt));
op1 = gimple_assign_rhs1 (stmt);
if (TREE_CODE (op1) != PARM_DECL)
return -1;
index = ipa_get_param_decl_index_1 (descriptors, op1);
if (index < 0
|| !parm_preserved_before_stmt_p (fbi, index, stmt, op1))
return -1;
return index;
}
/* If STMT is an assignment that loads a value from an parameter declaration, /* 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 return the index of the parameter in ipa_node_params which has not been
modified. Otherwise return -1. */ modified. Otherwise return -1. */
...@@ -896,29 +871,22 @@ load_from_unmodified_param (struct ipa_func_body_info *fbi, ...@@ -896,29 +871,22 @@ load_from_unmodified_param (struct ipa_func_body_info *fbi,
vec<ipa_param_descriptor, va_gc> *descriptors, vec<ipa_param_descriptor, va_gc> *descriptors,
gimple *stmt) gimple *stmt)
{ {
int index;
tree op1;
if (!gimple_assign_single_p (stmt)) if (!gimple_assign_single_p (stmt))
return -1; return -1;
return load_from_param_1 (fbi, descriptors, stmt); op1 = gimple_assign_rhs1 (stmt);
} if (TREE_CODE (op1) != PARM_DECL)
/* 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<ipa_param_descriptor, va_gc> *descriptors,
gimple *stmt)
{
if (!is_gimple_assign (stmt))
return -1; return -1;
enum tree_code rhs_code = gimple_assign_rhs_code (stmt); index = ipa_get_param_decl_index_1 (descriptors, op1);
if ((get_gimple_rhs_class (rhs_code) != GIMPLE_SINGLE_RHS) if (index < 0
&& (get_gimple_rhs_class (rhs_code) != GIMPLE_UNARY_RHS)) || !parm_preserved_before_stmt_p (fbi, index, stmt, op1))
return -1; return -1;
return load_from_param_1 (fbi, descriptors, stmt); return index;
} }
/* Return true if memory reference REF (which must be a load through parameter /* Return true if memory reference REF (which must be a load through parameter
...@@ -1154,7 +1122,6 @@ compute_complex_assign_jump_func (struct ipa_func_body_info *fbi, ...@@ -1154,7 +1122,6 @@ compute_complex_assign_jump_func (struct ipa_func_body_info *fbi,
tree op1, tc_ssa, base, ssa; tree op1, tc_ssa, base, ssa;
bool reverse; bool reverse;
int index; int index;
gimple *stmt2 = stmt;
op1 = gimple_assign_rhs1 (stmt); op1 = gimple_assign_rhs1 (stmt);
...@@ -1163,16 +1130,13 @@ compute_complex_assign_jump_func (struct ipa_func_body_info *fbi, ...@@ -1163,16 +1130,13 @@ compute_complex_assign_jump_func (struct ipa_func_body_info *fbi,
if (SSA_NAME_IS_DEFAULT_DEF (op1)) if (SSA_NAME_IS_DEFAULT_DEF (op1))
index = ipa_get_param_decl_index (info, SSA_NAME_VAR (op1)); index = ipa_get_param_decl_index (info, SSA_NAME_VAR (op1));
else else
{ index = load_from_unmodified_param (fbi, info->descriptors,
index = load_from_param (fbi, info->descriptors, SSA_NAME_DEF_STMT (op1));
SSA_NAME_DEF_STMT (op1));
stmt2 = SSA_NAME_DEF_STMT (op1);
}
tc_ssa = op1; tc_ssa = op1;
} }
else else
{ {
index = load_from_param (fbi, info->descriptors, stmt); index = load_from_unmodified_param (fbi, info->descriptors, stmt);
tc_ssa = gimple_assign_lhs (stmt); tc_ssa = gimple_assign_lhs (stmt);
} }
...@@ -1202,11 +1166,11 @@ compute_complex_assign_jump_func (struct ipa_func_body_info *fbi, ...@@ -1202,11 +1166,11 @@ compute_complex_assign_jump_func (struct ipa_func_body_info *fbi,
break; break;
} }
case GIMPLE_UNARY_RHS: case GIMPLE_UNARY_RHS:
if (is_gimple_assign (stmt2) if (is_gimple_assign (stmt)
&& gimple_assign_rhs_class (stmt2) == GIMPLE_UNARY_RHS && gimple_assign_rhs_class (stmt) == GIMPLE_UNARY_RHS
&& ! CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt2))) && ! CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt)))
ipa_set_jf_unary_pass_through (jfunc, index, ipa_set_jf_unary_pass_through (jfunc, index,
gimple_assign_rhs_code (stmt2)); gimple_assign_rhs_code (stmt));
default:; default:;
} }
return; return;
......
2017-01-23 Martin Jambor <mjambor@suse.cz> 2017-01-23 Martin Jambor <mjambor@suse.cz>
* gcc.dg/ipa/vrp8.c: New test.
2017-01-23 Martin Jambor <mjambor@suse.cz>
PR ipa/79108 PR ipa/79108
* gfortran.dg/lto/pr79108_0.f90: New test. * gfortran.dg/lto/pr79108_0.f90: New test.
......
/* { 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" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment