Mercurial > hg > CbC > CbC_gcc
diff gcc/tree-ssa-ccp.c @ 47:3bfb6c00c1e0
update it from 4.4.2 to 4.4.3.
author | kent <kent@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 07 Feb 2010 17:44:34 +0900 |
parents | 58ad6c70ea60 |
children | 77e2b8dfacca |
line wrap: on
line diff
--- a/gcc/tree-ssa-ccp.c Sun Feb 07 17:43:48 2010 +0900 +++ b/gcc/tree-ssa-ccp.c Sun Feb 07 17:44:34 2010 +0900 @@ -1727,7 +1727,7 @@ static tree maybe_fold_offset_to_component_ref (tree record_type, tree base, tree offset, - tree orig_type, bool base_is_ptr) + tree orig_type) { tree f, t, field_type, tail_array_field, field_offset; tree ret; @@ -1779,8 +1779,6 @@ if (cmp == 0 && useless_type_conversion_p (orig_type, field_type)) { - if (base_is_ptr) - base = build1 (INDIRECT_REF, record_type, base); t = build3 (COMPONENT_REF, field_type, base, f, NULL_TREE); return t; } @@ -1805,11 +1803,7 @@ /* If we matched, then set offset to the displacement into this field. */ - if (base_is_ptr) - new_base = build1 (INDIRECT_REF, record_type, base); - else - new_base = base; - new_base = build3 (COMPONENT_REF, field_type, new_base, f, NULL_TREE); + new_base = build3 (COMPONENT_REF, field_type, base, f, NULL_TREE); /* Recurse to possibly find the match. */ ret = maybe_fold_offset_to_array_ref (new_base, t, orig_type, @@ -1817,7 +1811,7 @@ if (ret) return ret; ret = maybe_fold_offset_to_component_ref (field_type, new_base, t, - orig_type, false); + orig_type); if (ret) return ret; } @@ -1831,8 +1825,6 @@ /* If we get here, we've got an aggregate field, and a possibly nonzero offset into them. Recurse and hope for a valid match. */ - if (base_is_ptr) - base = build1 (INDIRECT_REF, record_type, base); base = build3 (COMPONENT_REF, field_type, base, f, NULL_TREE); t = maybe_fold_offset_to_array_ref (base, offset, orig_type, @@ -1840,7 +1832,7 @@ if (t) return t; return maybe_fold_offset_to_component_ref (field_type, base, offset, - orig_type, false); + orig_type); } /* Attempt to express (ORIG_TYPE)BASE+OFFSET as BASE->field_of_orig_type @@ -1854,57 +1846,44 @@ { tree ret; tree type; - bool base_is_ptr = true; STRIP_NOPS (base); - if (TREE_CODE (base) == ADDR_EXPR) + if (TREE_CODE (base) != ADDR_EXPR) + return NULL_TREE; + + base = TREE_OPERAND (base, 0); + + /* Handle case where existing COMPONENT_REF pick e.g. wrong field of union, + so it needs to be removed and new COMPONENT_REF constructed. + The wrong COMPONENT_REF are often constructed by folding the + (type *)&object within the expression (type *)&object+offset */ + if (handled_component_p (base)) { - base_is_ptr = false; - - base = TREE_OPERAND (base, 0); - - /* Handle case where existing COMPONENT_REF pick e.g. wrong field of union, - so it needs to be removed and new COMPONENT_REF constructed. - The wrong COMPONENT_REF are often constructed by folding the - (type *)&object within the expression (type *)&object+offset */ - if (handled_component_p (base)) + HOST_WIDE_INT sub_offset, size, maxsize; + tree newbase; + newbase = get_ref_base_and_extent (base, &sub_offset, + &size, &maxsize); + gcc_assert (newbase); + if (size == maxsize + && size != -1 + && !(sub_offset & (BITS_PER_UNIT - 1))) { - HOST_WIDE_INT sub_offset, size, maxsize; - tree newbase; - newbase = get_ref_base_and_extent (base, &sub_offset, - &size, &maxsize); - gcc_assert (newbase); - if (size == maxsize - && size != -1 - && !(sub_offset & (BITS_PER_UNIT - 1))) - { - base = newbase; - if (sub_offset) - offset = int_const_binop (PLUS_EXPR, offset, - build_int_cst (TREE_TYPE (offset), - sub_offset / BITS_PER_UNIT), 1); - } + base = newbase; + if (sub_offset) + offset = int_const_binop (PLUS_EXPR, offset, + build_int_cst (TREE_TYPE (offset), + sub_offset / BITS_PER_UNIT), 1); } - if (useless_type_conversion_p (orig_type, TREE_TYPE (base)) - && integer_zerop (offset)) - return base; - type = TREE_TYPE (base); } - else - { - base_is_ptr = true; - if (!POINTER_TYPE_P (TREE_TYPE (base))) - return NULL_TREE; - type = TREE_TYPE (TREE_TYPE (base)); - } - ret = maybe_fold_offset_to_component_ref (type, base, offset, - orig_type, base_is_ptr); + if (useless_type_conversion_p (orig_type, TREE_TYPE (base)) + && integer_zerop (offset)) + return base; + type = TREE_TYPE (base); + + ret = maybe_fold_offset_to_component_ref (type, base, offset, orig_type); if (!ret) - { - if (base_is_ptr) - base = build1 (INDIRECT_REF, type, base); - ret = maybe_fold_offset_to_array_ref (base, offset, orig_type, true); - } + ret = maybe_fold_offset_to_array_ref (base, offset, orig_type, true); + return ret; } @@ -2143,7 +2122,7 @@ t = maybe_fold_offset_to_array_ref (op0, op1, ptd_type, true); if (!t) t = maybe_fold_offset_to_component_ref (TREE_TYPE (op0), op0, op1, - ptd_type, false); + ptd_type); if (t) t = build1 (ADDR_EXPR, res_type, t);