Commit 85ff4ec6 by Bin Cheng Committed by Bin Cheng

tree-ssa-loop-ivopts.c (set_autoinc_for_original_candidates): Find…

tree-ssa-loop-ivopts.c (set_autoinc_for_original_candidates): Find auto-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
parent fde6f97e
2013-09-02 Bin Cheng <bin.cheng@arm.com>
* tree-ssa-loop-ivopts.c (set_autoinc_for_original_candidates):
Find auto-increment use both before and after candidate.
2013-09-02 Marek Polacek <polacek@redhat.com> 2013-09-02 Marek Polacek <polacek@redhat.com>
* Makefile.in (ubsan.o): Add $(TM_P_H) dependency. * Makefile.in (ubsan.o): Add $(TM_P_H) dependency.
......
2013-09-02 Bin Cheng <bin.cheng@arm.com>
* gcc.target/arm/ivopts-orig_biv-inc.c: New testcase.
2013-09-02 Paolo Carlini <paolo.carlini@oracle.com> 2013-09-02 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/21682, implement DR 565 PR c++/21682, implement DR 565
......
/* { 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" } } */
...@@ -4876,22 +4876,36 @@ set_autoinc_for_original_candidates (struct ivopts_data *data) ...@@ -4876,22 +4876,36 @@ set_autoinc_for_original_candidates (struct ivopts_data *data)
for (i = 0; i < n_iv_cands (data); i++) for (i = 0; i < n_iv_cands (data); i++)
{ {
struct iv_cand *cand = iv_cand (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) if (cand->pos != IP_ORIGINAL)
continue; continue;
for (j = 0; j < n_iv_uses (data); j++) for (j = 0; j < n_iv_uses (data); j++)
{ {
struct iv_use *use = iv_use (data, j); struct iv_use *use = iv_use (data, j);
unsigned uid = gimple_uid (use->stmt); 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; 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; if (closest_before != NULL
cand->ainc_use = closest; && 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;
} }
} }
......
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