summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/ipa-prop.c68
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/ipa/vrp8.c42
4 files changed, 71 insertions, 52 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f370075e1fd..3ade7c76e27 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
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
* ipa-prop.h (ipa_param_descriptor): Anotate with with GTY(()).
(ipa_node_params): Annotate with GTY((for_user)). Make descriptors
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,31 +862,6 @@ 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. */
-
-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,
return the index of the parameter in ipa_node_params which has not been
modified. Otherwise return -1. */
@@ -896,29 +871,22 @@ load_from_unmodified_param (struct ipa_func_body_info *fbi,
vec<ipa_param_descriptor, va_gc> *descriptors,
gimple *stmt)
{
+ int index;
+ tree op1;
+
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<ipa_param_descriptor, va_gc> *descriptors,
- gimple *stmt)
-{
- if (!is_gimple_assign (stmt))
+ op1 = gimple_assign_rhs1 (stmt);
+ if (TREE_CODE (op1) != PARM_DECL)
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))
+ index = ipa_get_param_decl_index_1 (descriptors, op1);
+ if (index < 0
+ || !parm_preserved_before_stmt_p (fbi, index, stmt, op1))
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
@@ -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,5 +1,9 @@
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
* gfortran.dg/lto/pr79108_0.f90: New test.
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" } } */