[gcc(refs/users/guojiufu/heads/personal-branch)] EQ_EXPR and LE_EXPR ok
Jiu Fu Guo
guojiufu@gcc.gnu.org
Wed Jun 9 04:55:12 GMT 2021
https://gcc.gnu.org/g:4acec8dc6f5b20eb940eb2b0b64da87cdd059dfa
commit 4acec8dc6f5b20eb940eb2b0b64da87cdd059dfa
Author: Jiufu Guo <guojiufu@linux.ibm.com>
Date: Tue Jun 8 19:33:08 2021 +0800
EQ_EXPR and LE_EXPR ok
Diff:
---
gcc/tree-ssa-loop-split.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/gcc/tree-ssa-loop-split.c b/gcc/tree-ssa-loop-split.c
index 13d6bea88ed..abc81a6144c 100644
--- a/gcc/tree-ssa-loop-split.c
+++ b/gcc/tree-ssa-loop-split.c
@@ -1667,9 +1667,15 @@ struct idx_elements
bool
analyze_idx_elements (class loop *loop, edge e, idx_elements &data)
{
+ /* Avoid complicated edge. */
if (e->flags & EDGE_FAKE)
return false;
+ if (e->src != loop->header && e->src != single_pred (loop->latch))
+ return false;
+ if (!dominated_by_p (CDI_DOMINATORS, loop->latch, e->src))
+ return false;
+ /* Check gcond. */
gimple *last = last_stmt (e->src);
if (!last || gimple_code (last) != GIMPLE_COND)
return false;
@@ -1746,6 +1752,9 @@ get_wrap_assumption (class loop *loop, edge *exit, idx_elements &data)
{
int i;
edge e;
+ if (!single_pred_p(loop->latch) || !empty_block_p (loop->latch))
+ return NULL_TREE;
+
auto_vec<edge> edges = get_loop_exit_edges (loop);
FOR_EACH_VEC_ELT (edges, i, e)
{
@@ -1767,7 +1776,9 @@ get_wrap_assumption (class loop *loop, edge *exit, idx_elements &data)
enum tree_code code = gimple_cond_code (gc);
if (bnd == gimple_cond_lhs (gc))
code = swap_tree_comparison (code);
- if (code != NE_EXPR)
+ if ((e->flags & EDGE_TRUE_VALUE) && code == EQ_EXPR)
+ code = NE_EXPR;
+ if (code != NE_EXPR && code != LT_EXPR)
continue;
/* Check if idx is iv with base and step. */
@@ -1849,7 +1860,6 @@ split_wrap_boundary (class loop *loop, edge e, tree no_wrap_cond)
new_code = inv ? GT_EXPR : LT_EXPR;
if (code == EQ_EXPR)
{
- new_code = invert_tree_comparison (new_code, false);
edge out = EDGE_SUCC (e->src, 0);
edge in = EDGE_SUCC (e->src, 1);
if (in->flags & EDGE_TRUE_VALUE)
@@ -1916,7 +1926,7 @@ split_loop_on_wrap (class loop *loop)
tree no_wrap_assumption = get_wrap_assumption (loop, &e, data);
if (no_wrap_assumption && split_wrap_boundary (loop, e, no_wrap_assumption))
- return true;
+ return true;
return false;
}
More information about the Gcc-cvs
mailing list