diff options
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 4affcf4..6e7dd61 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -5490,10 +5490,21 @@ unshare_and_remove_ssa_names (tree ref) and extracts this single useful piece of information. */ static tree -get_ref_tag (tree ref) +get_ref_tag (tree ref, tree orig) { tree var = get_base_address (ref); - tree tag; + tree aref = NULL_TREE, tag, sv; + HOST_WIDE_INT offset, size, maxsize; + + for (sv = orig; handled_component_p (sv); sv = TREE_OPERAND (sv, 0)) + { + aref = get_ref_base_and_extent (sv, &offset, &size, &maxsize); + if (ref) + break; + } + + if (aref && SSA_VAR_P (aref) && get_subvars_for_var (aref)) + return unshare_expr (sv); if (!var) return NULL_TREE; @@ -5540,8 +5551,8 @@ copy_ref_info (tree new_ref, tree old_ref) copy_mem_ref_info (new_ref, old_ref); else { - TMR_TAG (new_ref) = get_ref_tag (old_ref); TMR_ORIGINAL (new_ref) = unshare_and_remove_ssa_names (old_ref); + TMR_TAG (new_ref) = get_ref_tag (old_ref, TMR_ORIGINAL (new_ref)); } } |