diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2008-07-10 17:00:37 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@gcc.gnu.org> | 2008-07-10 17:00:37 +0000 |
commit | 6999afe1b9fd5fe6babd4139b34ed9bbaacaeebb (patch) | |
tree | 115ad1079ac95e8735bc871fabcffc31f00dee96 /gcc/tree-ssa-pre.c | |
parent | b826efd98620ba65956843f515fb1698ea6feecf (diff) | |
download | gcc-6999afe1b9fd5fe6babd4139b34ed9bbaacaeebb.zip gcc-6999afe1b9fd5fe6babd4139b34ed9bbaacaeebb.tar.gz gcc-6999afe1b9fd5fe6babd4139b34ed9bbaacaeebb.tar.bz2 |
tree-ssa-pre.c (create_expression_by_pieces): Add fold_convert calls.
2008-07-10 Daniel Berlin <dberlin@dberlin.org>
* tree-ssa-pre.c (create_expression_by_pieces): Add fold_convert
calls.
(eliminate): Ditto.
(execute_pre): Call loop_optimizer_finalize in early exit.
From-SVN: r137696
Diffstat (limited to 'gcc/tree-ssa-pre.c')
-rw-r--r-- | gcc/tree-ssa-pre.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 53c3957..ecaf54c 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -2448,10 +2448,10 @@ create_component_ref_by_pieces (basic_block block, vn_reference_t ref, if (!genop1) return NULL_TREE; genop1 = fold_convert (build_pointer_type (currop->type), - genop1); + genop1); folded = fold_build1 (currop->opcode, currop->type, - genop1); + genop1); return folded; } } @@ -2694,10 +2694,15 @@ create_expression_by_pieces (basic_block block, pre_expr expr, tree stmts, stmts, domstmt); if (!genop1 || !genop2) return NULL_TREE; + genop1 = fold_convert (TREE_TYPE (nary->op[0]), + genop1); /* Ensure op2 is a sizetype for POINTER_PLUS_EXPR. It may be a constant with the wrong type. */ if (nary->opcode == POINTER_PLUS_EXPR) genop2 = fold_convert (sizetype, genop2); + else + genop2 = fold_convert (TREE_TYPE (nary->op[0]), genop2); + folded = fold_build2 (nary->opcode, nary->type, genop1, genop2); } @@ -2709,6 +2714,8 @@ create_expression_by_pieces (basic_block block, pre_expr expr, tree stmts, stmts, domstmt); if (!genop1) return NULL_TREE; + genop1 = fold_convert (TREE_TYPE (nary->op[0]), genop1); + folded = fold_build1 (nary->opcode, nary->type, genop1); } @@ -3818,11 +3825,13 @@ eliminate (void) else gcc_unreachable (); } + /* If there is no existing leader but SCCVN knows this value is constant, use that constant. */ if (!sprime && is_gimple_min_invariant (VN_INFO (lhs)->valnum)) { - sprime = VN_INFO (lhs)->valnum; + sprime = fold_convert (TREE_TYPE (lhs), + VN_INFO (lhs)->valnum); if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -4171,7 +4180,11 @@ execute_pre (bool do_fre) if (!run_scc_vn (do_fre)) { if (!do_fre) - remove_dead_inserted_code (); + { + remove_dead_inserted_code (); + loop_optimizer_finalize (); + } + return 0; } init_pre (do_fre); |