diff options
author | Zdenek Dvorak <dvorakz@suse.cz> | 2005-12-19 21:10:11 +0100 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2005-12-19 20:10:11 +0000 |
commit | 9be7ee44c48f431a95def4d3f373c3325c2d2c22 (patch) | |
tree | c083ed688da6e07dceabf6e632488d095cee358b /gcc | |
parent | 0bae56c4603aa45147cac966e83d264df65847e8 (diff) | |
download | gcc-9be7ee44c48f431a95def4d3f373c3325c2d2c22.zip gcc-9be7ee44c48f431a95def4d3f373c3325c2d2c22.tar.gz gcc-9be7ee44c48f431a95def4d3f373c3325c2d2c22.tar.bz2 |
re PR tree-optimization/24793 (ICE: expected ssa_name, have var_decl in verify_ssa, at tree-ssa.c:746)
PR tree-optimization/24793
* tree-ssa-loop-ivopts.c (get_ref_tag): Remember the
original reference if there are subvars.
* tree-ssa-operands.c (get_tmr_operands): Handle subvars.
From-SVN: r108808
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 17 | ||||
-rw-r--r-- | gcc/tree-ssa-operands.c | 37 |
3 files changed, 53 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index aeddaca..fdaf09f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,12 @@ +2005-12-19 Zdenek Dvorak <dvorakz@suse.cz> + + PR tree-optimization/24793 + * tree-ssa-loop-ivopts.c (get_ref_tag): Remember the + original reference if there are subvars. + * tree-ssa-operands.c (get_tmr_operands): Handle subvars. + 2005-12-19 Kenneth Zadeck <zadeck@naturalbridge.com> + * df.c (df_analyze_1, df_analyze_subcfg, iterative_dataflow): Corrected basic block number calculations for changes in entry and exit numbering. 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)); } } diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c index 236db30..01bf7f2 100644 --- a/gcc/tree-ssa-operands.c +++ b/gcc/tree-ssa-operands.c @@ -1465,7 +1465,10 @@ get_indirect_ref_operands (tree stmt, tree expr, int flags) static void get_tmr_operands (tree stmt, tree expr, int flags) { - tree tag = TMR_TAG (expr); + tree tag = TMR_TAG (expr), ref; + HOST_WIDE_INT offset, size, maxsize; + subvar_t svars, sv; + stmt_ann_t s_ann = stmt_ann (stmt); /* First record the real operands. */ get_expr_operands (stmt, &TMR_BASE (expr), opf_none); @@ -1480,11 +1483,33 @@ get_tmr_operands (tree stmt, tree expr, int flags) add_to_addressable_set (TMR_SYMBOL (expr), &ann->addresses_taken); } - if (tag) - get_expr_operands (stmt, &tag, flags); - else - /* Something weird, so ensure that we will be careful. */ - stmt_ann (stmt)->has_volatile_ops = true; + if (!tag) + { + /* Something weird, so ensure that we will be careful. */ + stmt_ann (stmt)->has_volatile_ops = true; + return; + } + + if (DECL_P (tag)) + { + get_expr_operands (stmt, &tag, flags); + return; + } + + ref = get_ref_base_and_extent (tag, &offset, &size, &maxsize); + gcc_assert (ref != NULL_TREE); + svars = get_subvars_for_var (ref); + for (sv = svars; sv; sv = sv->next) + { + bool exact; + if (overlap_subvar (offset, maxsize, sv, &exact)) + { + int subvar_flags = flags; + if (!exact || size != maxsize) + subvar_flags &= ~opf_kill_def; + add_stmt_operand (&sv->var, s_ann, subvar_flags); + } + } } /* A subroutine of get_expr_operands to handle CALL_EXPR. */ |