diff options
author | Tom de Vries <tom@codesourcery.com> | 2012-01-27 10:38:27 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2012-01-27 10:38:27 +0000 |
commit | 842679dc9f6a1398bc192a85401913608ccc967a (patch) | |
tree | 9a8042fec460d9be1c160f2bdb81880a5e095a2a /gcc | |
parent | 4daa71b06377971c08341ff1664438de55dd5603 (diff) | |
download | gcc-842679dc9f6a1398bc192a85401913608ccc967a.zip gcc-842679dc9f6a1398bc192a85401913608ccc967a.tar.gz gcc-842679dc9f6a1398bc192a85401913608ccc967a.tar.bz2 |
re PR tree-optimization/51990 (ICE in copy_reference_ops_from_ref)
2012-01-27 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/51990
* tree-ssa-sccvn.c (copy_reference_ops_from_ref): Handle WITH_SIZE_EXPR.
* tree-ssa-pre.c (create_component_ref_by_pieces_1): Same.
From-SVN: r183614
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.c | 17 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 5 |
3 files changed, 28 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fe748f4..e7fb05d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-01-27 Tom de Vries <tom@codesourcery.com> + + PR tree-optimization/51990 + * tree-ssa-sccvn.c (copy_reference_ops_from_ref): Handle WITH_SIZE_EXPR. + * tree-ssa-pre.c (create_component_ref_by_pieces_1): Same. + 2012-01-27 Jakub Jelinek <jakub@redhat.com> PR debug/52001 diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index b95ac78..71f945f 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -2792,6 +2792,23 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref, return folded; } break; + case WITH_SIZE_EXPR: + { + tree genop0 = create_component_ref_by_pieces_1 (block, ref, operand, + stmts, domstmt); + pre_expr op1expr = get_or_alloc_expr_for (currop->op0); + tree genop1; + + if (!genop0) + return NULL_TREE; + + genop1 = find_or_generate_expression (block, op1expr, stmts, domstmt); + if (!genop1) + return NULL_TREE; + + return fold_build2 (currop->opcode, currop->type, genop0, genop1); + } + break; case BIT_FIELD_REF: { tree folded; diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 1f03600..fdebe47 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -628,6 +628,10 @@ copy_reference_ops_from_ref (tree ref, VEC(vn_reference_op_s, heap) **result) switch (temp.opcode) { + case WITH_SIZE_EXPR: + temp.op0 = TREE_OPERAND (ref, 1); + temp.off = 0; + break; case MEM_REF: /* The base address gets its own vn_reference_op_s structure. */ temp.op0 = TREE_OPERAND (ref, 1); @@ -744,6 +748,7 @@ copy_reference_ops_from_ref (tree ref, VEC(vn_reference_op_s, heap) **result) VEC_safe_push (vn_reference_op_s, heap, *result, &temp); if (REFERENCE_CLASS_P (ref) + || TREE_CODE (ref) == WITH_SIZE_EXPR || (TREE_CODE (ref) == ADDR_EXPR && !is_gimple_min_invariant (ref))) ref = TREE_OPERAND (ref, 0); |