summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-loop-im.c
diff options
context:
space:
mode:
authorienkovich <ienkovich@138bc75d-0d04-0410-961f-82ee72b054a4>2016-07-28 14:19:18 +0000
committerienkovich <ienkovich@138bc75d-0d04-0410-961f-82ee72b054a4>2016-07-28 14:19:18 +0000
commitf339cf78c71449d27de48dc40e00f8902bc9f97d (patch)
tree8f89f1c18b45e9943665ed76b10cb460cd282ba9 /gcc/tree-ssa-loop-im.c
parent26693c28c1fd398ca025649ca169388bc802fa22 (diff)
gcc/
2016-07-28 Yuri Rumyantsev <ysrumyan@gmail.com> PR tree-optimization/71734 * tree-ssa-loop-im.c (ref_indep_loop_p_1): Pass value of safelen attribute instead of REF_LOOP and use it. (ref_indep_loop_p_2): Use SAFELEN argument instead of REF_LOOP and set it for Loops having non-zero safelen attribute. (ref_indep_loop_p): Pass zero as initial value for safelen. gcc/testsuite/ 2016-07-28 Yuri Rumyantsev <ysrumyan@gmail.com> PR tree-optimization/71734 * g++.dg/vect/pr70729-nest.cc: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@238817 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-loop-im.c')
-rw-r--r--gcc/tree-ssa-loop-im.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index c5aaef325052..947724bceff3 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -2113,7 +2113,7 @@ record_dep_loop (struct loop *loop, im_mem_ref *ref, bool stored_p)
references in LOOP. */
static bool
-ref_indep_loop_p_1 (struct loop *ref_loop, struct loop *loop,
+ref_indep_loop_p_1 (int safelen, struct loop *loop,
im_mem_ref *ref, bool stored_p)
{
bitmap refs_to_check;
@@ -2129,12 +2129,12 @@ ref_indep_loop_p_1 (struct loop *ref_loop, struct loop *loop,
if (bitmap_bit_p (refs_to_check, UNANALYZABLE_MEM_ID))
return false;
- if (ref_loop->safelen > 1)
+ if (safelen > 1)
{
if (dump_file && (dump_flags & TDF_DETAILS))
{
- fprintf (dump_file,"REF is independent in ref_loop#%d\n",
- ref_loop->num);
+ fprintf (dump_file,"REF is independent due to safelen %d\n",
+ safelen);
print_generic_expr (dump_file, ref->mem.ref, TDF_SLIM);
fprintf (dump_file, "\n");
}
@@ -2156,7 +2156,7 @@ ref_indep_loop_p_1 (struct loop *ref_loop, struct loop *loop,
results. */
static bool
-ref_indep_loop_p_2 (struct loop *ref_loop, struct loop *loop,
+ref_indep_loop_p_2 (int safelen, struct loop *loop,
im_mem_ref *ref, bool stored_p)
{
stored_p |= (ref->stored && bitmap_bit_p (ref->stored, loop->num));
@@ -2166,15 +2166,18 @@ ref_indep_loop_p_2 (struct loop *ref_loop, struct loop *loop,
if (bitmap_bit_p (&ref->dep_loop, LOOP_DEP_BIT (loop->num, stored_p)))
return false;
+ if (loop->safelen > safelen)
+ safelen = loop->safelen;
+
struct loop *inner = loop->inner;
while (inner)
{
- if (!ref_indep_loop_p_2 (ref_loop, inner, ref, stored_p))
+ if (!ref_indep_loop_p_2 (safelen, inner, ref, stored_p))
return false;
inner = inner->next;
}
- bool indep_p = ref_indep_loop_p_1 (ref_loop, loop, ref, stored_p);
+ bool indep_p = ref_indep_loop_p_1 (safelen, loop, ref, stored_p);
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Querying dependencies of ref %u in loop %d: %s\n",
@@ -2213,7 +2216,7 @@ ref_indep_loop_p (struct loop *loop, im_mem_ref *ref)
{
gcc_checking_assert (MEM_ANALYZABLE (ref));
- return ref_indep_loop_p_2 (loop, loop, ref, false);
+ return ref_indep_loop_p_2 (0, loop, ref, false);
}
/* Returns true if we can perform store motion of REF from LOOP. */