diff options
author | Richard Guenther <rguenther@suse.de> | 2009-08-06 11:31:20 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-08-06 11:31:20 +0000 |
commit | e52201b6803177a519fc6dfd36e247b33bea4bac (patch) | |
tree | c86db63d8e19ae44aa8456ce2c320f63e0d91839 /gcc/tree-ssa-pre.c | |
parent | b92fbdd7b3eee74a74f97bf7bc74155186efa1be (diff) | |
download | gcc-e52201b6803177a519fc6dfd36e247b33bea4bac.zip gcc-e52201b6803177a519fc6dfd36e247b33bea4bac.tar.gz gcc-e52201b6803177a519fc6dfd36e247b33bea4bac.tar.bz2 |
tree-ssa.c (useless_type_conversion_p_1): Make function and array type comparisons frontend independent.
2009-08-06 Richard Guenther <rguenther@suse.de>
* tree-ssa.c (useless_type_conversion_p_1): Make function and
array type comparisons frontend independent.
* Makefile.in (tree-ssa.o): Add $(TARGET_H) dependency.
* tree-ssa-sccvn.c (copy_reference_ops_from_ref): Always fill
out array reference lower bound and element size operands.
(ao_ref_init_from_vn_reference): Properly compute the offset
for ARRAY_RANGE_REF.
(vn_reference_fold_indirect): Fill out array reference lower
bound and element size operands.
* tree-ssa-pre.c (phi_translate_1): Fail if we have to translate
a non gimple valued reference operand which can happen for
array reference lower bound or element size.
(create_component_ref_by_pieces_1): Properly generate the
element size operand for array references.
From-SVN: r150519
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 237c250..c09f3ae9 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -1600,6 +1600,9 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, else if (!opresult) break; } + /* We can't possibly insert these. */ + else if (op1 && !is_gimple_min_invariant (op1)) + break; changed |= op1 != oldop1; if (op2 && TREE_CODE (op2) == SSA_NAME) { @@ -1617,6 +1620,9 @@ phi_translate_1 (pre_expr expr, bitmap_set_t set1, bitmap_set_t set2, else if (!opresult) break; } + /* We can't possibly insert these. */ + else if (op2 && !is_gimple_min_invariant (op2)) + break; changed |= op2 != oldop2; if (!newoperands) @@ -2742,7 +2748,8 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref, pre_expr op1expr; tree genop2 = currop->op1; pre_expr op2expr; - tree genop3; + tree genop3 = currop->op2; + pre_expr op3expr; genop0 = create_component_ref_by_pieces_1 (block, ref, operand, stmts, domstmt); if (!genop0) @@ -2759,8 +2766,17 @@ create_component_ref_by_pieces_1 (basic_block block, vn_reference_t ref, if (!genop2) return NULL_TREE; } - - genop3 = currop->op2; + if (genop3) + { + tree elmt_type = TREE_TYPE (TREE_TYPE (genop0)); + genop3 = size_binop (EXACT_DIV_EXPR, genop3, + size_int (TYPE_ALIGN_UNIT (elmt_type))); + op3expr = get_or_alloc_expr_for (genop3); + genop3 = find_or_generate_expression (block, op3expr, stmts, + domstmt); + if (!genop3) + return NULL_TREE; + } return build4 (currop->opcode, currop->type, genop0, genop1, genop2, genop3); } |