diff options
author | Bin Cheng <bin.cheng@linux.alibaba.com> | 2019-03-04 01:38:25 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2019-03-04 01:38:25 +0000 |
commit | c4450491148133f3825470a6c69d90c745986fe8 (patch) | |
tree | 03e205483e741149342892e40475d2986cbb6741 /gcc/tree-loop-distribution.c | |
parent | 19deb34365246c8dd0bcab74c1637ad2bdf47cca (diff) | |
download | gcc-c4450491148133f3825470a6c69d90c745986fe8.zip gcc-c4450491148133f3825470a6c69d90c745986fe8.tar.gz gcc-c4450491148133f3825470a6c69d90c745986fe8.tar.bz2 |
re PR tree-optimization/89487 (ICE in expand_expr_addr_expr_1, at expr.c:7993)
PR tree-optimization/89487
* tree-loop-distribution.c (has_nonaddressable_dataref_p): New.
(create_rdg_vertices): Compute has_nonaddressable_dataref_p.
(distribute_loop): Don't do runtime alias check if there is non-
addressable data reference.
* tree-ssa-loop-ivopts.c (may_be_nonaddressable_p): Check if VAR_DECL
is a register variable.
* gcc/testsuite/gcc.dg/tree-ssa/pr89487.c: New test.
From-SVN: r269361
Diffstat (limited to 'gcc/tree-loop-distribution.c')
-rw-r--r-- | gcc/tree-loop-distribution.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 066356f..81283d1 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -160,6 +160,9 @@ static vec<loop_p> loop_nest; /* Vector of data references in the loop to be distributed. */ static vec<data_reference_p> datarefs_vec; +/* If there is nonaddressable data reference in above vector. */ +static bool has_nonaddressable_dataref_p; + /* Store index of data reference in aux field. */ #define DR_INDEX(dr) ((uintptr_t) (dr)->aux) @@ -467,6 +470,7 @@ create_rdg_vertices (struct graph *rdg, vec<gimple *> stmts, loop_p loop) else RDGV_HAS_MEM_WRITE (v) = true; RDGV_DATAREFS (v).safe_push (dr); + has_nonaddressable_dataref_p |= may_be_nonaddressable_p (dr->ref); } } return true; @@ -2757,6 +2761,7 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts, } datarefs_vec.create (20); + has_nonaddressable_dataref_p = false; rdg = build_rdg (loop, cd); if (!rdg) { @@ -2885,8 +2890,10 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts, if (partitions.length () > 1) { /* Don't support loop nest distribution under runtime alias check - since it's not likely to enable many vectorization opportunities. */ - if (loop->inner) + since it's not likely to enable many vectorization opportunities. + Also if loop has any data reference which may be not addressable + since alias check needs to take, compare address of the object. */ + if (loop->inner || has_nonaddressable_dataref_p) merge_dep_scc_partitions (rdg, &partitions, false); else { |