Skip to content

Commit

Permalink
tree-ssa-loop-ivopts.c (set_autoinc_for_original_candidates): Find au…
Browse files Browse the repository at this point in the history
…to-increment use both before and after candidate.

	* tree-ssa-loop-ivopts.c (set_autoinc_for_original_candidates):
	Find auto-increment use both before and after candidate.

	* gcc.target/arm/ivopts-orig_biv-inc.c: New testcase.

From-SVN: r202164
  • Loading branch information
Bin Cheng authored and Bin Cheng committed Sep 2, 2013
1 parent fde6f97 commit 85ff4ec
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 8 deletions.
5 changes: 5 additions & 0 deletions gcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2013-09-02 Bin Cheng <[email protected]>

* tree-ssa-loop-ivopts.c (set_autoinc_for_original_candidates):
Find auto-increment use both before and after candidate.

2013-09-02 Marek Polacek <[email protected]>

* Makefile.in (ubsan.o): Add $(TM_P_H) dependency.
Expand Down
4 changes: 4 additions & 0 deletions gcc/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
2013-09-02 Bin Cheng <[email protected]>

* gcc.target/arm/ivopts-orig_biv-inc.c: New testcase.

2013-09-02 Paolo Carlini <[email protected]>

PR c++/21682, implement DR 565
Expand Down
19 changes: 19 additions & 0 deletions gcc/testsuite/gcc.target/arm/ivopts-orig_biv-inc.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-ivopts-details" } */
/* { dg-skip-if "" { arm_thumb1 } } */

extern char *__ctype_ptr__;

unsigned char * foo(unsigned char *ReadPtr)
{

unsigned char c;

while (!(((__ctype_ptr__+sizeof(""[*ReadPtr]))[(int)(*ReadPtr)])&04) == (!(0)))
ReadPtr++;

return ReadPtr;
}

/* { dg-final { scan-tree-dump-times "original biv" 2 "ivopts"} } */
/* { dg-final { cleanup-tree-dump "ivopts" } } */
30 changes: 22 additions & 8 deletions gcc/tree-ssa-loop-ivopts.c
Original file line number Diff line number Diff line change
Expand Up @@ -4876,22 +4876,36 @@ set_autoinc_for_original_candidates (struct ivopts_data *data)
for (i = 0; i < n_iv_cands (data); i++)
{
struct iv_cand *cand = iv_cand (data, i);
struct iv_use *closest = NULL;
struct iv_use *closest_before = NULL;
struct iv_use *closest_after = NULL;
if (cand->pos != IP_ORIGINAL)
continue;

for (j = 0; j < n_iv_uses (data); j++)
{
struct iv_use *use = iv_use (data, j);
unsigned uid = gimple_uid (use->stmt);
if (gimple_bb (use->stmt) != gimple_bb (cand->incremented_at)
|| uid > gimple_uid (cand->incremented_at))

if (gimple_bb (use->stmt) != gimple_bb (cand->incremented_at))
continue;
if (closest == NULL || uid > gimple_uid (closest->stmt))
closest = use;

if (uid < gimple_uid (cand->incremented_at)
&& (closest_before == NULL
|| uid > gimple_uid (closest_before->stmt)))
closest_before = use;

if (uid > gimple_uid (cand->incremented_at)
&& (closest_after == NULL
|| uid < gimple_uid (closest_after->stmt)))
closest_after = use;
}
if (closest == NULL || !autoinc_possible_for_pair (data, closest, cand))
continue;
cand->ainc_use = closest;

if (closest_before != NULL
&& autoinc_possible_for_pair (data, closest_before, cand))
cand->ainc_use = closest_before;
else if (closest_after != NULL
&& autoinc_possible_for_pair (data, closest_after, cand))
cand->ainc_use = closest_after;
}
}

Expand Down

0 comments on commit 85ff4ec

Please sign in to comment.