Mercurial > hg > CbC > CbC_gcc
diff gcc/tree-predcom.c @ 63:b7f97abdc517 gcc-4.6-20100522
update gcc from gcc-4.5.0 to gcc-4.6
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 May 2010 12:47:05 +0900 |
parents | 77e2b8dfacca |
children | f6334be47118 |
line wrap: on
line diff
--- a/gcc/tree-predcom.c Fri Feb 12 23:41:23 2010 +0900 +++ b/gcc/tree-predcom.c Mon May 24 12:47:05 2010 +0900 @@ -1,5 +1,6 @@ /* Predictive commoning. - Copyright (C) 2005, 2007, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 2005, 2007, 2008, 2009, 2010 + Free Software Foundation, Inc. This file is part of GCC. @@ -198,6 +199,8 @@ #include "tree-chrec.h" #include "params.h" #include "diagnostic.h" +#include "tree-pretty-print.h" +#include "gimple-pretty-print.h" #include "tree-pass.h" #include "tree-affine.h" #include "tree-inline.h" @@ -1180,6 +1183,7 @@ unsigned i; dref a; chain_p chain = NULL; + double_int last_ofs = double_int_zero; /* Invariants are handled specially. */ if (comp->comp_step == RS_INVARIANT) @@ -1194,13 +1198,20 @@ for (i = 0; VEC_iterate (dref, comp->refs, i, a); i++) { - if (!chain || !DR_IS_READ (a->ref)) + if (!chain || !DR_IS_READ (a->ref) + || double_int_ucmp (uhwi_to_double_int (MAX_DISTANCE), + double_int_add (a->offset, + double_int_neg (last_ofs))) <= 0) { if (nontrivial_chain_p (chain)) - VEC_safe_push (chain_p, heap, *chains, chain); + { + add_looparound_copies (loop, chain); + VEC_safe_push (chain_p, heap, *chains, chain); + } else release_chain (chain); chain = make_rooted_chain (a); + last_ofs = a->offset; continue; } @@ -1338,9 +1349,11 @@ else if (!INDIRECT_REF_P (ref)) return unshare_expr (ref); - if (TREE_CODE (ref) == INDIRECT_REF) + if (INDIRECT_REF_P (ref)) { - ret = build1 (INDIRECT_REF, TREE_TYPE (ref), NULL_TREE); + /* Take care for INDIRECT_REF and MISALIGNED_INDIRECT_REF at + the same time. */ + ret = copy_node (ref); idx = TREE_OPERAND (ref, 0); idx_p = &TREE_OPERAND (ret, 0); } @@ -1449,13 +1462,9 @@ predcom_tmp_var (tree ref, unsigned i, bitmap tmp_vars) { tree type = TREE_TYPE (ref); - tree var = create_tmp_var (type, get_lsm_tmp_name (ref, i)); - /* We never access the components of the temporary variable in predictive commoning. */ - if (TREE_CODE (type) == COMPLEX_TYPE - || TREE_CODE (type) == VECTOR_TYPE) - DECL_GIMPLE_REG_P (var) = 1; + tree var = create_tmp_reg (type, get_lsm_tmp_name (ref, i)); add_referenced_var (var); bitmap_set_bit (tmp_vars, DECL_UID (var)); @@ -1879,7 +1888,6 @@ { gimple stmt, phi; imm_use_iterator iter; - edge e; SSA_NAME_VAR (name) = var; @@ -1898,11 +1906,6 @@ if (!phi) return; - if (gimple_bb (phi) == loop->header) - e = loop_latch_edge (loop); - else - e = single_pred_edge (gimple_bb (stmt)); - name = PHI_RESULT (phi); SSA_NAME_VAR (name) = var; } @@ -2204,12 +2207,12 @@ /* Insert the new statement combining NAME1 and NAME2 before S1, and combine it with the rhs of S1. */ - var = create_tmp_var (type, "predreastmp"); + var = create_tmp_reg (type, "predreastmp"); add_referenced_var (var); new_name = make_ssa_name (var, NULL); new_stmt = gimple_build_assign_with_ops (code, new_name, name1, name2); - var = create_tmp_var (type, "predreastmp"); + var = create_tmp_reg (type, "predreastmp"); add_referenced_var (var); tmp_name = make_ssa_name (var, NULL); @@ -2267,7 +2270,7 @@ tree rslt_type = NULL_TREE; if (ch1 == ch2) - return false; + return NULL; if (ch1->length != ch2->length) return NULL;