aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorZdenek Dvorak <dvorakz@suse.cz>2005-12-19 21:10:11 +0100
committerZdenek Dvorak <rakdver@gcc.gnu.org>2005-12-19 20:10:11 +0000
commit9be7ee44c48f431a95def4d3f373c3325c2d2c22 (patch)
treec083ed688da6e07dceabf6e632488d095cee358b /gcc
parent0bae56c4603aa45147cac966e83d264df65847e8 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/tree-ssa-loop-ivopts.c17
-rw-r--r--gcc/tree-ssa-operands.c37
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. */