* [PATCH][1/N][C][C++][Fortran][Java] Change POINTER_PLUS_EXPR offset type requirements
@ 2011-07-12 10:52 Richard Guenther
2011-07-12 12:30 ` Tobias Burnus
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Richard Guenther @ 2011-07-12 10:52 UTC (permalink / raw)
To: gcc-patches; +Cc: fortran, java, jason, Joseph S. Myers, aph, tromey
This patch is step 1, it abstracts away the type of the offset operand
when building a POINTER_PLUS_EXPR. It does so by introducing
fold_build_pointer_plus_expr{_hwi,_loc} helpers and use them in all
places that currently build POINTER_PLUS_EXPRs (including those
that do not fold the result). This patch will make steps 2 and more
purely middle-end (fingers crossed).
Bootstrapped and tested on x86_64-unknown-linux-gnu for all languages.
I also built cc1 for all supported targets via contrib/config-list.mk
and saw no fails that relate to this patch.
Are the frontend parts ok?
Thanks,
Richard.
2011-07-12 Richard Guenther <rguenther@suse.de>
* tree.h (fold_build_pointer_plus_loc): New helper function.
(fold_build_pointer_plus_hwi_loc): Likewise.
(fold_build_pointer_plus): Define.
(fold_build_pointer_plus_hwi): Likewise.
* builtins.c (std_gimplify_va_arg_expr): Use fold_build_pointer_plus.
(fold_builtin_memory_op): Likewise.
(fold_builtin_stpcpy): Likewise.
(fold_builtin_memchr): Likewise.
(fold_builtin_strstr): Likewise.
(fold_builtin_strchr): Likewise.
(fold_builtin_strrchr): Likewise.
(fold_builtin_strpbrk): Likewise.
(fold_builtin_strcat): Likewise.
(expand_builtin_memory_chk): Likewise.
(fold_builtin_memory_chk): Likewise.
* c-typeck.c (build_unary_op): Likewise.
* cgraphunit.c (thunk_adjust): Likewise.
* fold-const.c (build_range_check): Likewise.
(fold_binary_loc): Likewise.
* omp-low.c (extract_omp_for_data): Likewise.
(expand_omp_for_generic): Likewise.
(expand_omp_for_static_nochunk): Likewise.
(expand_omp_for_static_chunk): Likewise.
* tree-affine.c (add_elt_to_tree): Likewise.
* tree-data-ref.c (split_constant_offset_1): Likewise.
* tree-loop-distribution.c (generate_memset_zero): Likewise.
* tree-mudflap.c (mf_xform_derefs_1): Likewise.
* tree-predcom.c (ref_at_iteration): Likewise.
* tree-ssa-address.c (tree_mem_ref_addr): Likewise.
(add_to_parts): Likewise.
(create_mem_ref): Likewise.
* tree-ssa-loop-ivopts.c (force_expr_to_var_cost): Likewise.
* tree-ssa-loop-niter.c (number_of_iterations_lt_to_ne): Likewise.
(number_of_iterations_le): Likewise.
* tree-ssa-loop-prefetch.c (issue_prefetch_ref): Likewise.
* tree-vect-data-refs.c (vect_analyze_data_refs): Likewise.
(vect_create_addr_base_for_vector_ref): Likewise.
* tree-vect-loop-manip.c (vect_update_ivs_after_vectorizer): Likewise.
(vect_create_cond_for_alias_checks): Likewise.
* tree-vrp.c (extract_range_from_assert): Likewise.
* config/alpha/alpha.c (alpha_va_start): Likewise.
(alpha_gimplify_va_arg_1): Likewise.
* config/i386/i386.c (ix86_va_start): Likewise.
(ix86_gimplify_va_arg): Likewise.
* config/ia64/ia64.c (ia64_gimplify_va_arg): Likewise.
* config/mep/mep.c (mep_expand_va_start): Likewise.
(mep_gimplify_va_arg_expr): Likewise.
* config/mips/mips.c (mips_va_start): Likewise.
(mips_gimplify_va_arg_expr): Likewise.
* config/pa/pa.c (hppa_gimplify_va_arg_expr): Likewise.
* config/rs6000/rs6000.c (rs6000_va_start): Likewise.
(rs6000_gimplify_va_arg): Likewise.
* config/s390/s390.c (s390_va_start): Likewise.
(s390_gimplify_va_arg): Likewise.
* config/sh/sh.c (sh_va_start): Likewise.
(sh_gimplify_va_arg_expr): Likewise.
* config/sparc/sparc.c (sparc_gimplify_va_arg): Likewise.
* config/spu/spu.c (spu_va_start): Likewise.
(spu_gimplify_va_arg_expr): Likewise.
* config/stormy16/stormy16.c (xstormy16_expand_builtin_va_start):
Likewise.
(xstormy16_gimplify_va_arg_expr): Likewise.
* config/xtensa/xtensa.c (xtensa_va_start): Likewise.
(xtensa_gimplify_va_arg_expr): Likewise.
c-family/
* c-common.c (pointer_int_sum): Use fold_build_pointer_plus.
* c-omp.c (c_finish_omp_for): Likewise.
cp/
* call.c (build_special_member_call): Use fold_build_pointer_plus.
* class.c (build_base_path): Likewise.
(convert_to_base_statically): Likewise.
(dfs_accumulate_vtbl_inits): Likewise.
* cp-gimplify.c (cxx_omp_clause_apply_fn): Likewise.
* except.c (expand_start_catch_block): Likewise.
* init.c (expand_virtual_init): Likewise.
(build_new_1): Likewise.
(build_vec_delete_1): Likewise.
(build_vec_delete): Likewise.
* rtti.c (build_headof): Likewise.
(tinfo_base_init): Likewise.
* typeck.c (get_member_function_from_ptrfunc): Likewise.
(cp_build_addr_expr_1): Likewise.
* typeck2.c (build_m_component_ref): Likewise.
fortran/
* trans-expr.c (fill_with_spaces): Use fold_build_pointer_plus.
(gfc_trans_string_copy): Likewise.
* trans-intrinsic.c (gfc_conv_intrinsic_repeat): Likewise.
* trans-types.c (gfc_get_array_descr_info): Likewise.
* trans.c (gfc_build_array_ref): Likewise.
java/
* builtins.c (static): Use fold_build_pointer_plus.
* class.c (make_class_data): Likewise.
(build_symbol_entry): Likewise.
* except.c (build_exception_object_ref): Likewise.
* expr.c (build_java_arrayaccess): Likewise.
(build_field_ref): Likewise.
(build_known_method_ref): Likewise.
(build_invokevirtual): Likewise.
objc/
* objc-next-runtime-abi-02.c (objc_v2_build_ivar_ref):
Use fold_build_pointer_plus.
(objc2_build_ehtype_initializer): Likewise.
Index: trunk/gcc/builtins.c
===================================================================
*** trunk.orig/gcc/builtins.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/builtins.c 2011-07-11 17:13:24.000000000 +0200
*************** std_gimplify_va_arg_expr (tree valist, t
*** 4236,4244 ****
&& !integer_zerop (TYPE_SIZE (type)))
{
t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
! fold_build2 (POINTER_PLUS_EXPR,
! TREE_TYPE (valist),
! valist_tmp, size_int (boundary - 1)));
gimplify_and_add (t, pre_p);
t = fold_convert (sizetype, valist_tmp);
--- 4236,4242 ----
&& !integer_zerop (TYPE_SIZE (type)))
{
t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
! fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
gimplify_and_add (t, pre_p);
t = fold_convert (sizetype, valist_tmp);
*************** std_gimplify_va_arg_expr (tree valist, t
*** 4277,4288 ****
rounded_size, size_int (align));
t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
size_binop (MINUS_EXPR, rounded_size, type_size));
! addr = fold_build2 (POINTER_PLUS_EXPR,
! TREE_TYPE (addr), addr, t);
}
/* Compute new value for AP. */
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (valist), valist_tmp, rounded_size);
t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
gimplify_and_add (t, pre_p);
--- 4275,4285 ----
rounded_size, size_int (align));
t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
size_binop (MINUS_EXPR, rounded_size, type_size));
! addr = fold_build_pointer_plus (addr, t);
}
/* Compute new value for AP. */
! t = fold_build_pointer_plus (valist_tmp, rounded_size);
t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
gimplify_and_add (t, pre_p);
*************** fold_builtin_memory_op (location_t loc,
*** 8222,8229 ****
len = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (len), len,
ssize_int (1));
! len = fold_convert_loc (loc, sizetype, len);
! dest = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
dest = fold_convert_loc (loc, type, dest);
if (expr)
dest = omit_one_operand_loc (loc, type, dest, expr);
--- 8219,8225 ----
len = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (len), len,
ssize_int (1));
! dest = fold_build_pointer_plus_loc (loc, dest, len);
dest = fold_convert_loc (loc, type, dest);
if (expr)
dest = omit_one_operand_loc (loc, type, dest, expr);
*************** fold_builtin_stpcpy (location_t loc, tre
*** 8299,8306 ****
call = build_call_expr_loc (loc, fn, 3, dest, src, lenp1);
type = TREE_TYPE (TREE_TYPE (fndecl));
! len = fold_convert_loc (loc, sizetype, len);
! dest = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
dest = fold_convert_loc (loc, type, dest);
dest = omit_one_operand_loc (loc, type, dest, call);
return dest;
--- 8295,8301 ----
call = build_call_expr_loc (loc, fn, 3, dest, src, lenp1);
type = TREE_TYPE (TREE_TYPE (fndecl));
! dest = fold_build_pointer_plus_loc (loc, dest, len);
dest = fold_convert_loc (loc, type, dest);
dest = omit_one_operand_loc (loc, type, dest, call);
return dest;
*************** fold_builtin_memchr (location_t loc, tre
*** 8387,8394 ****
if (r == NULL)
return build_int_cst (TREE_TYPE (arg1), 0);
! tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (arg1), arg1,
! size_int (r - p1));
return fold_convert_loc (loc, type, tem);
}
return NULL_TREE;
--- 8382,8388 ----
if (r == NULL)
return build_int_cst (TREE_TYPE (arg1), 0);
! tem = fold_build_pointer_plus_hwi_loc (loc, arg1, r - p1);
return fold_convert_loc (loc, type, tem);
}
return NULL_TREE;
*************** fold_builtin_strstr (location_t loc, tre
*** 10775,10782 ****
return build_int_cst (TREE_TYPE (s1), 0);
/* Return an offset into the constant string argument. */
! tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
! s1, size_int (r - p1));
return fold_convert_loc (loc, type, tem);
}
--- 10769,10775 ----
return build_int_cst (TREE_TYPE (s1), 0);
/* Return an offset into the constant string argument. */
! tem = fold_build_pointer_plus_hwi_loc (loc, s1, r - p1);
return fold_convert_loc (loc, type, tem);
}
*************** fold_builtin_strchr (location_t loc, tre
*** 10846,10853 ****
return build_int_cst (TREE_TYPE (s1), 0);
/* Return an offset into the constant string argument. */
! tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
! s1, size_int (r - p1));
return fold_convert_loc (loc, type, tem);
}
return NULL_TREE;
--- 10839,10845 ----
return build_int_cst (TREE_TYPE (s1), 0);
/* Return an offset into the constant string argument. */
! tem = fold_build_pointer_plus_hwi_loc (loc, s1, r - p1);
return fold_convert_loc (loc, type, tem);
}
return NULL_TREE;
*************** fold_builtin_strrchr (location_t loc, tr
*** 10902,10909 ****
return build_int_cst (TREE_TYPE (s1), 0);
/* Return an offset into the constant string argument. */
! tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
! s1, size_int (r - p1));
return fold_convert_loc (loc, type, tem);
}
--- 10894,10900 ----
return build_int_cst (TREE_TYPE (s1), 0);
/* Return an offset into the constant string argument. */
! tem = fold_build_pointer_plus_hwi_loc (loc, s1, r - p1);
return fold_convert_loc (loc, type, tem);
}
*************** fold_builtin_strpbrk (location_t loc, tr
*** 10962,10969 ****
return build_int_cst (TREE_TYPE (s1), 0);
/* Return an offset into the constant string argument. */
! tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
! s1, size_int (r - p1));
return fold_convert_loc (loc, type, tem);
}
--- 10953,10959 ----
return build_int_cst (TREE_TYPE (s1), 0);
/* Return an offset into the constant string argument. */
! tem = fold_build_pointer_plus_hwi_loc (loc, s1, r - p1);
return fold_convert_loc (loc, type, tem);
}
*************** fold_builtin_strcat (location_t loc ATTR
*** 11047,11054 ****
newdst = build_call_expr_loc (loc, strlen_fn, 1, dst);
/* Create (dst p+ strlen (dst)). */
! newdst = fold_build2_loc (loc, POINTER_PLUS_EXPR,
! TREE_TYPE (dst), dst, newdst);
newdst = builtin_save_expr (newdst);
call = build_call_expr_loc (loc, strcpy_fn, 2, newdst, src);
--- 11037,11043 ----
newdst = build_call_expr_loc (loc, strlen_fn, 1, dst);
/* Create (dst p+ strlen (dst)). */
! newdst = fold_build_pointer_plus_loc (loc, dst, newdst);
newdst = builtin_save_expr (newdst);
call = build_call_expr_loc (loc, strcpy_fn, 2, newdst, src);
*************** expand_builtin_memory_chk (tree exp, rtx
*** 11721,11727 ****
return expand_expr (dest, target, mode, EXPAND_NORMAL);
}
! expr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
return expand_expr (expr, target, mode, EXPAND_NORMAL);
}
--- 11710,11716 ----
return expand_expr (dest, target, mode, EXPAND_NORMAL);
}
! expr = fold_build_pointer_plus (dest, len);
return expand_expr (expr, target, mode, EXPAND_NORMAL);
}
*************** fold_builtin_memory_chk (location_t loc,
*** 11981,11988 ****
dest, len);
else
{
! tree temp = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest),
! dest, len);
return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), temp);
}
}
--- 11970,11976 ----
dest, len);
else
{
! tree temp = fold_build_pointer_plus_loc (loc, dest, len);
return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), temp);
}
}
Index: trunk/gcc/c-typeck.c
===================================================================
*** trunk.orig/gcc/c-typeck.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/c-typeck.c 2011-07-11 17:13:24.000000000 +0200
*************** build_unary_op (location_t location,
*** 3789,3799 ****
if (val && TREE_CODE (val) == INDIRECT_REF
&& TREE_CONSTANT (TREE_OPERAND (val, 0)))
{
! tree op0 = fold_convert_loc (location, sizetype,
! fold_offsetof (arg, val)), op1;
op1 = fold_convert_loc (location, argtype, TREE_OPERAND (val, 0));
! ret = fold_build2_loc (location, POINTER_PLUS_EXPR, argtype, op1, op0);
goto return_build_unary_op;
}
--- 3789,3798 ----
if (val && TREE_CODE (val) == INDIRECT_REF
&& TREE_CONSTANT (TREE_OPERAND (val, 0)))
{
! tree op0 = fold_offsetof (arg, val), op1;
op1 = fold_convert_loc (location, argtype, TREE_OPERAND (val, 0));
! ret = fold_build_pointer_plus_loc (location, op1, op0);
goto return_build_unary_op;
}
Index: trunk/gcc/cgraphunit.c
===================================================================
*** trunk.orig/gcc/cgraphunit.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/cgraphunit.c 2011-07-11 17:13:24.000000000 +0200
*************** thunk_adjust (gimple_stmt_iterator * bsi
*** 1458,1468 ****
if (this_adjusting
&& fixed_offset != 0)
{
! stmt = gimple_build_assign (ptr,
! fold_build2_loc (input_location,
! POINTER_PLUS_EXPR,
! TREE_TYPE (ptr), ptr,
! size_int (fixed_offset)));
gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
}
--- 1458,1467 ----
if (this_adjusting
&& fixed_offset != 0)
{
! stmt = gimple_build_assign
! (ptr, fold_build_pointer_plus_hwi_loc (input_location,
! ptr,
! fixed_offset));
gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
}
*************** thunk_adjust (gimple_stmt_iterator * bsi
*** 1508,1519 ****
/* Find the entry with the vcall offset. */
stmt = gimple_build_assign (vtabletmp2,
! fold_build2_loc (input_location,
! POINTER_PLUS_EXPR,
! TREE_TYPE (vtabletmp2),
! vtabletmp2,
! fold_convert (sizetype,
! virtual_offset)));
gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
/* Get the offset itself. */
--- 1507,1515 ----
/* Find the entry with the vcall offset. */
stmt = gimple_build_assign (vtabletmp2,
! fold_build_pointer_plus_loc (input_location,
! vtabletmp2,
! virtual_offset));
gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
/* Get the offset itself. */
*************** thunk_adjust (gimple_stmt_iterator * bsi
*** 1533,1541 ****
find_referenced_vars_in (stmt);
/* Adjust the `this' pointer. */
! ptr = fold_build2_loc (input_location,
! POINTER_PLUS_EXPR, TREE_TYPE (ptr), ptr,
! offsettmp);
}
if (!this_adjusting
--- 1529,1535 ----
find_referenced_vars_in (stmt);
/* Adjust the `this' pointer. */
! ptr = fold_build_pointer_plus_loc (input_location, ptr, offsettmp);
}
if (!this_adjusting
*************** thunk_adjust (gimple_stmt_iterator * bsi
*** 1554,1562 ****
mark_symbols_for_renaming (stmt);
find_referenced_vars_in (stmt);
}
! ptr = fold_build2_loc (input_location,
! POINTER_PLUS_EXPR, TREE_TYPE (ptrtmp), ptrtmp,
! size_int (fixed_offset));
}
/* Emit the statement and gimplify the adjustment expression. */
--- 1548,1555 ----
mark_symbols_for_renaming (stmt);
find_referenced_vars_in (stmt);
}
! ptr = fold_build_pointer_plus_hwi_loc (input_location,
! ptrtmp, fixed_offset);
}
/* Emit the statement and gimplify the adjustment expression. */
Index: trunk/gcc/fold-const.c
===================================================================
*** trunk.orig/gcc/fold-const.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/fold-const.c 2011-07-11 17:13:24.000000000 +0200
*************** build_range_check (location_t loc, tree
*** 4221,4228 ****
low = fold_convert_loc (loc, sizetype, low);
low = fold_build1_loc (loc, NEGATE_EXPR, sizetype, low);
return build_range_check (loc, type,
! fold_build2_loc (loc, POINTER_PLUS_EXPR,
! etype, exp, low),
1, build_int_cst (etype, 0), value);
}
return 0;
--- 4221,4227 ----
low = fold_convert_loc (loc, sizetype, low);
low = fold_build1_loc (loc, NEGATE_EXPR, sizetype, low);
return build_range_check (loc, type,
! fold_build_pointer_plus_loc (loc, exp, low),
1, build_int_cst (etype, 0), value);
}
return 0;
*************** fold_binary_loc (location_t loc,
*** 9584,9592 ****
inner = fold_build2_loc (loc, PLUS_EXPR, sizetype,
arg01, fold_convert_loc (loc, sizetype, arg1));
return fold_convert_loc (loc, type,
! fold_build2_loc (loc, POINTER_PLUS_EXPR,
! TREE_TYPE (arg00),
! arg00, inner));
}
/* PTR_CST +p CST -> CST1 */
--- 9583,9590 ----
inner = fold_build2_loc (loc, PLUS_EXPR, sizetype,
arg01, fold_convert_loc (loc, sizetype, arg1));
return fold_convert_loc (loc, type,
! fold_build_pointer_plus_loc (loc,
! arg00, inner));
}
/* PTR_CST +p CST -> CST1 */
Index: trunk/gcc/omp-low.c
===================================================================
*** trunk.orig/gcc/omp-low.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/omp-low.c 2011-07-11 17:13:24.000000000 +0200
*************** extract_omp_for_data (gimple for_stmt, s
*** 310,318 ****
break;
case LE_EXPR:
if (POINTER_TYPE_P (TREE_TYPE (loop->n2)))
! loop->n2 = fold_build2_loc (loc,
! POINTER_PLUS_EXPR, TREE_TYPE (loop->n2),
! loop->n2, size_one_node);
else
loop->n2 = fold_build2_loc (loc,
PLUS_EXPR, TREE_TYPE (loop->n2), loop->n2,
--- 310,316 ----
break;
case LE_EXPR:
if (POINTER_TYPE_P (TREE_TYPE (loop->n2)))
! loop->n2 = fold_build_pointer_plus_hwi_loc (loc, loop->n2, 1);
else
loop->n2 = fold_build2_loc (loc,
PLUS_EXPR, TREE_TYPE (loop->n2), loop->n2,
*************** extract_omp_for_data (gimple for_stmt, s
*** 321,329 ****
break;
case GE_EXPR:
if (POINTER_TYPE_P (TREE_TYPE (loop->n2)))
! loop->n2 = fold_build2_loc (loc,
! POINTER_PLUS_EXPR, TREE_TYPE (loop->n2),
! loop->n2, size_int (-1));
else
loop->n2 = fold_build2_loc (loc,
MINUS_EXPR, TREE_TYPE (loop->n2), loop->n2,
--- 319,325 ----
break;
case GE_EXPR:
if (POINTER_TYPE_P (TREE_TYPE (loop->n2)))
! loop->n2 = fold_build_pointer_plus_hwi_loc (loc, loop->n2, -1);
else
loop->n2 = fold_build2_loc (loc,
MINUS_EXPR, TREE_TYPE (loop->n2), loop->n2,
*************** expand_omp_for_generic (struct omp_regio
*** 3914,3921 ****
t = fold_build2 (MULT_EXPR, itype, t,
fold_convert (itype, fd->loops[i].step));
if (POINTER_TYPE_P (vtype))
! t = fold_build2 (POINTER_PLUS_EXPR, vtype,
! fd->loops[i].n1, fold_convert (sizetype, t));
else
t = fold_build2 (PLUS_EXPR, itype, fd->loops[i].n1, t);
t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
--- 3910,3916 ----
t = fold_build2 (MULT_EXPR, itype, t,
fold_convert (itype, fd->loops[i].step));
if (POINTER_TYPE_P (vtype))
! t = fold_build_pointer_plus (fd->loops[i].n1, t);
else
t = fold_build2 (PLUS_EXPR, itype, fd->loops[i].n1, t);
t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
*************** expand_omp_for_generic (struct omp_regio
*** 3944,3951 ****
vback = gimple_omp_continue_control_def (stmt);
if (POINTER_TYPE_P (type))
! t = fold_build2 (POINTER_PLUS_EXPR, type, vmain,
! fold_convert (sizetype, fd->loop.step));
else
t = fold_build2 (PLUS_EXPR, type, vmain, fd->loop.step);
t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
--- 3939,3945 ----
vback = gimple_omp_continue_control_def (stmt);
if (POINTER_TYPE_P (type))
! t = fold_build_pointer_plus (vmain, fd->loop.step);
else
t = fold_build2 (PLUS_EXPR, type, vmain, fd->loop.step);
t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
*************** expand_omp_for_generic (struct omp_regio
*** 3989,3997 ****
set_immediate_dominator (CDI_DOMINATORS, bb, last_bb);
if (POINTER_TYPE_P (vtype))
! t = fold_build2 (POINTER_PLUS_EXPR, vtype,
! fd->loops[i].v,
! fold_convert (sizetype, fd->loops[i].step));
else
t = fold_build2 (PLUS_EXPR, vtype, fd->loops[i].v,
fd->loops[i].step);
--- 3983,3989 ----
set_immediate_dominator (CDI_DOMINATORS, bb, last_bb);
if (POINTER_TYPE_P (vtype))
! t = fold_build_pointer_plus (fd->loops[i].v, fd->loops[i].step);
else
t = fold_build2 (PLUS_EXPR, vtype, fd->loops[i].v,
fd->loops[i].step);
*************** expand_omp_for_static_nochunk (struct om
*** 4239,4246 ****
t = fold_convert (itype, s0);
t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
if (POINTER_TYPE_P (type))
! t = fold_build2 (POINTER_PLUS_EXPR, type, fd->loop.n1,
! fold_convert (sizetype, t));
else
t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
--- 4231,4237 ----
t = fold_convert (itype, s0);
t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
if (POINTER_TYPE_P (type))
! t = fold_build_pointer_plus (fd->loop.n1, t);
else
t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
*************** expand_omp_for_static_nochunk (struct om
*** 4251,4258 ****
t = fold_convert (itype, e0);
t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
if (POINTER_TYPE_P (type))
! t = fold_build2 (POINTER_PLUS_EXPR, type, fd->loop.n1,
! fold_convert (sizetype, t));
else
t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
e = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE,
--- 4242,4248 ----
t = fold_convert (itype, e0);
t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
if (POINTER_TYPE_P (type))
! t = fold_build_pointer_plus (fd->loop.n1, t);
else
t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
e = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE,
*************** expand_omp_for_static_nochunk (struct om
*** 4267,4274 ****
vback = gimple_omp_continue_control_def (stmt);
if (POINTER_TYPE_P (type))
! t = fold_build2 (POINTER_PLUS_EXPR, type, vmain,
! fold_convert (sizetype, fd->loop.step));
else
t = fold_build2 (PLUS_EXPR, type, vmain, fd->loop.step);
t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
--- 4257,4263 ----
vback = gimple_omp_continue_control_def (stmt);
if (POINTER_TYPE_P (type))
! t = fold_build_pointer_plus (vmain, fd->loop.step);
else
t = fold_build2 (PLUS_EXPR, type, vmain, fd->loop.step);
t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
*************** expand_omp_for_static_chunk (struct omp_
*** 4442,4449 ****
t = fold_build2 (MULT_EXPR, itype, threadid, fd->chunk_size);
t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
if (POINTER_TYPE_P (type))
! t = fold_build2 (POINTER_PLUS_EXPR, type, fd->loop.n1,
! fold_convert (sizetype, t));
else
t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
v_extra = force_gimple_operand_gsi (&si, t, true, NULL_TREE,
--- 4431,4437 ----
t = fold_build2 (MULT_EXPR, itype, threadid, fd->chunk_size);
t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
if (POINTER_TYPE_P (type))
! t = fold_build_pointer_plus (fd->loop.n1, t);
else
t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
v_extra = force_gimple_operand_gsi (&si, t, true, NULL_TREE,
*************** expand_omp_for_static_chunk (struct omp_
*** 4475,4482 ****
t = fold_convert (itype, s0);
t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
if (POINTER_TYPE_P (type))
! t = fold_build2 (POINTER_PLUS_EXPR, type, fd->loop.n1,
! fold_convert (sizetype, t));
else
t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
t = force_gimple_operand_gsi (&si, t, false, NULL_TREE,
--- 4463,4469 ----
t = fold_convert (itype, s0);
t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
if (POINTER_TYPE_P (type))
! t = fold_build_pointer_plus (fd->loop.n1, t);
else
t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
t = force_gimple_operand_gsi (&si, t, false, NULL_TREE,
*************** expand_omp_for_static_chunk (struct omp_
*** 4487,4494 ****
t = fold_convert (itype, e0);
t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
if (POINTER_TYPE_P (type))
! t = fold_build2 (POINTER_PLUS_EXPR, type, fd->loop.n1,
! fold_convert (sizetype, t));
else
t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
e = force_gimple_operand_gsi (&si, t, true, NULL_TREE,
--- 4474,4480 ----
t = fold_convert (itype, e0);
t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
if (POINTER_TYPE_P (type))
! t = fold_build_pointer_plus (fd->loop.n1, t);
else
t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
e = force_gimple_operand_gsi (&si, t, true, NULL_TREE,
*************** expand_omp_for_static_chunk (struct omp_
*** 4503,4510 ****
v_back = gimple_omp_continue_control_def (stmt);
if (POINTER_TYPE_P (type))
! t = fold_build2 (POINTER_PLUS_EXPR, type, v_main,
! fold_convert (sizetype, fd->loop.step));
else
t = fold_build2 (PLUS_EXPR, type, v_main, fd->loop.step);
stmt = gimple_build_assign (v_back, t);
--- 4489,4495 ----
v_back = gimple_omp_continue_control_def (stmt);
if (POINTER_TYPE_P (type))
! t = fold_build_pointer_plus (v_main, fd->loop.step);
else
t = fold_build2 (PLUS_EXPR, type, v_main, fd->loop.step);
stmt = gimple_build_assign (v_back, t);
Index: trunk/gcc/tree-affine.c
===================================================================
*** trunk.orig/gcc/tree-affine.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/tree-affine.c 2011-07-11 17:13:24.000000000 +0200
*************** add_elt_to_tree (tree expr, tree type, t
*** 387,393 ****
return fold_convert (type, elt);
if (POINTER_TYPE_P (type))
! return fold_build2 (POINTER_PLUS_EXPR, type, expr, elt);
return fold_build2 (PLUS_EXPR, type, expr, elt);
}
--- 387,393 ----
return fold_convert (type, elt);
if (POINTER_TYPE_P (type))
! return fold_build_pointer_plus (expr, elt);
return fold_build2 (PLUS_EXPR, type, expr, elt);
}
*************** add_elt_to_tree (tree expr, tree type, t
*** 399,405 ****
if (POINTER_TYPE_P (type))
{
elt = fold_build1 (NEGATE_EXPR, type1, elt);
! return fold_build2 (POINTER_PLUS_EXPR, type, expr, elt);
}
return fold_build2 (MINUS_EXPR, type, expr, elt);
}
--- 399,405 ----
if (POINTER_TYPE_P (type))
{
elt = fold_build1 (NEGATE_EXPR, type1, elt);
! return fold_build_pointer_plus (expr, elt);
}
return fold_build2 (MINUS_EXPR, type, expr, elt);
}
*************** add_elt_to_tree (tree expr, tree type, t
*** 423,429 ****
{
if (code == MINUS_EXPR)
elt = fold_build1 (NEGATE_EXPR, type1, elt);
! return fold_build2 (POINTER_PLUS_EXPR, type, expr, elt);
}
return fold_build2 (code, type, expr, elt);
}
--- 423,429 ----
{
if (code == MINUS_EXPR)
elt = fold_build1 (NEGATE_EXPR, type1, elt);
! return fold_build_pointer_plus (expr, elt);
}
return fold_build2 (code, type, expr, elt);
}
Index: trunk/gcc/tree-data-ref.c
===================================================================
*** trunk.orig/gcc/tree-data-ref.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/tree-data-ref.c 2011-07-11 17:13:24.000000000 +0200
*************** split_constant_offset_1 (tree type, tree
*** 604,611 ****
split_constant_offset (poffset, &poffset, &off1);
off0 = size_binop (PLUS_EXPR, off0, off1);
if (POINTER_TYPE_P (TREE_TYPE (base)))
! base = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (base),
! base, fold_convert (sizetype, poffset));
else
base = fold_build2 (PLUS_EXPR, TREE_TYPE (base), base,
fold_convert (TREE_TYPE (base), poffset));
--- 604,610 ----
split_constant_offset (poffset, &poffset, &off1);
off0 = size_binop (PLUS_EXPR, off0, off1);
if (POINTER_TYPE_P (TREE_TYPE (base)))
! base = fold_build_pointer_plus (base, poffset);
else
base = fold_build2 (PLUS_EXPR, TREE_TYPE (base), base,
fold_convert (TREE_TYPE (base), poffset));
Index: trunk/gcc/tree-loop-distribution.c
===================================================================
*** trunk.orig/gcc/tree-loop-distribution.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/tree-loop-distribution.c 2011-07-11 17:13:24.000000000 +0200
*************** generate_memset_zero (gimple stmt, tree
*** 285,293 ****
TYPE_SIZE_UNIT (TREE_TYPE (op0)));
}
! addr_base = fold_build2_loc (loc, POINTER_PLUS_EXPR,
! TREE_TYPE (DR_BASE_ADDRESS (dr)),
! DR_BASE_ADDRESS (dr), addr_base);
mem = force_gimple_operand (addr_base, &stmts, true, NULL);
gimple_seq_add_seq (&stmt_list, stmts);
--- 285,292 ----
TYPE_SIZE_UNIT (TREE_TYPE (op0)));
}
! addr_base = fold_build_pointer_plus_loc (loc,
! DR_BASE_ADDRESS (dr), addr_base);
mem = force_gimple_operand (addr_base, &stmts, true, NULL);
gimple_seq_add_seq (&stmt_list, stmts);
Index: trunk/gcc/tree-mudflap.c
===================================================================
*** trunk.orig/gcc/tree-mudflap.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/tree-mudflap.c 2011-07-11 17:13:24.000000000 +0200
*************** mf_xform_derefs_1 (gimple_stmt_iterator
*** 843,851 ****
elt = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (elt)),
elt);
addr = fold_convert_loc (location, ptr_type_node, elt ? elt : base);
! addr = fold_build2_loc (location, POINTER_PLUS_EXPR, ptr_type_node,
! addr, fold_convert_loc (location, sizetype,
! byte_position (field)));
}
else
addr = build1 (ADDR_EXPR, build_pointer_type (type), t);
--- 843,850 ----
elt = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (elt)),
elt);
addr = fold_convert_loc (location, ptr_type_node, elt ? elt : base);
! addr = fold_build_pointer_plus_loc (location,
! addr, byte_position (field));
}
else
addr = build1 (ADDR_EXPR, build_pointer_type (type), t);
*************** mf_xform_derefs_1 (gimple_stmt_iterator
*** 861,893 ****
case INDIRECT_REF:
addr = TREE_OPERAND (t, 0);
base = addr;
! limit = fold_build2_loc (location, POINTER_PLUS_EXPR, ptr_type_node,
! fold_build2_loc (location,
! POINTER_PLUS_EXPR, ptr_type_node, base,
! size),
! size_int (-1));
break;
case MEM_REF:
! addr = build2 (POINTER_PLUS_EXPR, TREE_TYPE (TREE_OPERAND (t, 1)),
! TREE_OPERAND (t, 0),
! fold_convert (sizetype, TREE_OPERAND (t, 1)));
base = addr;
! limit = fold_build2_loc (location, POINTER_PLUS_EXPR, ptr_type_node,
! fold_build2_loc (location,
! POINTER_PLUS_EXPR, ptr_type_node, base,
! size),
! size_int (-1));
break;
case TARGET_MEM_REF:
addr = tree_mem_ref_addr (ptr_type_node, t);
base = addr;
! limit = fold_build2_loc (location, POINTER_PLUS_EXPR, ptr_type_node,
! fold_build2_loc (location,
! POINTER_PLUS_EXPR, ptr_type_node, base,
! size),
! size_int (-1));
break;
case ARRAY_RANGE_REF:
--- 860,883 ----
case INDIRECT_REF:
addr = TREE_OPERAND (t, 0);
base = addr;
! limit = fold_build_pointer_plus_hwi_loc
! (location, fold_build_pointer_plus_loc (location, base, size), -1);
break;
case MEM_REF:
! addr = fold_build_pointer_plus (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1));
base = addr;
! limit = fold_build_pointer_plus_hwi_loc (location,
! fold_build_pointer_plus_loc (location,
! base, size), -1);
break;
case TARGET_MEM_REF:
addr = tree_mem_ref_addr (ptr_type_node, t);
base = addr;
! limit = fold_build_pointer_plus_hwi_loc (location,
! fold_build_pointer_plus_loc (location,
! base, size), -1);
break;
case ARRAY_RANGE_REF:
*************** mf_xform_derefs_1 (gimple_stmt_iterator
*** 920,934 ****
addr = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
addr = convert (ptr_type_node, addr);
! addr = fold_build2_loc (location, POINTER_PLUS_EXPR,
! ptr_type_node, addr, ofs);
base = addr;
! limit = fold_build2_loc (location, POINTER_PLUS_EXPR, ptr_type_node,
! fold_build2_loc (location,
! POINTER_PLUS_EXPR, ptr_type_node,
! base, size),
! size_int (-1));
}
break;
--- 910,921 ----
addr = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
addr = convert (ptr_type_node, addr);
! addr = fold_build_pointer_plus_loc (location, addr, ofs);
base = addr;
! limit = fold_build_pointer_plus_hwi_loc (location,
! fold_build_pointer_plus_loc (location,
! base, size), -1);
}
break;
Index: trunk/gcc/tree-predcom.c
===================================================================
*** trunk.orig/gcc/tree-predcom.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/tree-predcom.c 2011-07-11 17:13:24.000000000 +0200
*************** ref_at_iteration (struct loop *loop, tre
*** 1396,1402 ****
{
val = fold_build2 (MULT_EXPR, sizetype, iv.step,
size_int (iter));
! val = fold_build2 (POINTER_PLUS_EXPR, type, iv.base, val);
}
else
{
--- 1396,1402 ----
{
val = fold_build2 (MULT_EXPR, sizetype, iv.step,
size_int (iter));
! val = fold_build_pointer_plus (iv.base, val);
}
else
{
Index: trunk/gcc/tree-ssa-address.c
===================================================================
*** trunk.orig/gcc/tree-ssa-address.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/tree-ssa-address.c 2011-07-11 17:23:28.000000000 +0200
*************** tree_mem_ref_addr (tree type, tree mem_r
*** 302,308 ****
}
if (addr_off)
! addr = fold_build2 (POINTER_PLUS_EXPR, type, addr_base, addr_off);
else
addr = addr_base;
--- 302,308 ----
}
if (addr_off)
! addr = fold_build_pointer_plus (addr_base, addr_off);
else
addr = addr_base;
*************** add_to_parts (struct mem_address *parts,
*** 521,529 ****
/* Add ELT to base. */
type = TREE_TYPE (parts->base);
if (POINTER_TYPE_P (type))
! parts->base = fold_build2 (POINTER_PLUS_EXPR, type,
! parts->base,
! fold_convert (sizetype, elt));
else
parts->base = fold_build2 (PLUS_EXPR, type,
parts->base, elt);
--- 521,527 ----
/* Add ELT to base. */
type = TREE_TYPE (parts->base);
if (POINTER_TYPE_P (type))
! parts->base = fold_build_pointer_plus (parts->base, elt);
else
parts->base = fold_build2 (PLUS_EXPR, type,
parts->base, elt);
*************** create_mem_ref (gimple_stmt_iterator *gs
*** 692,698 ****
tree alias_ptr_type, tree iv_cand, tree base_hint, bool speed)
{
tree mem_ref, tmp;
- tree atype;
struct mem_address parts;
addr_to_parts (type, addr, iv_cand, base_hint, &parts, speed);
--- 690,695 ----
*************** create_mem_ref (gimple_stmt_iterator *gs
*** 731,741 ****
if (parts.index)
{
- atype = TREE_TYPE (tmp);
parts.base = force_gimple_operand_gsi_1 (gsi,
! fold_build2 (POINTER_PLUS_EXPR, atype,
! tmp,
! fold_convert (sizetype, parts.base)),
is_gimple_mem_ref_addr, NULL_TREE, true, GSI_SAME_STMT);
}
else
--- 728,735 ----
if (parts.index)
{
parts.base = force_gimple_operand_gsi_1 (gsi,
! fold_build_pointer_plus (tmp, parts.base),
is_gimple_mem_ref_addr, NULL_TREE, true, GSI_SAME_STMT);
}
else
*************** create_mem_ref (gimple_stmt_iterator *gs
*** 758,768 ****
/* Add index to base. */
if (parts.base)
{
- atype = TREE_TYPE (parts.base);
parts.base = force_gimple_operand_gsi_1 (gsi,
! fold_build2 (POINTER_PLUS_EXPR, atype,
! parts.base,
! parts.index),
is_gimple_mem_ref_addr, NULL_TREE, true, GSI_SAME_STMT);
}
else
--- 752,759 ----
/* Add index to base. */
if (parts.base)
{
parts.base = force_gimple_operand_gsi_1 (gsi,
! fold_build_pointer_plus (parts.base, parts.index),
is_gimple_mem_ref_addr, NULL_TREE, true, GSI_SAME_STMT);
}
else
*************** create_mem_ref (gimple_stmt_iterator *gs
*** 779,789 ****
/* Try adding offset to base. */
if (parts.base)
{
- atype = TREE_TYPE (parts.base);
parts.base = force_gimple_operand_gsi_1 (gsi,
! fold_build2 (POINTER_PLUS_EXPR, atype,
! parts.base,
! fold_convert (sizetype, parts.offset)),
is_gimple_mem_ref_addr, NULL_TREE, true, GSI_SAME_STMT);
}
else
--- 770,777 ----
/* Try adding offset to base. */
if (parts.base)
{
parts.base = force_gimple_operand_gsi_1 (gsi,
! fold_build_pointer_plus (parts.base, parts.offset),
is_gimple_mem_ref_addr, NULL_TREE, true, GSI_SAME_STMT);
}
else
Index: trunk/gcc/tree-ssa-loop-ivopts.c
===================================================================
*** trunk.orig/gcc/tree-ssa-loop-ivopts.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/tree-ssa-loop-ivopts.c 2011-07-11 17:13:24.000000000 +0200
*************** force_expr_to_var_cost (tree expr, bool
*** 3586,3594 ****
symbol_cost[i] = computation_cost (addr, i) + 1;
address_cost[i]
! = computation_cost (build2 (POINTER_PLUS_EXPR, type,
! addr,
! build_int_cst (sizetype, 2000)), i) + 1;
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "force_expr_to_var_cost %s costs:\n", i ? "speed" : "size");
--- 3586,3592 ----
symbol_cost[i] = computation_cost (addr, i) + 1;
address_cost[i]
! = computation_cost (fold_build_pointer_plus_hwi (addr, 2000), i) + 1;
if (dump_file && (dump_flags & TDF_DETAILS))
{
fprintf (dump_file, "force_expr_to_var_cost %s costs:\n", i ? "speed" : "size");
Index: trunk/gcc/tree-ssa-loop-niter.c
===================================================================
*** trunk.orig/gcc/tree-ssa-loop-niter.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/tree-ssa-loop-niter.c 2011-07-11 17:13:24.000000000 +0200
*************** number_of_iterations_lt_to_ne (tree type
*** 762,769 ****
else if (POINTER_TYPE_P (type))
noloop = fold_build2 (GT_EXPR, boolean_type_node,
iv0->base,
! fold_build2 (POINTER_PLUS_EXPR, type,
! iv1->base, tmod));
else
noloop = fold_build2 (GT_EXPR, boolean_type_node,
iv0->base,
--- 762,768 ----
else if (POINTER_TYPE_P (type))
noloop = fold_build2 (GT_EXPR, boolean_type_node,
iv0->base,
! fold_build_pointer_plus (iv1->base, tmod));
else
noloop = fold_build2 (GT_EXPR, boolean_type_node,
iv0->base,
*************** number_of_iterations_lt_to_ne (tree type
*** 788,797 ****
noloop = boolean_false_node;
else if (POINTER_TYPE_P (type))
noloop = fold_build2 (GT_EXPR, boolean_type_node,
! fold_build2 (POINTER_PLUS_EXPR, type,
! iv0->base,
! fold_build1 (NEGATE_EXPR,
! type1, tmod)),
iv1->base);
else
noloop = fold_build2 (GT_EXPR, boolean_type_node,
--- 787,795 ----
noloop = boolean_false_node;
else if (POINTER_TYPE_P (type))
noloop = fold_build2 (GT_EXPR, boolean_type_node,
! fold_build_pointer_plus (iv0->base,
! fold_build1 (NEGATE_EXPR,
! type1, tmod)),
iv1->base);
else
noloop = fold_build2 (GT_EXPR, boolean_type_node,
*************** number_of_iterations_le (tree type, affi
*** 1166,1181 ****
if (integer_nonzerop (iv0->step))
{
if (POINTER_TYPE_P (type))
! iv1->base = fold_build2 (POINTER_PLUS_EXPR, type, iv1->base,
! build_int_cst (type1, 1));
else
iv1->base = fold_build2 (PLUS_EXPR, type1, iv1->base,
build_int_cst (type1, 1));
}
else if (POINTER_TYPE_P (type))
! iv0->base = fold_build2 (POINTER_PLUS_EXPR, type, iv0->base,
! fold_build1 (NEGATE_EXPR, type1,
! build_int_cst (type1, 1)));
else
iv0->base = fold_build2 (MINUS_EXPR, type1,
iv0->base, build_int_cst (type1, 1));
--- 1164,1176 ----
if (integer_nonzerop (iv0->step))
{
if (POINTER_TYPE_P (type))
! iv1->base = fold_build_pointer_plus_hwi (iv1->base, 1);
else
iv1->base = fold_build2 (PLUS_EXPR, type1, iv1->base,
build_int_cst (type1, 1));
}
else if (POINTER_TYPE_P (type))
! iv0->base = fold_build_pointer_plus_hwi (iv0->base, -1);
else
iv0->base = fold_build2 (MINUS_EXPR, type1,
iv0->base, build_int_cst (type1, 1));
Index: trunk/gcc/tree-ssa-loop-prefetch.c
===================================================================
*** trunk.orig/gcc/tree-ssa-loop-prefetch.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/tree-ssa-loop-prefetch.c 2011-07-11 17:13:24.000000000 +0200
*************** issue_prefetch_ref (struct mem_ref *ref,
*** 1100,1107 ****
/* Determine the address to prefetch. */
delta = (ahead + ap * ref->prefetch_mod) *
int_cst_value (ref->group->step);
! addr = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node,
! addr_base, size_int (delta));
addr = force_gimple_operand_gsi (&bsi, unshare_expr (addr), true, NULL,
true, GSI_SAME_STMT);
}
--- 1100,1106 ----
/* Determine the address to prefetch. */
delta = (ahead + ap * ref->prefetch_mod) *
int_cst_value (ref->group->step);
! addr = fold_build_pointer_plus_hwi (addr_base, delta);
addr = force_gimple_operand_gsi (&bsi, unshare_expr (addr), true, NULL,
true, GSI_SAME_STMT);
}
*************** issue_prefetch_ref (struct mem_ref *ref,
*** 1112,1119 ****
forward = fold_build2 (MULT_EXPR, sizetype,
fold_convert (sizetype, ref->group->step),
fold_convert (sizetype, size_int (ahead)));
! addr = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, addr_base,
! forward);
addr = force_gimple_operand_gsi (&bsi, unshare_expr (addr), true,
NULL, true, GSI_SAME_STMT);
}
--- 1111,1117 ----
forward = fold_build2 (MULT_EXPR, sizetype,
fold_convert (sizetype, ref->group->step),
fold_convert (sizetype, size_int (ahead)));
! addr = fold_build_pointer_plus (addr_base, forward);
addr = force_gimple_operand_gsi (&bsi, unshare_expr (addr), true,
NULL, true, GSI_SAME_STMT);
}
Index: trunk/gcc/tree-vect-data-refs.c
===================================================================
*** trunk.orig/gcc/tree-vect-data-refs.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/tree-vect-data-refs.c 2011-07-11 17:13:24.000000000 +0200
*************** vect_analyze_data_refs (loop_vec_info lo
*** 2645,2653 ****
inner-loop: *(BASE+INIT). (The first location is actually
BASE+INIT+OFFSET, but we add OFFSET separately later). */
tree inner_base = build_fold_indirect_ref
! (fold_build2 (POINTER_PLUS_EXPR,
! TREE_TYPE (base), base,
! fold_convert (sizetype, init)));
if (vect_print_dump_info (REPORT_DETAILS))
{
--- 2645,2651 ----
inner-loop: *(BASE+INIT). (The first location is actually
BASE+INIT+OFFSET, but we add OFFSET separately later). */
tree inner_base = build_fold_indirect_ref
! (fold_build_pointer_plus (base, init));
if (vect_print_dump_info (REPORT_DETAILS))
{
*************** vect_create_addr_base_for_vector_ref (gi
*** 2928,2935 ****
/* base + base_offset */
if (loop_vinfo)
! addr_base = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (data_ref_base),
! data_ref_base, base_offset);
else
{
addr_base = build1 (ADDR_EXPR,
--- 2926,2932 ----
/* base + base_offset */
if (loop_vinfo)
! addr_base = fold_build_pointer_plus (data_ref_base, base_offset);
else
{
addr_base = build1 (ADDR_EXPR,
Index: trunk/gcc/tree-vect-loop-manip.c
===================================================================
*** trunk.orig/gcc/tree-vect-loop-manip.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/tree-vect-loop-manip.c 2011-07-11 17:13:24.000000000 +0200
*************** vect_update_ivs_after_vectorizer (loop_v
*** 1819,1827 ****
fold_convert (TREE_TYPE (step_expr), niters),
step_expr);
if (POINTER_TYPE_P (TREE_TYPE (init_expr)))
! ni = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (init_expr),
! init_expr,
! fold_convert (sizetype, off));
else
ni = fold_build2 (PLUS_EXPR, TREE_TYPE (init_expr),
init_expr,
--- 1819,1825 ----
fold_convert (TREE_TYPE (step_expr), niters),
step_expr);
if (POINTER_TYPE_P (TREE_TYPE (init_expr)))
! ni = fold_build_pointer_plus (init_expr, off);
else
ni = fold_build2 (PLUS_EXPR, TREE_TYPE (init_expr),
init_expr,
*************** vect_create_cond_for_alias_checks (loop_
*** 2471,2484 ****
}
seg_a_min = addr_base_a;
! seg_a_max = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (addr_base_a),
! addr_base_a, segment_length_a);
if (tree_int_cst_compare (DR_STEP (dr_a), size_zero_node) < 0)
seg_a_min = seg_a_max, seg_a_max = addr_base_a;
seg_b_min = addr_base_b;
! seg_b_max = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (addr_base_b),
! addr_base_b, segment_length_b);
if (tree_int_cst_compare (DR_STEP (dr_b), size_zero_node) < 0)
seg_b_min = seg_b_max, seg_b_max = addr_base_b;
--- 2469,2480 ----
}
seg_a_min = addr_base_a;
! seg_a_max = fold_build_pointer_plus (addr_base_a, segment_length_a);
if (tree_int_cst_compare (DR_STEP (dr_a), size_zero_node) < 0)
seg_a_min = seg_a_max, seg_a_max = addr_base_a;
seg_b_min = addr_base_b;
! seg_b_max = fold_build_pointer_plus (addr_base_b, segment_length_b);
if (tree_int_cst_compare (DR_STEP (dr_b), size_zero_node) < 0)
seg_b_min = seg_b_max, seg_b_max = addr_base_b;
Index: trunk/gcc/tree-vrp.c
===================================================================
*** trunk.orig/gcc/tree-vrp.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/tree-vrp.c 2011-07-11 17:13:24.000000000 +0200
*************** extract_range_from_assert (value_range_t
*** 1877,1884 ****
anti_max,
build_int_cst (TREE_TYPE (var_vr->min), 1));
else
! min = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (var_vr->min),
! anti_max, size_int (1));
max = real_max;
set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
}
--- 1877,1883 ----
anti_max,
build_int_cst (TREE_TYPE (var_vr->min), 1));
else
! min = fold_build_pointer_plus_hwi (anti_max, 1);
max = real_max;
set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
}
*************** extract_range_from_assert (value_range_t
*** 1905,1913 ****
anti_min,
build_int_cst (TREE_TYPE (var_vr->min), 1));
else
! max = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (var_vr->min),
! anti_min,
! size_int (-1));
min = real_min;
set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
}
--- 1904,1910 ----
anti_min,
build_int_cst (TREE_TYPE (var_vr->min), 1));
else
! max = fold_build_pointer_plus_hwi (anti_min, -1);
min = real_min;
set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
}
Index: trunk/gcc/c-family/c-common.c
===================================================================
*** trunk.orig/gcc/c-family/c-common.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/c-family/c-common.c 2011-07-11 17:13:24.000000000 +0200
*************** pointer_int_sum (location_t loc, enum tr
*** 3760,3766 ****
if (resultcode == MINUS_EXPR)
intop = fold_build1_loc (loc, NEGATE_EXPR, sizetype, intop);
! ret = fold_build2_loc (loc, POINTER_PLUS_EXPR, result_type, ptrop, intop);
fold_undefer_and_ignore_overflow_warnings ();
--- 3760,3766 ----
if (resultcode == MINUS_EXPR)
intop = fold_build1_loc (loc, NEGATE_EXPR, sizetype, intop);
! ret = fold_build_pointer_plus_loc (loc, ptrop, intop);
fold_undefer_and_ignore_overflow_warnings ();
Index: trunk/gcc/c-family/c-omp.c
===================================================================
*** trunk.orig/gcc/c-family/c-omp.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/c-family/c-omp.c 2011-07-11 17:13:24.000000000 +0200
*************** c_finish_omp_for (location_t locus, tree
*** 424,430 ****
if (TREE_CODE (incr) == POSTDECREMENT_EXPR
|| TREE_CODE (incr) == PREDECREMENT_EXPR)
t = fold_build1_loc (elocus, NEGATE_EXPR, sizetype, t);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (decl), decl, t);
incr = build2 (MODIFY_EXPR, void_type_node, decl, t);
}
break;
--- 424,430 ----
if (TREE_CODE (incr) == POSTDECREMENT_EXPR
|| TREE_CODE (incr) == PREDECREMENT_EXPR)
t = fold_build1_loc (elocus, NEGATE_EXPR, sizetype, t);
! t = fold_build_pointer_plus (decl, t);
incr = build2 (MODIFY_EXPR, void_type_node, decl, t);
}
break;
Index: trunk/gcc/config/alpha/alpha.c
===================================================================
*** trunk.orig/gcc/config/alpha/alpha.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/alpha/alpha.c 2011-07-11 17:13:24.000000000 +0200
*************** alpha_va_start (tree valist, rtx nextarg
*** 5990,5997 ****
if (TARGET_ABI_OPEN_VMS)
{
t = make_tree (ptr_type_node, virtual_incoming_args_rtx);
! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t,
! size_int (offset + NUM_ARGS * UNITS_PER_WORD));
t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 5990,5996 ----
if (TARGET_ABI_OPEN_VMS)
{
t = make_tree (ptr_type_node, virtual_incoming_args_rtx);
! t = fold_build_pointer_plus_hwi (t, offset + NUM_ARGS * UNITS_PER_WORD);
t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** alpha_va_start (tree valist, rtx nextarg
*** 6007,6014 ****
valist, offset_field, NULL_TREE);
t = make_tree (ptr_type_node, virtual_incoming_args_rtx);
! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t,
! size_int (offset));
t = build2 (MODIFY_EXPR, TREE_TYPE (base_field), base_field, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 6006,6012 ----
valist, offset_field, NULL_TREE);
t = make_tree (ptr_type_node, virtual_incoming_args_rtx);
! t = fold_build_pointer_plus_hwi (t, offset);
t = build2 (MODIFY_EXPR, TREE_TYPE (base_field), base_field, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** alpha_gimplify_va_arg_1 (tree type, tree
*** 6069,6076 ****
}
/* Build the final address and force that value into a temporary. */
! addr = build2 (POINTER_PLUS_EXPR, ptr_type, fold_convert (ptr_type, base),
! fold_convert (sizetype, addend));
internal_post = NULL;
gimplify_expr (&addr, pre_p, &internal_post, is_gimple_val, fb_rvalue);
gimple_seq_add_seq (pre_p, internal_post);
--- 6067,6073 ----
}
/* Build the final address and force that value into a temporary. */
! addr = fold_build_pointer_plus (fold_convert (ptr_type, base), addend);
internal_post = NULL;
gimplify_expr (&addr, pre_p, &internal_post, is_gimple_val, fb_rvalue);
gimple_seq_add_seq (pre_p, internal_post);
Index: trunk/gcc/config/i386/i386.c
===================================================================
*** trunk.orig/gcc/config/i386/i386.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/i386/i386.c 2011-07-11 17:44:25.000000000 +0200
*************** ix86_va_start (tree valist, rtx nextarg)
*** 7559,7566 ****
ovf_rtx = cfun->machine->split_stack_varargs_pointer;
t = make_tree (type, ovf_rtx);
if (words != 0)
! t = build2 (POINTER_PLUS_EXPR, type, t,
! size_int (words * UNITS_PER_WORD));
t = build2 (MODIFY_EXPR, type, ovf, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 7559,7565 ----
ovf_rtx = cfun->machine->split_stack_varargs_pointer;
t = make_tree (type, ovf_rtx);
if (words != 0)
! t = fold_build_pointer_plus_hwi (t, words * UNITS_PER_WORD);
t = build2 (MODIFY_EXPR, type, ovf, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** ix86_va_start (tree valist, rtx nextarg)
*** 7572,7579 ****
type = TREE_TYPE (sav);
t = make_tree (type, frame_pointer_rtx);
if (!ix86_varargs_gpr_size)
! t = build2 (POINTER_PLUS_EXPR, type, t,
! size_int (-8 * X86_64_REGPARM_MAX));
t = build2 (MODIFY_EXPR, type, sav, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 7571,7577 ----
type = TREE_TYPE (sav);
t = make_tree (type, frame_pointer_rtx);
if (!ix86_varargs_gpr_size)
! t = fold_build_pointer_plus_hwi (t, -8 * X86_64_REGPARM_MAX);
t = build2 (MODIFY_EXPR, type, sav, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** ix86_gimplify_va_arg (tree valist, tree
*** 7729,7743 ****
if (needed_intregs)
{
/* int_addr = gpr + sav; */
! t = fold_convert (sizetype, gpr);
! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
gimplify_assign (int_addr, t, pre_p);
}
if (needed_sseregs)
{
/* sse_addr = fpr + sav; */
! t = fold_convert (sizetype, fpr);
! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
gimplify_assign (sse_addr, t, pre_p);
}
if (need_temp)
--- 7727,7739 ----
if (needed_intregs)
{
/* int_addr = gpr + sav; */
! t = fold_build_pointer_plus (sav, gpr);
gimplify_assign (int_addr, t, pre_p);
}
if (needed_sseregs)
{
/* sse_addr = fpr + sav; */
! t = fold_build_pointer_plus (sav, fpr);
gimplify_assign (sse_addr, t, pre_p);
}
if (need_temp)
*************** ix86_gimplify_va_arg (tree valist, tree
*** 7791,7802 ****
src_offset = REGNO (reg) * 8;
}
src_addr = fold_convert (addr_type, src_addr);
! src_addr = fold_build2 (POINTER_PLUS_EXPR, addr_type, src_addr,
! size_int (src_offset));
dest_addr = fold_convert (daddr_type, addr);
! dest_addr = fold_build2 (POINTER_PLUS_EXPR, daddr_type, dest_addr,
! size_int (prev_size));
if (cur_size == GET_MODE_SIZE (mode))
{
src = build_va_arg_indirect_ref (src_addr);
--- 7787,7796 ----
src_offset = REGNO (reg) * 8;
}
src_addr = fold_convert (addr_type, src_addr);
! src_addr = fold_build_pointer_plus_hwi (src_addr, src_offset);
dest_addr = fold_convert (daddr_type, addr);
! dest_addr = fold_build_pointer_plus_hwi (dest_addr, prev_size);
if (cur_size == GET_MODE_SIZE (mode))
{
src = build_va_arg_indirect_ref (src_addr);
*************** ix86_gimplify_va_arg (tree valist, tree
*** 7851,7869 ****
else
{
HOST_WIDE_INT align = arg_boundary / 8;
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), ovf,
! size_int (align - 1));
! t = fold_convert (sizetype, t);
t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
! size_int (-align));
! t = fold_convert (TREE_TYPE (ovf), t);
}
gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
gimplify_assign (addr, t, pre_p);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t,
! size_int (rsize * UNITS_PER_WORD));
gimplify_assign (unshare_expr (ovf), t, pre_p);
if (container)
--- 7845,7859 ----
else
{
HOST_WIDE_INT align = arg_boundary / 8;
! t = fold_build_pointer_plus_hwi (ovf, align - 1);
t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
! build_int_cst (TREE_TYPE (t), -align));
}
gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
gimplify_assign (addr, t, pre_p);
! t = fold_build_pointer_plus_hwi (t, rsize * UNITS_PER_WORD);
gimplify_assign (unshare_expr (ovf), t, pre_p);
if (container)
Index: trunk/gcc/config/ia64/ia64.c
===================================================================
*** trunk.orig/gcc/config/ia64/ia64.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/ia64/ia64.c 2011-07-11 17:13:24.000000000 +0200
*************** ia64_gimplify_va_arg (tree valist, tree
*** 4738,4749 ****
if ((TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == INTEGER_TYPE)
? int_size_in_bytes (type) > 8 : TYPE_ALIGN (type) > 8 * BITS_PER_UNIT)
{
! tree t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (valist), valist,
! size_int (2 * UNITS_PER_WORD - 1));
! t = fold_convert (sizetype, t);
t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
! size_int (-2 * UNITS_PER_WORD));
! t = fold_convert (TREE_TYPE (valist), t);
gimplify_assign (unshare_expr (valist), t, pre_p);
}
--- 4738,4746 ----
if ((TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == INTEGER_TYPE)
? int_size_in_bytes (type) > 8 : TYPE_ALIGN (type) > 8 * BITS_PER_UNIT)
{
! tree t = fold_build_pointer_plus_hwi (valist, 2 * UNITS_PER_WORD - 1);
t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
! build_int_cst (TREE_TYPE (t), -2 * UNITS_PER_WORD));
gimplify_assign (unshare_expr (valist), t, pre_p);
}
Index: trunk/gcc/config/mep/mep.c
===================================================================
*** trunk.orig/gcc/config/mep/mep.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/mep/mep.c 2011-07-11 17:13:24.000000000 +0200
*************** mep_expand_va_start (tree valist, rtx ne
*** 3620,3633 ****
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
/* va_list.next_gp_limit = va_list.next_gp + 4 * ns; */
! u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u,
! size_int (4 * ns));
t = build2 (MODIFY_EXPR, ptr_type_node, next_gp_limit, u);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
! u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u,
! size_int (8 * ((ns+1)/2)));
/* va_list.next_cop = ROUND_UP(va_list.next_gp_limit,8); */
t = build2 (MODIFY_EXPR, ptr_type_node, next_cop, u);
TREE_SIDE_EFFECTS (t) = 1;
--- 3620,3631 ----
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
/* va_list.next_gp_limit = va_list.next_gp + 4 * ns; */
! u = fold_build_pointer_plus_hwi (u, 4 * ns);
t = build2 (MODIFY_EXPR, ptr_type_node, next_gp_limit, u);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
! u = fold_build_pointer_plus_hwi (u, 8 * ((ns+1)/2));
/* va_list.next_cop = ROUND_UP(va_list.next_gp_limit,8); */
t = build2 (MODIFY_EXPR, ptr_type_node, next_cop, u);
TREE_SIDE_EFFECTS (t) = 1;
*************** mep_gimplify_va_arg_expr (tree valist, t
*** 3715,3726 ****
gimplify_and_add (tmp, pre_p);
}
! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node,
! unshare_expr (next_gp), size_int (4));
gimplify_assign (unshare_expr (next_gp), tmp, pre_p);
! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node,
! unshare_expr (next_cop), size_int (8));
gimplify_assign (unshare_expr (next_cop), tmp, pre_p);
tmp = build1 (GOTO_EXPR, void_type_node, unshare_expr (label_sover));
--- 3713,3722 ----
gimplify_and_add (tmp, pre_p);
}
! tmp = fold_build_pointer_plus_hwi (unshare_expr (next_gp), 4);
gimplify_assign (unshare_expr (next_gp), tmp, pre_p);
! tmp = fold_build_pointer_plus_hwi (unshare_expr (next_cop), 8);
gimplify_assign (unshare_expr (next_cop), tmp, pre_p);
tmp = build1 (GOTO_EXPR, void_type_node, unshare_expr (label_sover));
*************** mep_gimplify_va_arg_expr (tree valist, t
*** 3734,3741 ****
tmp = build2 (MODIFY_EXPR, void_type_node, res_addr, unshare_expr (next_stack));
gimplify_and_add (tmp, pre_p);
! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node,
! unshare_expr (next_stack), size_int (rsize));
gimplify_assign (unshare_expr (next_stack), tmp, pre_p);
/* - - */
--- 3730,3736 ----
tmp = build2 (MODIFY_EXPR, void_type_node, res_addr, unshare_expr (next_stack));
gimplify_and_add (tmp, pre_p);
! tmp = fold_build_pointer_plus_hwi (unshare_expr (next_stack), rsize);
gimplify_assign (unshare_expr (next_stack), tmp, pre_p);
/* - - */
Index: trunk/gcc/config/mips/mips.c
===================================================================
*** trunk.orig/gcc/config/mips/mips.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/mips/mips.c 2011-07-11 17:13:24.000000000 +0200
*************** mips_va_start (tree valist, rtx nextarg)
*** 5452,5459 ****
words used by named arguments. */
t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
if (cum->stack_words > 0)
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), t,
! size_int (cum->stack_words * UNITS_PER_WORD));
t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 5452,5458 ----
words used by named arguments. */
t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
if (cum->stack_words > 0)
! t = fold_build_pointer_plus_hwi (t, cum->stack_words * UNITS_PER_WORD);
t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** mips_va_start (tree valist, rtx nextarg)
*** 5469,5476 ****
fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
fpr_offset &= -UNITS_PER_FPVALUE;
if (fpr_offset)
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ftop), t,
! size_int (-fpr_offset));
t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 5468,5474 ----
fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
fpr_offset &= -UNITS_PER_FPVALUE;
if (fpr_offset)
! t = fold_build_pointer_plus_hwi (t, -fpr_offset);
t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** mips_gimplify_va_arg_expr (tree valist,
*** 5615,5638 ****
addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0). */
t = fold_convert (sizetype, t);
t = fold_build1 (NEGATE_EXPR, sizetype, t);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (top), top, t);
if (BYTES_BIG_ENDIAN && rsize > size)
! {
! u = size_int (rsize - size);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
! }
COND_EXPR_THEN (addr) = t;
if (osize > UNITS_PER_WORD)
{
/* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize. */
! u = size_int (osize - 1);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl),
! unshare_expr (ovfl), u);
! t = fold_convert (sizetype, t);
! u = size_int (-osize);
t = build2 (BIT_AND_EXPR, sizetype, t, u);
- t = fold_convert (TREE_TYPE (ovfl), t);
align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
unshare_expr (ovfl), t);
}
--- 5613,5629 ----
addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0). */
t = fold_convert (sizetype, t);
t = fold_build1 (NEGATE_EXPR, sizetype, t);
! t = fold_build_pointer_plus (top, t);
if (BYTES_BIG_ENDIAN && rsize > size)
! t = fold_build_pointer_plus_hwi (t, rsize - size);
COND_EXPR_THEN (addr) = t;
if (osize > UNITS_PER_WORD)
{
/* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize. */
! t = fold_build_pointer_plus_hwi (unshare_expr (ovfl), osize - 1);
! u = build_int_cst (TREE_TYPE (t), -osize);
t = build2 (BIT_AND_EXPR, sizetype, t, u);
align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
unshare_expr (ovfl), t);
}
*************** mips_gimplify_va_arg_expr (tree valist,
*** 5645,5654 ****
u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
if (BYTES_BIG_ENDIAN && osize > size)
! {
! u = size_int (osize - size);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
! }
/* String [9] and [10, 11] together. */
if (align)
--- 5636,5642 ----
u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
if (BYTES_BIG_ENDIAN && osize > size)
! t = fold_build_pointer_plus_hwi (t, osize - size);
/* String [9] and [10, 11] together. */
if (align)
Index: trunk/gcc/config/pa/pa.c
===================================================================
*** trunk.orig/gcc/config/pa/pa.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/pa/pa.c 2011-07-11 17:13:24.000000000 +0200
*************** hppa_gimplify_va_arg_expr (tree valist,
*** 6112,6118 ****
u = fold_convert (sizetype, size_in_bytes (type));
u = fold_build1 (NEGATE_EXPR, sizetype, u);
! t = build2 (POINTER_PLUS_EXPR, valist_type, valist, u);
/* Align to 4 or 8 byte boundary depending on argument size. */
--- 6112,6118 ----
u = fold_convert (sizetype, size_in_bytes (type));
u = fold_build1 (NEGATE_EXPR, sizetype, u);
! t = fold_build_pointer_plus (valist, u);
/* Align to 4 or 8 byte boundary depending on argument size. */
*************** hppa_gimplify_va_arg_expr (tree valist,
*** 6124,6133 ****
ofs = (8 - size) % 4;
if (ofs != 0)
! {
! u = size_int (ofs);
! t = build2 (POINTER_PLUS_EXPR, valist_type, t, u);
! }
t = fold_convert (ptr, t);
t = build_va_arg_indirect_ref (t);
--- 6124,6130 ----
ofs = (8 - size) % 4;
if (ofs != 0)
! t = fold_build_pointer_plus_hwi (t, ofs);
t = fold_convert (ptr, t);
t = build_va_arg_indirect_ref (t);
Index: trunk/gcc/config/rs6000/rs6000.c
===================================================================
*** trunk.orig/gcc/config/rs6000/rs6000.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/rs6000/rs6000.c 2011-07-11 17:13:24.000000000 +0200
*************** rs6000_va_start (tree valist, rtx nextar
*** 9131,9138 ****
/* Find the overflow area. */
t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
if (words != 0)
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), t,
! size_int (words * UNITS_PER_WORD));
t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 9131,9137 ----
/* Find the overflow area. */
t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
if (words != 0)
! t = fold_build_pointer_plus_hwi (t, words * UNITS_PER_WORD);
t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** rs6000_va_start (tree valist, rtx nextar
*** 9148,9155 ****
/* Find the register save area. */
t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
if (cfun->machine->varargs_save_offset)
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (sav), t,
! size_int (cfun->machine->varargs_save_offset));
t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 9147,9153 ----
/* Find the register save area. */
t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
if (cfun->machine->varargs_save_offset)
! t = fold_build_pointer_plus_hwi (t, cfun->machine->varargs_save_offset);
t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** rs6000_gimplify_va_arg (tree valist, tre
*** 9202,9210 ****
/* This updates arg ptr by the amount that would be necessary
to align the zero-sized (but not zero-alignment) item. */
t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
! fold_build2 (POINTER_PLUS_EXPR,
! TREE_TYPE (valist),
! valist_tmp, size_int (boundary - 1)));
gimplify_and_add (t, pre_p);
t = fold_convert (sizetype, valist_tmp);
--- 9200,9206 ----
/* This updates arg ptr by the amount that would be necessary
to align the zero-sized (but not zero-alignment) item. */
t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
! fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
gimplify_and_add (t, pre_p);
t = fold_convert (sizetype, valist_tmp);
*************** rs6000_gimplify_va_arg (tree valist, tre
*** 9339,9358 ****
t = sav;
if (sav_ofs)
! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, size_int (sav_ofs));
u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
build_int_cst (TREE_TYPE (reg), n_reg));
u = fold_convert (sizetype, u);
u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t, u);
/* _Decimal32 varargs are located in the second word of the 64-bit
FP register for 32-bit binaries. */
if (!TARGET_POWERPC64
&& TARGET_HARD_FLOAT && TARGET_FPRS
&& TYPE_MODE (type) == SDmode)
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
gimplify_assign (addr, t, pre_p);
--- 9335,9354 ----
t = sav;
if (sav_ofs)
! t = fold_build_pointer_plus_hwi (sav, sav_ofs);
u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
build_int_cst (TREE_TYPE (reg), n_reg));
u = fold_convert (sizetype, u);
u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
! t = fold_build_pointer_plus (t, u);
/* _Decimal32 varargs are located in the second word of the 64-bit
FP register for 32-bit binaries. */
if (!TARGET_POWERPC64
&& TARGET_HARD_FLOAT && TARGET_FPRS
&& TYPE_MODE (type) == SDmode)
! t = fold_build_pointer_plus_hwi (t, size);
gimplify_assign (addr, t, pre_p);
*************** rs6000_gimplify_va_arg (tree valist, tre
*** 9375,9391 ****
t = ovf;
if (align != 1)
{
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (align - 1));
! t = fold_convert (sizetype, t);
t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
! size_int (-align));
! t = fold_convert (TREE_TYPE (ovf), t);
}
gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
gimplify_assign (unshare_expr (addr), t, pre_p);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
gimplify_assign (unshare_expr (ovf), t, pre_p);
if (lab_over)
--- 9371,9385 ----
t = ovf;
if (align != 1)
{
! t = fold_build_pointer_plus_hwi (t, align - 1);
t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
! build_int_cst (TREE_TYPE (t), -align));
}
gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
gimplify_assign (unshare_expr (addr), t, pre_p);
! t = fold_build_pointer_plus_hwi (t, size);
gimplify_assign (unshare_expr (ovf), t, pre_p);
if (lab_over)
Index: trunk/gcc/config/s390/s390.c
===================================================================
*** trunk.orig/gcc/config/s390/s390.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/s390/s390.c 2011-07-11 17:13:24.000000000 +0200
*************** s390_va_start (tree valist, rtx nextarg
*** 8868,8874 ****
fprintf (stderr, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
(int)n_gpr, (int)n_fpr, off);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), t, size_int (off));
t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
TREE_SIDE_EFFECTS (t) = 1;
--- 8868,8874 ----
fprintf (stderr, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
(int)n_gpr, (int)n_fpr, off);
! t = fold_build_pointer_plus_hwi (t, off);
t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
TREE_SIDE_EFFECTS (t) = 1;
*************** s390_va_start (tree valist, rtx nextarg
*** 8880,8887 ****
|| (cfun->va_list_fpr_size && n_fpr < FP_ARG_NUM_REG))
{
t = make_tree (TREE_TYPE (sav), return_address_pointer_rtx);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (sav), t,
! size_int (-RETURN_REGNUM * UNITS_PER_LONG));
t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
TREE_SIDE_EFFECTS (t) = 1;
--- 8880,8886 ----
|| (cfun->va_list_fpr_size && n_fpr < FP_ARG_NUM_REG))
{
t = make_tree (TREE_TYPE (sav), return_address_pointer_rtx);
! t = fold_build_pointer_plus_hwi (t, -RETURN_REGNUM * UNITS_PER_LONG);
t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
TREE_SIDE_EFFECTS (t) = 1;
*************** s390_gimplify_va_arg (tree valist, tree
*** 9013,9023 ****
t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
gimplify_and_add (t, pre_p);
! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav,
! size_int (sav_ofs));
u = build2 (MULT_EXPR, TREE_TYPE (reg), reg,
fold_convert (TREE_TYPE (reg), size_int (sav_scale)));
! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t, fold_convert (sizetype, u));
gimplify_assign (addr, t, pre_p);
--- 9012,9021 ----
t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
gimplify_and_add (t, pre_p);
! t = fold_build_pointer_plus_hwi (sav, sav_ofs);
u = build2 (MULT_EXPR, TREE_TYPE (reg), reg,
fold_convert (TREE_TYPE (reg), size_int (sav_scale)));
! t = fold_build_pointer_plus (t, u);
gimplify_assign (addr, t, pre_p);
*************** s390_gimplify_va_arg (tree valist, tree
*** 9030,9044 ****
t = ovf;
if (size < UNITS_PER_LONG)
! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t,
! size_int (UNITS_PER_LONG - size));
gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
gimplify_assign (addr, t, pre_p);
! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t,
! size_int (size));
gimplify_assign (ovf, t, pre_p);
gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
--- 9028,9040 ----
t = ovf;
if (size < UNITS_PER_LONG)
! t = fold_build_pointer_plus_hwi (t, UNITS_PER_LONG - size);
gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
gimplify_assign (addr, t, pre_p);
! t = fold_build_pointer_plus_hwi (t, size);
gimplify_assign (ovf, t, pre_p);
gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
Index: trunk/gcc/config/sh/sh.c
===================================================================
*** trunk.orig/gcc/config/sh/sh.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/sh/sh.c 2011-07-11 17:13:24.000000000 +0200
*************** sh_va_start (tree valist, rtx nextarg)
*** 7831,7838 ****
nfp = 8 - nfp;
else
nfp = 0;
! u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u,
! size_int (UNITS_PER_WORD * nfp));
t = build2 (MODIFY_EXPR, ptr_type_node, next_fp_limit, u);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 7831,7837 ----
nfp = 8 - nfp;
else
nfp = 0;
! u = fold_build_pointer_plus_hwi (u, UNITS_PER_WORD * nfp);
t = build2 (MODIFY_EXPR, ptr_type_node, next_fp_limit, u);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** sh_va_start (tree valist, rtx nextarg)
*** 7846,7853 ****
nint = 4 - nint;
else
nint = 0;
! u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u,
! size_int (UNITS_PER_WORD * nint));
t = build2 (MODIFY_EXPR, ptr_type_node, next_o_limit, u);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 7845,7851 ----
nint = 4 - nint;
else
nint = 0;
! u = fold_build_pointer_plus_hwi (u, UNITS_PER_WORD * nint);
t = build2 (MODIFY_EXPR, ptr_type_node, next_o_limit, u);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** sh_gimplify_va_arg_expr (tree valist, tr
*** 7983,7990 ****
gimplify_assign (unshare_expr (next_fp_tmp), valist, pre_p);
tmp = next_fp_limit;
if (size > 4 && !is_double)
! tmp = build2 (POINTER_PLUS_EXPR, TREE_TYPE (tmp),
! unshare_expr (tmp), size_int (4 - size));
tmp = build2 (GE_EXPR, boolean_type_node,
unshare_expr (next_fp_tmp), unshare_expr (tmp));
cmp = build3 (COND_EXPR, void_type_node, tmp,
--- 7981,7987 ----
gimplify_assign (unshare_expr (next_fp_tmp), valist, pre_p);
tmp = next_fp_limit;
if (size > 4 && !is_double)
! tmp = fold_build_pointer_plus_hwi (unshare_expr (tmp), 4 - size);
tmp = build2 (GE_EXPR, boolean_type_node,
unshare_expr (next_fp_tmp), unshare_expr (tmp));
cmp = build3 (COND_EXPR, void_type_node, tmp,
*************** sh_gimplify_va_arg_expr (tree valist, tr
*** 7999,8006 ****
tmp = fold_convert (sizetype, next_fp_tmp);
tmp = build2 (BIT_AND_EXPR, sizetype, tmp,
size_int (UNITS_PER_WORD));
! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node,
! unshare_expr (next_fp_tmp), tmp);
gimplify_assign (unshare_expr (next_fp_tmp), tmp, pre_p);
}
if (is_double)
--- 7996,8002 ----
tmp = fold_convert (sizetype, next_fp_tmp);
tmp = build2 (BIT_AND_EXPR, sizetype, tmp,
size_int (UNITS_PER_WORD));
! tmp = fold_build_pointer_plus (unshare_expr (next_fp_tmp), tmp);
gimplify_assign (unshare_expr (next_fp_tmp), tmp, pre_p);
}
if (is_double)
*************** sh_gimplify_va_arg_expr (tree valist, tr
*** 8045,8052 ****
}
else
{
! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node,
! unshare_expr (next_o), size_int (rsize));
tmp = build2 (GT_EXPR, boolean_type_node, tmp,
unshare_expr (next_o_limit));
tmp = build3 (COND_EXPR, void_type_node, tmp,
--- 8041,8047 ----
}
else
{
! tmp = fold_build_pointer_plus_hwi (unshare_expr (next_o), rsize);
tmp = build2 (GT_EXPR, boolean_type_node, tmp,
unshare_expr (next_o_limit));
tmp = build3 (COND_EXPR, void_type_node, tmp,
Index: trunk/gcc/config/sparc/sparc.c
===================================================================
*** trunk.orig/gcc/config/sparc/sparc.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/sparc/sparc.c 2011-07-11 17:13:24.000000000 +0200
*************** sparc_gimplify_va_arg (tree valist, tree
*** 6677,6684 ****
incr = valist;
if (align)
{
! incr = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, incr,
! size_int (align - 1));
incr = fold_convert (sizetype, incr);
incr = fold_build2 (BIT_AND_EXPR, sizetype, incr,
size_int (-align));
--- 6677,6683 ----
incr = valist;
if (align)
{
! incr = fold_build_pointer_plus_hwi (incr, align - 1);
incr = fold_convert (sizetype, incr);
incr = fold_build2 (BIT_AND_EXPR, sizetype, incr,
size_int (-align));
*************** sparc_gimplify_va_arg (tree valist, tree
*** 6689,6696 ****
addr = incr;
if (BYTES_BIG_ENDIAN && size < rsize)
! addr = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, incr,
! size_int (rsize - size));
if (indirect)
{
--- 6688,6694 ----
addr = incr;
if (BYTES_BIG_ENDIAN && size < rsize)
! addr = fold_build_pointer_plus_hwi (incr, rsize - size);
if (indirect)
{
*************** sparc_gimplify_va_arg (tree valist, tree
*** 6714,6721 ****
else
addr = fold_convert (ptrtype, addr);
! incr
! = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, incr, size_int (rsize));
gimplify_assign (valist, incr, post_p);
return build_va_arg_indirect_ref (addr);
--- 6712,6718 ----
else
addr = fold_convert (ptrtype, addr);
! incr = fold_build_pointer_plus_hwi (incr, rsize);
gimplify_assign (valist, incr, post_p);
return build_va_arg_indirect_ref (addr);
Index: trunk/gcc/config/spu/spu.c
===================================================================
*** trunk.orig/gcc/config/spu/spu.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/spu/spu.c 2011-07-11 17:13:24.000000000 +0200
*************** spu_va_start (tree valist, rtx nextarg)
*** 4183,4199 ****
/* Find the __args area. */
t = make_tree (TREE_TYPE (args), nextarg);
if (crtl->args.pretend_args_size > 0)
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (args), t,
! size_int (-STACK_POINTER_OFFSET));
t = build2 (MODIFY_EXPR, TREE_TYPE (args), args, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
/* Find the __skip area. */
t = make_tree (TREE_TYPE (skip), virtual_incoming_args_rtx);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (skip), t,
! size_int (crtl->args.pretend_args_size
! - STACK_POINTER_OFFSET));
t = build2 (MODIFY_EXPR, TREE_TYPE (skip), skip, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 4183,4197 ----
/* Find the __args area. */
t = make_tree (TREE_TYPE (args), nextarg);
if (crtl->args.pretend_args_size > 0)
! t = fold_build_pointer_plus_hwi (t, -STACK_POINTER_OFFSET);
t = build2 (MODIFY_EXPR, TREE_TYPE (args), args, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
/* Find the __skip area. */
t = make_tree (TREE_TYPE (skip), virtual_incoming_args_rtx);
! t = fold_build_pointer_plus_hwi (t, (crtl->args.pretend_args_size
! - STACK_POINTER_OFFSET));
t = build2 (MODIFY_EXPR, TREE_TYPE (skip), skip, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** spu_gimplify_va_arg_expr (tree valist, t
*** 4223,4229 ****
tree f_args, f_skip;
tree args, skip;
HOST_WIDE_INT size, rsize;
! tree paddedsize, addr, tmp;
bool pass_by_reference_p;
f_args = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
--- 4221,4227 ----
tree f_args, f_skip;
tree args, skip;
HOST_WIDE_INT size, rsize;
! tree addr, tmp;
bool pass_by_reference_p;
f_args = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
*************** spu_gimplify_va_arg_expr (tree valist, t
*** 4248,4268 ****
/* build conditional expression to calculate addr. The expression
will be gimplified later. */
! paddedsize = size_int (rsize);
! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node, unshare_expr (args), paddedsize);
tmp = build2 (TRUTH_AND_EXPR, boolean_type_node,
build2 (GT_EXPR, boolean_type_node, tmp, unshare_expr (skip)),
build2 (LE_EXPR, boolean_type_node, unshare_expr (args),
unshare_expr (skip)));
tmp = build3 (COND_EXPR, ptr_type_node, tmp,
! build2 (POINTER_PLUS_EXPR, ptr_type_node, unshare_expr (skip),
! size_int (32)), unshare_expr (args));
gimplify_assign (addr, tmp, pre_p);
/* update VALIST.__args */
! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node, addr, paddedsize);
gimplify_assign (unshare_expr (args), tmp, pre_p);
addr = fold_convert (build_pointer_type_for_mode (type, ptr_mode, true),
--- 4246,4265 ----
/* build conditional expression to calculate addr. The expression
will be gimplified later. */
! tmp = fold_build_pointer_plus_hwi (unshare_expr (args), rsize);
tmp = build2 (TRUTH_AND_EXPR, boolean_type_node,
build2 (GT_EXPR, boolean_type_node, tmp, unshare_expr (skip)),
build2 (LE_EXPR, boolean_type_node, unshare_expr (args),
unshare_expr (skip)));
tmp = build3 (COND_EXPR, ptr_type_node, tmp,
! fold_build_pointer_plus_hwi (unshare_expr (skip), 32),
! unshare_expr (args));
gimplify_assign (addr, tmp, pre_p);
/* update VALIST.__args */
! tmp = fold_build_pointer_plus_hwi (addr, rsize);
gimplify_assign (unshare_expr (args), tmp, pre_p);
addr = fold_convert (build_pointer_type_for_mode (type, ptr_mode, true),
Index: trunk/gcc/config/stormy16/stormy16.c
===================================================================
*** trunk.orig/gcc/config/stormy16/stormy16.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/stormy16/stormy16.c 2011-07-11 17:13:24.000000000 +0200
*************** xstormy16_expand_builtin_va_start (tree
*** 1292,1298 ****
t = make_tree (TREE_TYPE (base), virtual_incoming_args_rtx);
u = build_int_cst (NULL_TREE, - INCOMING_FRAME_SP_OFFSET);
u = fold_convert (TREE_TYPE (count), u);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (base), t, u);
t = build2 (MODIFY_EXPR, TREE_TYPE (base), base, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 1292,1298 ----
t = make_tree (TREE_TYPE (base), virtual_incoming_args_rtx);
u = build_int_cst (NULL_TREE, - INCOMING_FRAME_SP_OFFSET);
u = fold_convert (TREE_TYPE (count), u);
! t = fold_build_pointer_plus (t, u);
t = build2 (MODIFY_EXPR, TREE_TYPE (base), base, t);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** xstormy16_gimplify_va_arg_expr (tree val
*** 1350,1356 ****
NULL_TREE);
gimplify_and_add (t, pre_p);
! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, base, count_tmp);
gimplify_assign (addr, t, pre_p);
t = build1 (GOTO_EXPR, void_type_node, lab_gotaddr);
--- 1350,1356 ----
NULL_TREE);
gimplify_and_add (t, pre_p);
! t = fold_build_pointer_plus (base, count_tmp);
gimplify_assign (addr, t, pre_p);
t = build1 (GOTO_EXPR, void_type_node, lab_gotaddr);
*************** xstormy16_gimplify_va_arg_expr (tree val
*** 1385,1391 ****
fold_convert (TREE_TYPE (count), size_tree));
t = fold_convert (TREE_TYPE (t), fold (t));
t = fold_build1 (NEGATE_EXPR, TREE_TYPE (t), t);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (base), base, t);
gimplify_assign (addr, t, pre_p);
t = build1 (LABEL_EXPR, void_type_node, lab_gotaddr);
--- 1385,1391 ----
fold_convert (TREE_TYPE (count), size_tree));
t = fold_convert (TREE_TYPE (t), fold (t));
t = fold_build1 (NEGATE_EXPR, TREE_TYPE (t), t);
! t = fold_build_pointer_plus (base, t);
gimplify_assign (addr, t, pre_p);
t = build1 (LABEL_EXPR, void_type_node, lab_gotaddr);
Index: trunk/gcc/config/xtensa/xtensa.c
===================================================================
*** trunk.orig/gcc/config/xtensa/xtensa.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/config/xtensa/xtensa.c 2011-07-11 17:13:24.000000000 +0200
*************** xtensa_va_start (tree valist, rtx nextar
*** 2853,2859 ****
/* Set the __va_stk member to ($arg_ptr - 32). */
u = make_tree (ptr_type_node, virtual_incoming_args_rtx);
! u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u, size_int (-32));
t = build2 (MODIFY_EXPR, ptr_type_node, stk, u);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
--- 2853,2859 ----
/* Set the __va_stk member to ($arg_ptr - 32). */
u = make_tree (ptr_type_node, virtual_incoming_args_rtx);
! u = fold_build_pointer_plus_hwi (u, -32);
t = build2 (MODIFY_EXPR, ptr_type_node, stk, u);
TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
*************** xtensa_gimplify_va_arg_expr (tree valist
*** 3042,3048 ****
t = fold_convert (sizetype, unshare_expr (ndx));
t = build2 (MINUS_EXPR, sizetype, t, size);
! addr = build2 (POINTER_PLUS_EXPR, ptr_type_node, unshare_expr (array), t);
addr = fold_convert (build_pointer_type (type), addr);
if (indirect)
--- 3042,3048 ----
t = fold_convert (sizetype, unshare_expr (ndx));
t = build2 (MINUS_EXPR, sizetype, t, size);
! addr = fold_build_pointer_plus (unshare_expr (array), t);
addr = fold_convert (build_pointer_type (type), addr);
if (indirect)
Index: trunk/gcc/cp/call.c
===================================================================
*** trunk.orig/gcc/cp/call.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/cp/call.c 2011-07-11 17:13:24.000000000 +0200
*************** build_special_member_call (tree instance
*** 6936,6943 ****
current_vtt_parm,
vtt);
gcc_assert (BINFO_SUBVTT_INDEX (binfo));
! sub_vtt = build2 (POINTER_PLUS_EXPR, TREE_TYPE (vtt), vtt,
! BINFO_SUBVTT_INDEX (binfo));
if (args == NULL)
{
--- 6936,6942 ----
current_vtt_parm,
vtt);
gcc_assert (BINFO_SUBVTT_INDEX (binfo));
! sub_vtt = fold_build_pointer_plus (vtt, BINFO_SUBVTT_INDEX (binfo));
if (args == NULL)
{
Index: trunk/gcc/cp/class.c
===================================================================
*** trunk.orig/gcc/cp/class.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/cp/class.c 2011-07-11 17:28:24.000000000 +0200
*************** build_base_path (enum tree_code code,
*** 374,381 ****
tf_warning_or_error),
TREE_TYPE (TREE_TYPE (expr)));
! v_offset = build2 (POINTER_PLUS_EXPR, TREE_TYPE (v_offset),
! v_offset, fold_convert (sizetype, BINFO_VPTR_FIELD (v_binfo)));
v_offset = build1 (NOP_EXPR,
build_pointer_type (ptrdiff_type_node),
v_offset);
--- 374,380 ----
tf_warning_or_error),
TREE_TYPE (TREE_TYPE (expr)));
! v_offset = fold_build_pointer_plus (v_offset, BINFO_VPTR_FIELD (v_binfo));
v_offset = build1 (NOP_EXPR,
build_pointer_type (ptrdiff_type_node),
v_offset);
*************** build_base_path (enum tree_code code,
*** 413,419 ****
offset = fold_convert (sizetype, offset);
if (code == MINUS_EXPR)
offset = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, offset);
! expr = build2 (POINTER_PLUS_EXPR, ptr_target_type, expr, offset);
}
else
null_test = NULL;
--- 412,418 ----
offset = fold_convert (sizetype, offset);
if (code == MINUS_EXPR)
offset = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, offset);
! expr = fold_build_pointer_plus (expr, offset);
}
else
null_test = NULL;
*************** convert_to_base_statically (tree expr, t
*** 540,549 ****
expr_type = TREE_TYPE (expr);
if (!SAME_BINFO_TYPE_P (BINFO_TYPE (base), expr_type))
{
- tree pointer_type;
-
- pointer_type = build_pointer_type (expr_type);
-
/* We use fold_build2 and fold_convert below to simplify the trees
provided to the optimizers. It is not safe to call these functions
when processing a template because they do not handle C++-specific
--- 539,544 ----
*************** convert_to_base_statically (tree expr, t
*** 551,559 ****
gcc_assert (!processing_template_decl);
expr = cp_build_addr_expr (expr, tf_warning_or_error);
if (!integer_zerop (BINFO_OFFSET (base)))
! expr = fold_build2_loc (input_location,
! POINTER_PLUS_EXPR, pointer_type, expr,
! fold_convert (sizetype, BINFO_OFFSET (base)));
expr = fold_convert (build_pointer_type (BINFO_TYPE (base)), expr);
expr = build_fold_indirect_ref_loc (input_location, expr);
}
--- 546,553 ----
gcc_assert (!processing_template_decl);
expr = cp_build_addr_expr (expr, tf_warning_or_error);
if (!integer_zerop (BINFO_OFFSET (base)))
! expr = fold_build_pointer_plus_loc (input_location,
! expr, BINFO_OFFSET (base));
expr = fold_convert (build_pointer_type (BINFO_TYPE (base)), expr);
expr = build_fold_indirect_ref_loc (input_location, expr);
}
*************** dfs_accumulate_vtbl_inits (tree binfo,
*** 7833,7845 ****
/* Figure out the position to which the VPTR should point. */
vtbl = build1 (ADDR_EXPR, vtbl_ptr_type_node, orig_vtbl);
- index = size_binop (PLUS_EXPR,
- size_int (non_fn_entries),
- size_int (n_inits));
index = size_binop (MULT_EXPR,
TYPE_SIZE_UNIT (vtable_entry_type),
! index);
! vtbl = build2 (POINTER_PLUS_EXPR, TREE_TYPE (vtbl), vtbl, index);
}
if (ctor_vtbl_p)
--- 7827,7836 ----
/* Figure out the position to which the VPTR should point. */
vtbl = build1 (ADDR_EXPR, vtbl_ptr_type_node, orig_vtbl);
index = size_binop (MULT_EXPR,
TYPE_SIZE_UNIT (vtable_entry_type),
! size_int (non_fn_entries + n_inits));
! vtbl = fold_build_pointer_plus (vtbl, index);
}
if (ctor_vtbl_p)
Index: trunk/gcc/cp/cp-gimplify.c
===================================================================
*** trunk.orig/gcc/cp/cp-gimplify.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/cp/cp-gimplify.c 2011-07-11 17:13:24.000000000 +0200
*************** cxx_omp_clause_apply_fn (tree fn, tree a
*** 1230,1236 ****
start2 = build_fold_addr_expr_loc (input_location, start2);
end1 = TYPE_SIZE_UNIT (TREE_TYPE (arg1));
! end1 = build2 (POINTER_PLUS_EXPR, TREE_TYPE (start1), start1, end1);
p1 = create_tmp_var (TREE_TYPE (start1), NULL);
t = build2 (MODIFY_EXPR, TREE_TYPE (p1), p1, start1);
--- 1230,1236 ----
start2 = build_fold_addr_expr_loc (input_location, start2);
end1 = TYPE_SIZE_UNIT (TREE_TYPE (arg1));
! end1 = fold_build_pointer_plus (start1, end1);
p1 = create_tmp_var (TREE_TYPE (start1), NULL);
t = build2 (MODIFY_EXPR, TREE_TYPE (p1), p1, start1);
*************** cxx_omp_clause_apply_fn (tree fn, tree a
*** 1260,1274 ****
t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
append_to_statement_list (t, &ret);
! t = TYPE_SIZE_UNIT (inner_type);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (p1), p1, t);
t = build2 (MODIFY_EXPR, TREE_TYPE (p1), p1, t);
append_to_statement_list (t, &ret);
if (arg2)
{
! t = TYPE_SIZE_UNIT (inner_type);
! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (p2), p2, t);
t = build2 (MODIFY_EXPR, TREE_TYPE (p2), p2, t);
append_to_statement_list (t, &ret);
}
--- 1260,1272 ----
t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
append_to_statement_list (t, &ret);
! t = fold_build_pointer_plus (p1, TYPE_SIZE_UNIT (inner_type));
t = build2 (MODIFY_EXPR, TREE_TYPE (p1), p1, t);
append_to_statement_list (t, &ret);
if (arg2)
{
! t = fold_build_pointer_plus (p2, TYPE_SIZE_UNIT (inner_type));
t = build2 (MODIFY_EXPR, TREE_TYPE (p2), p2, t);
append_to_statement_list (t, &ret);
}
Index: trunk/gcc/cp/except.c
===================================================================
*** trunk.orig/gcc/cp/except.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/cp/except.c 2011-07-11 17:13:24.000000000 +0200
*************** expand_start_catch_block (tree decl)
*** 452,461 ****
generic exception header. */
exp = build_exc_ptr ();
exp = build1 (NOP_EXPR, build_pointer_type (type), exp);
! exp = build2 (POINTER_PLUS_EXPR, TREE_TYPE (exp), exp,
fold_build1_loc (input_location,
! NEGATE_EXPR, sizetype,
! TYPE_SIZE_UNIT (TREE_TYPE (exp))));
exp = cp_build_indirect_ref (exp, RO_NULL, tf_warning_or_error);
initialize_handler_parm (decl, exp);
return type;
--- 452,461 ----
generic exception header. */
exp = build_exc_ptr ();
exp = build1 (NOP_EXPR, build_pointer_type (type), exp);
! exp = fold_build_pointer_plus (exp,
fold_build1_loc (input_location,
! NEGATE_EXPR, sizetype,
! TYPE_SIZE_UNIT (TREE_TYPE (exp))));
exp = cp_build_indirect_ref (exp, RO_NULL, tf_warning_or_error);
initialize_handler_parm (decl, exp);
return type;
Index: trunk/gcc/cp/init.c
===================================================================
*** trunk.orig/gcc/cp/init.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/cp/init.c 2011-07-11 17:13:24.000000000 +0200
*************** expand_virtual_init (tree binfo, tree de
*** 1063,1072 ****
/* Compute the value to use, when there's a VTT. */
vtt_parm = current_vtt_parm;
! vtbl2 = build2 (POINTER_PLUS_EXPR,
! TREE_TYPE (vtt_parm),
! vtt_parm,
! vtt_index);
vtbl2 = cp_build_indirect_ref (vtbl2, RO_NULL, tf_warning_or_error);
vtbl2 = convert (TREE_TYPE (vtbl), vtbl2);
--- 1063,1069 ----
/* Compute the value to use, when there's a VTT. */
vtt_parm = current_vtt_parm;
! vtbl2 = fold_build_pointer_plus (vtt_parm, vtt_index);
vtbl2 = cp_build_indirect_ref (vtbl2, RO_NULL, tf_warning_or_error);
vtbl2 = convert (TREE_TYPE (vtbl), vtbl2);
*************** build_new_1 (VEC(tree,gc) **placement, t
*** 2310,2325 ****
tree size_ptr_type;
/* Adjust so we're pointing to the start of the object. */
! data_addr = build2 (POINTER_PLUS_EXPR, TREE_TYPE (alloc_node),
! alloc_node, cookie_size);
/* Store the number of bytes allocated so that we can know how
many elements to destroy later. We use the last sizeof
(size_t) bytes to store the number of elements. */
cookie_ptr = size_binop (MINUS_EXPR, cookie_size, size_in_bytes (sizetype));
! cookie_ptr = fold_build2_loc (input_location,
! POINTER_PLUS_EXPR, TREE_TYPE (alloc_node),
! alloc_node, cookie_ptr);
size_ptr_type = build_pointer_type (sizetype);
cookie_ptr = fold_convert (size_ptr_type, cookie_ptr);
cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
--- 2307,2320 ----
tree size_ptr_type;
/* Adjust so we're pointing to the start of the object. */
! data_addr = fold_build_pointer_plus (alloc_node, cookie_size);
/* Store the number of bytes allocated so that we can know how
many elements to destroy later. We use the last sizeof
(size_t) bytes to store the number of elements. */
cookie_ptr = size_binop (MINUS_EXPR, cookie_size, size_in_bytes (sizetype));
! cookie_ptr = fold_build_pointer_plus_loc (input_location,
! alloc_node, cookie_ptr);
size_ptr_type = build_pointer_type (sizetype);
cookie_ptr = fold_convert (size_ptr_type, cookie_ptr);
cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
*************** build_new_1 (VEC(tree,gc) **placement, t
*** 2329,2338 ****
if (targetm.cxx.cookie_has_size ())
{
/* Also store the element size. */
! cookie_ptr = build2 (POINTER_PLUS_EXPR, size_ptr_type, cookie_ptr,
fold_build1_loc (input_location,
! NEGATE_EXPR, sizetype,
! size_in_bytes (sizetype)));
cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
cookie = build2 (MODIFY_EXPR, sizetype, cookie,
--- 2324,2333 ----
if (targetm.cxx.cookie_has_size ())
{
/* Also store the element size. */
! cookie_ptr = fold_build_pointer_plus (cookie_ptr,
fold_build1_loc (input_location,
! NEGATE_EXPR, sizetype,
! size_in_bytes (sizetype)));
cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
cookie = build2 (MODIFY_EXPR, sizetype, cookie,
*************** build_vec_delete_1 (tree base, tree maxi
*** 2801,2812 ****
convert (sizetype, maxindex));
tbase = create_temporary_var (ptype);
! tbase_init = cp_build_modify_expr (tbase, NOP_EXPR,
! fold_build2_loc (input_location,
! POINTER_PLUS_EXPR, ptype,
! fold_convert (ptype, base),
! virtual_size),
! complain);
if (tbase_init == error_mark_node)
return error_mark_node;
controller = build3 (BIND_EXPR, void_type_node, tbase,
--- 2796,2808 ----
convert (sizetype, maxindex));
tbase = create_temporary_var (ptype);
! tbase_init
! = cp_build_modify_expr (tbase, NOP_EXPR,
! fold_build_pointer_plus_loc (input_location,
! fold_convert (ptype,
! base),
! virtual_size),
! complain);
if (tbase_init == error_mark_node)
return error_mark_node;
controller = build3 (BIND_EXPR, void_type_node, tbase,
*************** build_vec_delete_1 (tree base, tree maxi
*** 2817,2823 ****
build2 (EQ_EXPR, boolean_type_node, tbase,
fold_convert (ptype, base)));
tmp = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, size_exp);
! tmp = build2 (POINTER_PLUS_EXPR, ptype, tbase, tmp);
tmp = cp_build_modify_expr (tbase, NOP_EXPR, tmp, complain);
if (tmp == error_mark_node)
return error_mark_node;
--- 2813,2819 ----
build2 (EQ_EXPR, boolean_type_node, tbase,
fold_convert (ptype, base)));
tmp = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, size_exp);
! tmp = fold_build_pointer_plus (tbase, tmp);
tmp = cp_build_modify_expr (tbase, NOP_EXPR, tmp, complain);
if (tmp == error_mark_node)
return error_mark_node;
*************** build_vec_delete (tree base, tree maxind
*** 3751,3760 ****
type = strip_array_types (TREE_TYPE (type));
cookie_addr = fold_build1_loc (input_location, NEGATE_EXPR,
sizetype, TYPE_SIZE_UNIT (sizetype));
! cookie_addr = build2 (POINTER_PLUS_EXPR,
! size_ptr_type,
! fold_convert (size_ptr_type, base),
! cookie_addr);
maxindex = cp_build_indirect_ref (cookie_addr, RO_NULL, complain);
}
else if (TREE_CODE (type) == ARRAY_TYPE)
--- 3747,3754 ----
type = strip_array_types (TREE_TYPE (type));
cookie_addr = fold_build1_loc (input_location, NEGATE_EXPR,
sizetype, TYPE_SIZE_UNIT (sizetype));
! cookie_addr = fold_build_pointer_plus (fold_convert (size_ptr_type, base),
! cookie_addr);
maxindex = cp_build_indirect_ref (cookie_addr, RO_NULL, complain);
}
else if (TREE_CODE (type) == ARRAY_TYPE)
Index: trunk/gcc/cp/rtti.c
===================================================================
*** trunk.orig/gcc/cp/rtti.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/cp/rtti.c 2011-07-11 17:13:24.000000000 +0200
*************** build_headof (tree exp)
*** 192,199 ****
type = cp_build_qualified_type (ptr_type_node,
cp_type_quals (TREE_TYPE (exp)));
! return build2 (POINTER_PLUS_EXPR, type, exp,
! convert_to_integer (sizetype, offset));
}
/* Get a bad_cast node for the program to throw...
--- 192,198 ----
type = cp_build_qualified_type (ptr_type_node,
cp_type_quals (TREE_TYPE (exp)));
! return fold_build_pointer_plus (exp, offset);
}
/* Get a bad_cast node for the program to throw...
*************** tinfo_base_init (tinfo_s *ti, tree targe
*** 918,925 ****
vtable_ptr = cp_build_addr_expr (vtable_ptr, tf_warning_or_error);
/* We need to point into the middle of the vtable. */
! vtable_ptr = build2
! (POINTER_PLUS_EXPR, TREE_TYPE (vtable_ptr), vtable_ptr,
size_binop (MULT_EXPR,
size_int (2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE),
TYPE_SIZE_UNIT (vtable_entry_type)));
--- 917,924 ----
vtable_ptr = cp_build_addr_expr (vtable_ptr, tf_warning_or_error);
/* We need to point into the middle of the vtable. */
! vtable_ptr = fold_build_pointer_plus
! (vtable_ptr,
size_binop (MULT_EXPR,
size_int (2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE),
TYPE_SIZE_UNIT (vtable_entry_type)));
Index: trunk/gcc/cp/typeck.c
===================================================================
*** trunk.orig/gcc/cp/typeck.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/cp/typeck.c 2011-07-11 17:13:24.000000000 +0200
*************** get_member_function_from_ptrfunc (tree *
*** 3078,3085 ****
return error_mark_node;
}
/* ...and then the delta in the PMF. */
! instance_ptr = build2 (POINTER_PLUS_EXPR, TREE_TYPE (instance_ptr),
! instance_ptr, fold_convert (sizetype, delta));
/* Hand back the adjusted 'this' argument to our caller. */
*instance_ptrptr = instance_ptr;
--- 3078,3084 ----
return error_mark_node;
}
/* ...and then the delta in the PMF. */
! instance_ptr = fold_build_pointer_plus (instance_ptr, delta);
/* Hand back the adjusted 'this' argument to our caller. */
*instance_ptrptr = instance_ptr;
*************** get_member_function_from_ptrfunc (tree *
*** 3094,3102 ****
TREE_NO_WARNING (vtbl) = 1;
/* Finally, extract the function pointer from the vtable. */
! e2 = fold_build2_loc (input_location,
! POINTER_PLUS_EXPR, TREE_TYPE (vtbl), vtbl,
! fold_convert (sizetype, idx));
e2 = cp_build_indirect_ref (e2, RO_NULL, tf_warning_or_error);
TREE_CONSTANT (e2) = 1;
--- 3093,3099 ----
TREE_NO_WARNING (vtbl) = 1;
/* Finally, extract the function pointer from the vtable. */
! e2 = fold_build_pointer_plus_loc (input_location, vtbl, idx);
e2 = cp_build_indirect_ref (e2, RO_NULL, tf_warning_or_error);
TREE_CONSTANT (e2) = 1;
*************** cp_build_addr_expr_1 (tree arg, bool str
*** 4841,4848 ****
{
tree type = build_pointer_type (argtype);
tree op0 = fold_convert (type, TREE_OPERAND (val, 0));
! tree op1 = fold_convert (sizetype, fold_offsetof (arg, val));
! return fold_build2 (POINTER_PLUS_EXPR, type, op0, op1);
}
/* Handle complex lvalues (when permitted)
--- 4838,4845 ----
{
tree type = build_pointer_type (argtype);
tree op0 = fold_convert (type, TREE_OPERAND (val, 0));
! tree op1 = fold_offsetof (arg, val);
! return fold_build_pointer_plus (op0, op1);
}
/* Handle complex lvalues (when permitted)
Index: trunk/gcc/cp/typeck2.c
===================================================================
*** trunk.orig/gcc/cp/typeck2.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/cp/typeck2.c 2011-07-11 17:13:24.000000000 +0200
*************** build_m_component_ref (tree datum, tree
*** 1566,1574 ****
/* Build an expression for "object + offset" where offset is the
value stored in the pointer-to-data-member. */
ptype = build_pointer_type (type);
! datum = build2 (POINTER_PLUS_EXPR, ptype,
! fold_convert (ptype, datum),
! build_nop (sizetype, component));
datum = cp_build_indirect_ref (datum, RO_NULL, tf_warning_or_error);
/* If the object expression was an rvalue, return an rvalue. */
if (!is_lval)
--- 1566,1572 ----
/* Build an expression for "object + offset" where offset is the
value stored in the pointer-to-data-member. */
ptype = build_pointer_type (type);
! datum = fold_build_pointer_plus (fold_convert (ptype, datum), component);
datum = cp_build_indirect_ref (datum, RO_NULL, tf_warning_or_error);
/* If the object expression was an rvalue, return an rvalue. */
if (!is_lval)
Index: trunk/gcc/fortran/trans-expr.c
===================================================================
*** trunk.orig/gcc/fortran/trans-expr.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/fortran/trans-expr.c 2011-07-11 17:13:24.000000000 +0200
*************** fill_with_spaces (tree start, tree type,
*** 3788,3795 ****
fold_build2_loc (input_location, MINUS_EXPR, sizetype, i,
TYPE_SIZE_UNIT (type)));
gfc_add_modify (&loop, el,
! fold_build2_loc (input_location, POINTER_PLUS_EXPR,
! TREE_TYPE (el), el, TYPE_SIZE_UNIT (type)));
/* Making the loop... actually loop! */
tmp = gfc_finish_block (&loop);
--- 3788,3795 ----
fold_build2_loc (input_location, MINUS_EXPR, sizetype, i,
TYPE_SIZE_UNIT (type)));
gfc_add_modify (&loop, el,
! fold_build_pointer_plus_loc (input_location,
! el, TYPE_SIZE_UNIT (type)));
/* Making the loop... actually loop! */
tmp = gfc_finish_block (&loop);
*************** gfc_trans_string_copy (stmtblock_t * blo
*** 3915,3922 ****
built_in_decls[BUILT_IN_MEMMOVE],
3, dest, src, slen);
! tmp4 = fold_build2_loc (input_location, POINTER_PLUS_EXPR, TREE_TYPE (dest),
! dest, fold_convert (sizetype, slen));
tmp4 = fill_with_spaces (tmp4, chartype,
fold_build2_loc (input_location, MINUS_EXPR,
TREE_TYPE(dlen), dlen, slen));
--- 3915,3921 ----
built_in_decls[BUILT_IN_MEMMOVE],
3, dest, src, slen);
! tmp4 = fold_build_pointer_plus_loc (input_location, dest, slen);
tmp4 = fill_with_spaces (tmp4, chartype,
fold_build2_loc (input_location, MINUS_EXPR,
TREE_TYPE(dlen), dlen, slen));
Index: trunk/gcc/fortran/trans-intrinsic.c
===================================================================
*** trunk.orig/gcc/fortran/trans-intrinsic.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/fortran/trans-intrinsic.c 2011-07-11 17:13:24.000000000 +0200
*************** gfc_conv_intrinsic_repeat (gfc_se * se,
*** 5998,6006 ****
fold_convert (gfc_charlen_type_node, count));
tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_charlen_type_node,
tmp, fold_convert (gfc_charlen_type_node, size));
! tmp = fold_build2_loc (input_location, POINTER_PLUS_EXPR, pvoid_type_node,
! fold_convert (pvoid_type_node, dest),
! fold_convert (sizetype, tmp));
tmp = build_call_expr_loc (input_location,
built_in_decls[BUILT_IN_MEMMOVE], 3, tmp, src,
fold_build2_loc (input_location, MULT_EXPR,
--- 5998,6005 ----
fold_convert (gfc_charlen_type_node, count));
tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_charlen_type_node,
tmp, fold_convert (gfc_charlen_type_node, size));
! tmp = fold_build_pointer_plus_loc (input_location,
! fold_convert (pvoid_type_node, dest), tmp);
tmp = build_call_expr_loc (input_location,
built_in_decls[BUILT_IN_MEMMOVE], 3, tmp, src,
fold_build2_loc (input_location, MULT_EXPR,
Index: trunk/gcc/fortran/trans-types.c
===================================================================
*** trunk.orig/gcc/fortran/trans-types.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/fortran/trans-types.c 2011-07-11 17:13:24.000000000 +0200
*************** gfc_get_array_descr_info (const_tree typ
*** 2885,2891 ****
t = base_decl;
if (!integer_zerop (data_off))
! t = build2 (POINTER_PLUS_EXPR, ptype, t, data_off);
t = build1 (NOP_EXPR, build_pointer_type (ptr_type_node), t);
info->data_location = build1 (INDIRECT_REF, ptr_type_node, t);
if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
--- 2885,2891 ----
t = base_decl;
if (!integer_zerop (data_off))
! t = fold_build_pointer_plus (t, data_off);
t = build1 (NOP_EXPR, build_pointer_type (ptr_type_node), t);
info->data_location = build1 (INDIRECT_REF, ptr_type_node, t);
if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
*************** gfc_get_array_descr_info (const_tree typ
*** 2898,2909 ****
for (dim = 0; dim < rank; dim++)
{
! t = build2 (POINTER_PLUS_EXPR, ptype, base_decl,
! size_binop (PLUS_EXPR, dim_off, lower_suboff));
t = build1 (INDIRECT_REF, gfc_array_index_type, t);
info->dimen[dim].lower_bound = t;
! t = build2 (POINTER_PLUS_EXPR, ptype, base_decl,
! size_binop (PLUS_EXPR, dim_off, upper_suboff));
t = build1 (INDIRECT_REF, gfc_array_index_type, t);
info->dimen[dim].upper_bound = t;
if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_SHAPE
--- 2898,2911 ----
for (dim = 0; dim < rank; dim++)
{
! t = fold_build_pointer_plus (base_decl,
! size_binop (PLUS_EXPR,
! dim_off, lower_suboff));
t = build1 (INDIRECT_REF, gfc_array_index_type, t);
info->dimen[dim].lower_bound = t;
! t = fold_build_pointer_plus (base_decl,
! size_binop (PLUS_EXPR,
! dim_off, upper_suboff));
t = build1 (INDIRECT_REF, gfc_array_index_type, t);
info->dimen[dim].upper_bound = t;
if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_SHAPE
*************** gfc_get_array_descr_info (const_tree typ
*** 2922,2929 ****
info->dimen[dim].lower_bound,
info->dimen[dim].upper_bound);
}
! t = build2 (POINTER_PLUS_EXPR, ptype, base_decl,
! size_binop (PLUS_EXPR, dim_off, stride_suboff));
t = build1 (INDIRECT_REF, gfc_array_index_type, t);
t = build2 (MULT_EXPR, gfc_array_index_type, t, elem_size);
info->dimen[dim].stride = t;
--- 2924,2932 ----
info->dimen[dim].lower_bound,
info->dimen[dim].upper_bound);
}
! t = fold_build_pointer_plus (base_decl,
! size_binop (PLUS_EXPR,
! dim_off, stride_suboff));
t = build1 (INDIRECT_REF, gfc_array_index_type, t);
t = build2 (MULT_EXPR, gfc_array_index_type, t, elem_size);
info->dimen[dim].stride = t;
Index: trunk/gcc/fortran/trans.c
===================================================================
*** trunk.orig/gcc/fortran/trans.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/fortran/trans.c 2011-07-11 17:13:24.000000000 +0200
*************** gfc_build_array_ref (tree base, tree off
*** 345,353 ****
gfc_array_index_type,
offset, GFC_DECL_SPAN(decl));
tmp = gfc_build_addr_expr (pvoid_type_node, base);
! tmp = fold_build2_loc (input_location, POINTER_PLUS_EXPR,
! pvoid_type_node, tmp,
! fold_convert (sizetype, offset));
tmp = fold_convert (build_pointer_type (type), tmp);
if (!TYPE_STRING_FLAG (type))
tmp = build_fold_indirect_ref_loc (input_location, tmp);
--- 345,351 ----
gfc_array_index_type,
offset, GFC_DECL_SPAN(decl));
tmp = gfc_build_addr_expr (pvoid_type_node, base);
! tmp = fold_build_pointer_plus_loc (input_location, tmp, offset);
tmp = fold_convert (build_pointer_type (type), tmp);
if (!TYPE_STRING_FLAG (type))
tmp = build_fold_indirect_ref_loc (input_location, tmp);
Index: trunk/gcc/java/builtins.c
===================================================================
*** trunk.orig/gcc/java/builtins.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/java/builtins.c 2011-07-11 17:13:24.000000000 +0200
*************** static tree
*** 283,292 ****
build_addr_sum (tree type, tree addr, tree offset)
{
tree ptr_type = build_pointer_type (type);
! return fold_build2 (POINTER_PLUS_EXPR,
! ptr_type,
! fold_convert (ptr_type, addr),
! fold_convert (sizetype, offset));
}
/* Make sure that this-arg is non-NULL. This is a security check. */
--- 283,289 ----
build_addr_sum (tree type, tree addr, tree offset)
{
tree ptr_type = build_pointer_type (type);
! return fold_build_pointer_plus (fold_convert (ptr_type, addr), offset);
}
/* Make sure that this-arg is non-NULL. This is a security check. */
Index: trunk/gcc/java/class.c
===================================================================
*** trunk.orig/gcc/java/class.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/java/class.c 2011-07-11 17:13:24.000000000 +0200
*************** make_class_data (tree type)
*** 2085,2094 ****
PUSH_FIELD_VALUE (v1, "vtable",
(flag_indirect_classes
? null_pointer_node
! : build2 (POINTER_PLUS_EXPR, dtable_ptr_type,
! build1 (ADDR_EXPR, dtable_ptr_type,
! class_dtable_decl),
! dtable_start_offset)));
if (! flag_hash_synchronization)
PUSH_FIELD_VALUE (v1, "sync_info", null_pointer_node);
FINISH_RECORD_CONSTRUCTOR (temp, v1, object_type_node);
--- 2085,2094 ----
PUSH_FIELD_VALUE (v1, "vtable",
(flag_indirect_classes
? null_pointer_node
! : fold_build_pointer_plus
! (build1 (ADDR_EXPR, dtable_ptr_type,
! class_dtable_decl),
! dtable_start_offset)));
if (! flag_hash_synchronization)
PUSH_FIELD_VALUE (v1, "sync_info", null_pointer_node);
FINISH_RECORD_CONSTRUCTOR (temp, v1, object_type_node);
*************** make_class_data (tree type)
*** 2131,2140 ****
PUSH_FIELD_VALUE (v2, "vtable",
(flag_indirect_dispatch || dtable_decl == NULL_TREE
? null_pointer_node
! : build2 (POINTER_PLUS_EXPR, dtable_ptr_type,
! build1 (ADDR_EXPR, dtable_ptr_type,
! dtable_decl),
! dtable_start_offset)));
add_table_and_syms (&v2, TYPE_OTABLE_METHODS (type),
"otable", TYPE_OTABLE_DECL (type), otable_ptr_type,
"otable_syms", TYPE_OTABLE_SYMS_DECL (type));
--- 2131,2140 ----
PUSH_FIELD_VALUE (v2, "vtable",
(flag_indirect_dispatch || dtable_decl == NULL_TREE
? null_pointer_node
! : fold_build_pointer_plus
! (build1 (ADDR_EXPR, dtable_ptr_type,
! dtable_decl),
! dtable_start_offset)));
add_table_and_syms (&v2, TYPE_OTABLE_METHODS (type),
"otable", TYPE_OTABLE_DECL (type), otable_ptr_type,
"otable_syms", TYPE_OTABLE_SYMS_DECL (type));
*************** build_symbol_entry (tree decl, tree spec
*** 2896,2903 ****
system that this is a "special" symbol, i.e. one that should
bypass access controls. */
if (special != NULL_TREE)
! signature = build2 (POINTER_PLUS_EXPR, TREE_TYPE (signature), signature,
! fold_convert (sizetype, special));
return build_symbol_table_entry (clname, name, signature);
}
--- 2896,2902 ----
system that this is a "special" symbol, i.e. one that should
bypass access controls. */
if (special != NULL_TREE)
! signature = fold_build_pointer_plus (signature, special);
return build_symbol_table_entry (clname, name, signature);
}
Index: trunk/gcc/java/except.c
===================================================================
*** trunk.orig/gcc/java/except.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/java/except.c 2011-07-11 17:13:24.000000000 +0200
*************** build_exception_object_ref (tree type)
*** 488,494 ****
The java object is immediately before the generic exception header. */
obj = build_exception_object_var ();
obj = fold_convert (build_pointer_type (type), obj);
! obj = build2 (POINTER_PLUS_EXPR, TREE_TYPE (obj), obj,
fold_build1 (NEGATE_EXPR, sizetype,
TYPE_SIZE_UNIT (TREE_TYPE (obj))));
obj = build1 (INDIRECT_REF, type, obj);
--- 488,494 ----
The java object is immediately before the generic exception header. */
obj = build_exception_object_var ();
obj = fold_convert (build_pointer_type (type), obj);
! obj = fold_build_pointer_plus (obj,
fold_build1 (NEGATE_EXPR, sizetype,
TYPE_SIZE_UNIT (TREE_TYPE (obj))));
obj = build1 (INDIRECT_REF, type, obj);
Index: trunk/gcc/java/expr.c
===================================================================
*** trunk.orig/gcc/java/expr.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/java/expr.c 2011-07-11 17:13:24.000000000 +0200
*************** build_java_arrayaccess (tree array, tree
*** 936,942 ****
size_exp);
/* Sum the byte offset and the address of the data field. */
! node = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (node), node, index);
/* Finally, return
--- 936,942 ----
size_exp);
/* Sum the byte offset and the address of the data field. */
! node = fold_build_pointer_plus (node, index);
/* Finally, return
*************** build_field_ref (tree self_value, tree s
*** 1743,1754 ****
1, otable_index),
field_offset);
- field_offset = fold (convert (sizetype, field_offset));
self_value = java_check_reference (self_value, check);
! address
! = fold_build2 (POINTER_PLUS_EXPR,
! TREE_TYPE (self_value),
! self_value, field_offset);
address = fold_convert (build_pointer_type (TREE_TYPE (field_decl)),
address);
return fold_build1 (INDIRECT_REF, TREE_TYPE (field_decl), address);
--- 1743,1750 ----
1, otable_index),
field_offset);
self_value = java_check_reference (self_value, check);
! address = fold_build_pointer_plus (self_value, field_offset);
address = fold_convert (build_pointer_type (TREE_TYPE (field_decl)),
address);
return fold_build1 (INDIRECT_REF, TREE_TYPE (field_decl), address);
*************** build_known_method_ref (tree method, tre
*** 2255,2262 ****
method_index++;
}
method_index *= int_size_in_bytes (method_type_node);
! ref = fold_build2 (POINTER_PLUS_EXPR, method_ptr_type_node,
! ref, size_int (method_index));
ref = build1 (INDIRECT_REF, method_type_node, ref);
func = build3 (COMPONENT_REF, nativecode_ptr_type_node,
ref, lookup_field (&method_type_node, ncode_ident),
--- 2251,2257 ----
method_index++;
}
method_index *= int_size_in_bytes (method_type_node);
! ref = fold_build_pointer_plus_hwi (ref, method_index);
ref = build1 (INDIRECT_REF, method_type_node, ref);
func = build3 (COMPONENT_REF, nativecode_ptr_type_node,
ref, lookup_field (&method_type_node, ncode_ident),
*************** build_invokevirtual (tree dtable, tree m
*** 2349,2356 ****
size_int (TARGET_VTABLE_USES_DESCRIPTORS));
}
! func = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dtable), dtable,
! convert (sizetype, method_index));
if (TARGET_VTABLE_USES_DESCRIPTORS)
func = build1 (NOP_EXPR, nativecode_ptr_type_node, func);
--- 2344,2350 ----
size_int (TARGET_VTABLE_USES_DESCRIPTORS));
}
! func = fold_build_pointer_plus (dtable, method_index);
if (TARGET_VTABLE_USES_DESCRIPTORS)
func = build1 (NOP_EXPR, nativecode_ptr_type_node, func);
Index: trunk/gcc/objc/objc-next-runtime-abi-02.c
===================================================================
*** trunk.orig/gcc/objc/objc-next-runtime-abi-02.c 2011-07-11 17:12:41.000000000 +0200
--- trunk/gcc/objc/objc-next-runtime-abi-02.c 2011-07-11 17:13:24.000000000 +0200
*************** objc_v2_build_ivar_ref (tree datum, tree
*** 1381,1388 ****
string_type_node, build_fold_addr_expr (datum));
/* (char*)datum + offset */
! expr = fold_build2_loc (input_location,
! POINTER_PLUS_EXPR, string_type_node, expr, offset);
/* (ftype*)((char*)datum + offset) */
expr = build_c_cast (input_location, build_pointer_type (ftype), expr);
--- 1381,1387 ----
string_type_node, build_fold_addr_expr (datum));
/* (char*)datum + offset */
! expr = fold_build_pointer_plus_loc (input_location, expr, offset);
/* (ftype*)((char*)datum + offset) */
expr = build_c_cast (input_location, build_pointer_type (ftype), expr);
*************** objc2_build_ehtype_initializer (tree nam
*** 3486,3492 ****
}
addr = build_fold_addr_expr_with_type (next_v2_ehvtable_decl, ptr_type_node);
offs = size_int (2 * int_cst_value (TYPE_SIZE_UNIT (ptr_type_node)));
! addr = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, addr, offs);
CONSTRUCTOR_APPEND_ELT (initlist, NULL_TREE, addr);
--- 3485,3491 ----
}
addr = build_fold_addr_expr_with_type (next_v2_ehvtable_decl, ptr_type_node);
offs = size_int (2 * int_cst_value (TYPE_SIZE_UNIT (ptr_type_node)));
! addr = fold_build_pointer_plus (addr, offs);
CONSTRUCTOR_APPEND_ELT (initlist, NULL_TREE, addr);
Index: trunk/gcc/tree.h
===================================================================
*** trunk.orig/gcc/tree.h 2011-07-11 17:13:09.000000000 +0200
--- trunk/gcc/tree.h 2011-07-11 17:14:36.000000000 +0200
*************** truth_value_p (enum tree_code code)
*** 5316,5321 ****
--- 5316,5340 ----
|| code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
}
+ /* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF. */
+ static inline tree
+ fold_build_pointer_plus_loc (location_t loc, tree ptr, tree off)
+ {
+ return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
+ ptr, fold_convert_loc (loc, sizetype, off));
+ }
+ #define fold_build_pointer_plus(p,o) \
+ fold_build_pointer_plus_loc (UNKNOWN_LOCATION, p, o)
+
+ /* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF. */
+ static inline tree
+ fold_build_pointer_plus_hwi_loc (location_t loc, tree ptr, HOST_WIDE_INT off)
+ {
+ return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
+ ptr, size_int (off));
+ }
+ #define fold_build_pointer_plus_hwi(p,o) \
+ fold_build_pointer_plus_hwi_loc (UNKNOWN_LOCATION, p, o)
/* In builtins.c */
extern tree fold_call_expr (location_t, tree, bool);
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH][1/N][C][C++][Fortran][Java] Change POINTER_PLUS_EXPR offset type requirements
2011-07-12 10:52 [PATCH][1/N][C][C++][Fortran][Java] Change POINTER_PLUS_EXPR offset type requirements Richard Guenther
@ 2011-07-12 12:30 ` Tobias Burnus
2011-07-12 13:08 ` Jason Merrill
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Tobias Burnus @ 2011-07-12 12:30 UTC (permalink / raw)
To: Richard Guenther; +Cc: gcc-patches, fortran
On 07/12/2011 12:33 PM, Richard Guenther wrote:
> Bootstrapped and tested on x86_64-unknown-linux-gnu for all languages.
>
> Are the frontend parts ok?
The Fortran bits are OK.
Tobias
> 2011-07-12 Richard Guenther<rguenther@suse.de>
>
> fortran/
> * trans-expr.c (fill_with_spaces): Use fold_build_pointer_plus.
> (gfc_trans_string_copy): Likewise.
> * trans-intrinsic.c (gfc_conv_intrinsic_repeat): Likewise.
> * trans-types.c (gfc_get_array_descr_info): Likewise.
> * trans.c (gfc_build_array_ref): Likewise.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH][1/N][C][C++][Fortran][Java] Change POINTER_PLUS_EXPR offset type requirements
2011-07-12 10:52 [PATCH][1/N][C][C++][Fortran][Java] Change POINTER_PLUS_EXPR offset type requirements Richard Guenther
2011-07-12 12:30 ` Tobias Burnus
@ 2011-07-12 13:08 ` Jason Merrill
2011-07-12 15:06 ` [PATCH][1/N][C][C++][Fortran]Change " Tom Tromey
2011-07-14 11:42 ` [PATCH][1/N][C][C++][Fortran][Java] Change " Richard Guenther
3 siblings, 0 replies; 6+ messages in thread
From: Jason Merrill @ 2011-07-12 13:08 UTC (permalink / raw)
To: Richard Guenther; +Cc: gcc-patches, fortran, java, Joseph S. Myers, aph, tromey
The C++ changes are OK.
Jason
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH][1/N][C][C++][Fortran]Change POINTER_PLUS_EXPR offset type requirements
2011-07-12 10:52 [PATCH][1/N][C][C++][Fortran][Java] Change POINTER_PLUS_EXPR offset type requirements Richard Guenther
2011-07-12 12:30 ` Tobias Burnus
2011-07-12 13:08 ` Jason Merrill
@ 2011-07-12 15:06 ` Tom Tromey
2011-07-14 11:42 ` [PATCH][1/N][C][C++][Fortran][Java] Change " Richard Guenther
3 siblings, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2011-07-12 15:06 UTC (permalink / raw)
To: Richard Guenther; +Cc: gcc-patches, fortran, java, jason, Joseph S. Myers, aph
>>>>> "Richard" == Richard Guenther <rguenther@suse.de> writes:
Richard> java/
Richard> * builtins.c (static): Use fold_build_pointer_plus.
Richard> * class.c (make_class_data): Likewise.
Richard> (build_symbol_entry): Likewise.
Richard> * except.c (build_exception_object_ref): Likewise.
Richard> * expr.c (build_java_arrayaccess): Likewise.
Richard> (build_field_ref): Likewise.
Richard> (build_known_method_ref): Likewise.
Richard> (build_invokevirtual): Likewise.
Ok.
Tom
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH][1/N][C][C++][Fortran][Java] Change POINTER_PLUS_EXPR offset type requirements
2011-07-12 10:52 [PATCH][1/N][C][C++][Fortran][Java] Change POINTER_PLUS_EXPR offset type requirements Richard Guenther
` (2 preceding siblings ...)
2011-07-12 15:06 ` [PATCH][1/N][C][C++][Fortran]Change " Tom Tromey
@ 2011-07-14 11:42 ` Richard Guenther
2011-07-14 14:38 ` Richard Henderson
3 siblings, 1 reply; 6+ messages in thread
From: Richard Guenther @ 2011-07-14 11:42 UTC (permalink / raw)
To: gcc-patches; +Cc: rth
[-- Attachment #1: Type: TEXT/PLAIN, Size: 136158 bytes --]
On Tue, 12 Jul 2011, Richard Guenther wrote:
>
> This patch is step 1, it abstracts away the type of the offset operand
> when building a POINTER_PLUS_EXPR. It does so by introducing
> fold_build_pointer_plus_expr{_hwi,_loc} helpers and use them in all
> places that currently build POINTER_PLUS_EXPRs (including those
> that do not fold the result). This patch will make steps 2 and more
> purely middle-end (fingers crossed).
>
> Bootstrapped and tested on x86_64-unknown-linux-gnu for all languages.
>
> I also built cc1 for all supported targets via contrib/config-list.mk
> and saw no fails that relate to this patch.
>
> Are the frontend parts ok?
Ping. Joseph seems to be on vacation - Richard, can you approve
the C frontend/family parts?
Thanks,
Richard.
> 2011-07-12 Richard Guenther <rguenther@suse.de>
>
> * tree.h (fold_build_pointer_plus_loc): New helper function.
> (fold_build_pointer_plus_hwi_loc): Likewise.
> (fold_build_pointer_plus): Define.
> (fold_build_pointer_plus_hwi): Likewise.
>
> * builtins.c (std_gimplify_va_arg_expr): Use fold_build_pointer_plus.
> (fold_builtin_memory_op): Likewise.
> (fold_builtin_stpcpy): Likewise.
> (fold_builtin_memchr): Likewise.
> (fold_builtin_strstr): Likewise.
> (fold_builtin_strchr): Likewise.
> (fold_builtin_strrchr): Likewise.
> (fold_builtin_strpbrk): Likewise.
> (fold_builtin_strcat): Likewise.
> (expand_builtin_memory_chk): Likewise.
> (fold_builtin_memory_chk): Likewise.
> * c-typeck.c (build_unary_op): Likewise.
> * cgraphunit.c (thunk_adjust): Likewise.
> * fold-const.c (build_range_check): Likewise.
> (fold_binary_loc): Likewise.
> * omp-low.c (extract_omp_for_data): Likewise.
> (expand_omp_for_generic): Likewise.
> (expand_omp_for_static_nochunk): Likewise.
> (expand_omp_for_static_chunk): Likewise.
> * tree-affine.c (add_elt_to_tree): Likewise.
> * tree-data-ref.c (split_constant_offset_1): Likewise.
> * tree-loop-distribution.c (generate_memset_zero): Likewise.
> * tree-mudflap.c (mf_xform_derefs_1): Likewise.
> * tree-predcom.c (ref_at_iteration): Likewise.
> * tree-ssa-address.c (tree_mem_ref_addr): Likewise.
> (add_to_parts): Likewise.
> (create_mem_ref): Likewise.
> * tree-ssa-loop-ivopts.c (force_expr_to_var_cost): Likewise.
> * tree-ssa-loop-niter.c (number_of_iterations_lt_to_ne): Likewise.
> (number_of_iterations_le): Likewise.
> * tree-ssa-loop-prefetch.c (issue_prefetch_ref): Likewise.
> * tree-vect-data-refs.c (vect_analyze_data_refs): Likewise.
> (vect_create_addr_base_for_vector_ref): Likewise.
> * tree-vect-loop-manip.c (vect_update_ivs_after_vectorizer): Likewise.
> (vect_create_cond_for_alias_checks): Likewise.
> * tree-vrp.c (extract_range_from_assert): Likewise.
>
> * config/alpha/alpha.c (alpha_va_start): Likewise.
> (alpha_gimplify_va_arg_1): Likewise.
> * config/i386/i386.c (ix86_va_start): Likewise.
> (ix86_gimplify_va_arg): Likewise.
> * config/ia64/ia64.c (ia64_gimplify_va_arg): Likewise.
> * config/mep/mep.c (mep_expand_va_start): Likewise.
> (mep_gimplify_va_arg_expr): Likewise.
> * config/mips/mips.c (mips_va_start): Likewise.
> (mips_gimplify_va_arg_expr): Likewise.
> * config/pa/pa.c (hppa_gimplify_va_arg_expr): Likewise.
> * config/rs6000/rs6000.c (rs6000_va_start): Likewise.
> (rs6000_gimplify_va_arg): Likewise.
> * config/s390/s390.c (s390_va_start): Likewise.
> (s390_gimplify_va_arg): Likewise.
> * config/sh/sh.c (sh_va_start): Likewise.
> (sh_gimplify_va_arg_expr): Likewise.
> * config/sparc/sparc.c (sparc_gimplify_va_arg): Likewise.
> * config/spu/spu.c (spu_va_start): Likewise.
> (spu_gimplify_va_arg_expr): Likewise.
> * config/stormy16/stormy16.c (xstormy16_expand_builtin_va_start):
> Likewise.
> (xstormy16_gimplify_va_arg_expr): Likewise.
> * config/xtensa/xtensa.c (xtensa_va_start): Likewise.
> (xtensa_gimplify_va_arg_expr): Likewise.
>
> c-family/
> * c-common.c (pointer_int_sum): Use fold_build_pointer_plus.
> * c-omp.c (c_finish_omp_for): Likewise.
>
> cp/
> * call.c (build_special_member_call): Use fold_build_pointer_plus.
> * class.c (build_base_path): Likewise.
> (convert_to_base_statically): Likewise.
> (dfs_accumulate_vtbl_inits): Likewise.
> * cp-gimplify.c (cxx_omp_clause_apply_fn): Likewise.
> * except.c (expand_start_catch_block): Likewise.
> * init.c (expand_virtual_init): Likewise.
> (build_new_1): Likewise.
> (build_vec_delete_1): Likewise.
> (build_vec_delete): Likewise.
> * rtti.c (build_headof): Likewise.
> (tinfo_base_init): Likewise.
> * typeck.c (get_member_function_from_ptrfunc): Likewise.
> (cp_build_addr_expr_1): Likewise.
> * typeck2.c (build_m_component_ref): Likewise.
>
> fortran/
> * trans-expr.c (fill_with_spaces): Use fold_build_pointer_plus.
> (gfc_trans_string_copy): Likewise.
> * trans-intrinsic.c (gfc_conv_intrinsic_repeat): Likewise.
> * trans-types.c (gfc_get_array_descr_info): Likewise.
> * trans.c (gfc_build_array_ref): Likewise.
>
> java/
> * builtins.c (static): Use fold_build_pointer_plus.
> * class.c (make_class_data): Likewise.
> (build_symbol_entry): Likewise.
> * except.c (build_exception_object_ref): Likewise.
> * expr.c (build_java_arrayaccess): Likewise.
> (build_field_ref): Likewise.
> (build_known_method_ref): Likewise.
> (build_invokevirtual): Likewise.
>
> objc/
> * objc-next-runtime-abi-02.c (objc_v2_build_ivar_ref):
> Use fold_build_pointer_plus.
> (objc2_build_ehtype_initializer): Likewise.
>
> Index: trunk/gcc/builtins.c
> ===================================================================
> *** trunk.orig/gcc/builtins.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/builtins.c 2011-07-11 17:13:24.000000000 +0200
> *************** std_gimplify_va_arg_expr (tree valist, t
> *** 4236,4244 ****
> && !integer_zerop (TYPE_SIZE (type)))
> {
> t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
> ! fold_build2 (POINTER_PLUS_EXPR,
> ! TREE_TYPE (valist),
> ! valist_tmp, size_int (boundary - 1)));
> gimplify_and_add (t, pre_p);
>
> t = fold_convert (sizetype, valist_tmp);
> --- 4236,4242 ----
> && !integer_zerop (TYPE_SIZE (type)))
> {
> t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
> ! fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
> gimplify_and_add (t, pre_p);
>
> t = fold_convert (sizetype, valist_tmp);
> *************** std_gimplify_va_arg_expr (tree valist, t
> *** 4277,4288 ****
> rounded_size, size_int (align));
> t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
> size_binop (MINUS_EXPR, rounded_size, type_size));
> ! addr = fold_build2 (POINTER_PLUS_EXPR,
> ! TREE_TYPE (addr), addr, t);
> }
>
> /* Compute new value for AP. */
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (valist), valist_tmp, rounded_size);
> t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
> gimplify_and_add (t, pre_p);
>
> --- 4275,4285 ----
> rounded_size, size_int (align));
> t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
> size_binop (MINUS_EXPR, rounded_size, type_size));
> ! addr = fold_build_pointer_plus (addr, t);
> }
>
> /* Compute new value for AP. */
> ! t = fold_build_pointer_plus (valist_tmp, rounded_size);
> t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
> gimplify_and_add (t, pre_p);
>
> *************** fold_builtin_memory_op (location_t loc,
> *** 8222,8229 ****
> len = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (len), len,
> ssize_int (1));
>
> ! len = fold_convert_loc (loc, sizetype, len);
> ! dest = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
> dest = fold_convert_loc (loc, type, dest);
> if (expr)
> dest = omit_one_operand_loc (loc, type, dest, expr);
> --- 8219,8225 ----
> len = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (len), len,
> ssize_int (1));
>
> ! dest = fold_build_pointer_plus_loc (loc, dest, len);
> dest = fold_convert_loc (loc, type, dest);
> if (expr)
> dest = omit_one_operand_loc (loc, type, dest, expr);
> *************** fold_builtin_stpcpy (location_t loc, tre
> *** 8299,8306 ****
> call = build_call_expr_loc (loc, fn, 3, dest, src, lenp1);
>
> type = TREE_TYPE (TREE_TYPE (fndecl));
> ! len = fold_convert_loc (loc, sizetype, len);
> ! dest = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
> dest = fold_convert_loc (loc, type, dest);
> dest = omit_one_operand_loc (loc, type, dest, call);
> return dest;
> --- 8295,8301 ----
> call = build_call_expr_loc (loc, fn, 3, dest, src, lenp1);
>
> type = TREE_TYPE (TREE_TYPE (fndecl));
> ! dest = fold_build_pointer_plus_loc (loc, dest, len);
> dest = fold_convert_loc (loc, type, dest);
> dest = omit_one_operand_loc (loc, type, dest, call);
> return dest;
> *************** fold_builtin_memchr (location_t loc, tre
> *** 8387,8394 ****
> if (r == NULL)
> return build_int_cst (TREE_TYPE (arg1), 0);
>
> ! tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (arg1), arg1,
> ! size_int (r - p1));
> return fold_convert_loc (loc, type, tem);
> }
> return NULL_TREE;
> --- 8382,8388 ----
> if (r == NULL)
> return build_int_cst (TREE_TYPE (arg1), 0);
>
> ! tem = fold_build_pointer_plus_hwi_loc (loc, arg1, r - p1);
> return fold_convert_loc (loc, type, tem);
> }
> return NULL_TREE;
> *************** fold_builtin_strstr (location_t loc, tre
> *** 10775,10782 ****
> return build_int_cst (TREE_TYPE (s1), 0);
>
> /* Return an offset into the constant string argument. */
> ! tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
> ! s1, size_int (r - p1));
> return fold_convert_loc (loc, type, tem);
> }
>
> --- 10769,10775 ----
> return build_int_cst (TREE_TYPE (s1), 0);
>
> /* Return an offset into the constant string argument. */
> ! tem = fold_build_pointer_plus_hwi_loc (loc, s1, r - p1);
> return fold_convert_loc (loc, type, tem);
> }
>
> *************** fold_builtin_strchr (location_t loc, tre
> *** 10846,10853 ****
> return build_int_cst (TREE_TYPE (s1), 0);
>
> /* Return an offset into the constant string argument. */
> ! tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
> ! s1, size_int (r - p1));
> return fold_convert_loc (loc, type, tem);
> }
> return NULL_TREE;
> --- 10839,10845 ----
> return build_int_cst (TREE_TYPE (s1), 0);
>
> /* Return an offset into the constant string argument. */
> ! tem = fold_build_pointer_plus_hwi_loc (loc, s1, r - p1);
> return fold_convert_loc (loc, type, tem);
> }
> return NULL_TREE;
> *************** fold_builtin_strrchr (location_t loc, tr
> *** 10902,10909 ****
> return build_int_cst (TREE_TYPE (s1), 0);
>
> /* Return an offset into the constant string argument. */
> ! tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
> ! s1, size_int (r - p1));
> return fold_convert_loc (loc, type, tem);
> }
>
> --- 10894,10900 ----
> return build_int_cst (TREE_TYPE (s1), 0);
>
> /* Return an offset into the constant string argument. */
> ! tem = fold_build_pointer_plus_hwi_loc (loc, s1, r - p1);
> return fold_convert_loc (loc, type, tem);
> }
>
> *************** fold_builtin_strpbrk (location_t loc, tr
> *** 10962,10969 ****
> return build_int_cst (TREE_TYPE (s1), 0);
>
> /* Return an offset into the constant string argument. */
> ! tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
> ! s1, size_int (r - p1));
> return fold_convert_loc (loc, type, tem);
> }
>
> --- 10953,10959 ----
> return build_int_cst (TREE_TYPE (s1), 0);
>
> /* Return an offset into the constant string argument. */
> ! tem = fold_build_pointer_plus_hwi_loc (loc, s1, r - p1);
> return fold_convert_loc (loc, type, tem);
> }
>
> *************** fold_builtin_strcat (location_t loc ATTR
> *** 11047,11054 ****
> newdst = build_call_expr_loc (loc, strlen_fn, 1, dst);
> /* Create (dst p+ strlen (dst)). */
>
> ! newdst = fold_build2_loc (loc, POINTER_PLUS_EXPR,
> ! TREE_TYPE (dst), dst, newdst);
> newdst = builtin_save_expr (newdst);
>
> call = build_call_expr_loc (loc, strcpy_fn, 2, newdst, src);
> --- 11037,11043 ----
> newdst = build_call_expr_loc (loc, strlen_fn, 1, dst);
> /* Create (dst p+ strlen (dst)). */
>
> ! newdst = fold_build_pointer_plus_loc (loc, dst, newdst);
> newdst = builtin_save_expr (newdst);
>
> call = build_call_expr_loc (loc, strcpy_fn, 2, newdst, src);
> *************** expand_builtin_memory_chk (tree exp, rtx
> *** 11721,11727 ****
> return expand_expr (dest, target, mode, EXPAND_NORMAL);
> }
>
> ! expr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
> return expand_expr (expr, target, mode, EXPAND_NORMAL);
> }
>
> --- 11710,11716 ----
> return expand_expr (dest, target, mode, EXPAND_NORMAL);
> }
>
> ! expr = fold_build_pointer_plus (dest, len);
> return expand_expr (expr, target, mode, EXPAND_NORMAL);
> }
>
> *************** fold_builtin_memory_chk (location_t loc,
> *** 11981,11988 ****
> dest, len);
> else
> {
> ! tree temp = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest),
> ! dest, len);
> return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), temp);
> }
> }
> --- 11970,11976 ----
> dest, len);
> else
> {
> ! tree temp = fold_build_pointer_plus_loc (loc, dest, len);
> return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), temp);
> }
> }
> Index: trunk/gcc/c-typeck.c
> ===================================================================
> *** trunk.orig/gcc/c-typeck.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/c-typeck.c 2011-07-11 17:13:24.000000000 +0200
> *************** build_unary_op (location_t location,
> *** 3789,3799 ****
> if (val && TREE_CODE (val) == INDIRECT_REF
> && TREE_CONSTANT (TREE_OPERAND (val, 0)))
> {
> ! tree op0 = fold_convert_loc (location, sizetype,
> ! fold_offsetof (arg, val)), op1;
>
> op1 = fold_convert_loc (location, argtype, TREE_OPERAND (val, 0));
> ! ret = fold_build2_loc (location, POINTER_PLUS_EXPR, argtype, op1, op0);
> goto return_build_unary_op;
> }
>
> --- 3789,3798 ----
> if (val && TREE_CODE (val) == INDIRECT_REF
> && TREE_CONSTANT (TREE_OPERAND (val, 0)))
> {
> ! tree op0 = fold_offsetof (arg, val), op1;
>
> op1 = fold_convert_loc (location, argtype, TREE_OPERAND (val, 0));
> ! ret = fold_build_pointer_plus_loc (location, op1, op0);
> goto return_build_unary_op;
> }
>
> Index: trunk/gcc/cgraphunit.c
> ===================================================================
> *** trunk.orig/gcc/cgraphunit.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/cgraphunit.c 2011-07-11 17:13:24.000000000 +0200
> *************** thunk_adjust (gimple_stmt_iterator * bsi
> *** 1458,1468 ****
> if (this_adjusting
> && fixed_offset != 0)
> {
> ! stmt = gimple_build_assign (ptr,
> ! fold_build2_loc (input_location,
> ! POINTER_PLUS_EXPR,
> ! TREE_TYPE (ptr), ptr,
> ! size_int (fixed_offset)));
> gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
> }
>
> --- 1458,1467 ----
> if (this_adjusting
> && fixed_offset != 0)
> {
> ! stmt = gimple_build_assign
> ! (ptr, fold_build_pointer_plus_hwi_loc (input_location,
> ! ptr,
> ! fixed_offset));
> gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
> }
>
> *************** thunk_adjust (gimple_stmt_iterator * bsi
> *** 1508,1519 ****
>
> /* Find the entry with the vcall offset. */
> stmt = gimple_build_assign (vtabletmp2,
> ! fold_build2_loc (input_location,
> ! POINTER_PLUS_EXPR,
> ! TREE_TYPE (vtabletmp2),
> ! vtabletmp2,
> ! fold_convert (sizetype,
> ! virtual_offset)));
> gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
>
> /* Get the offset itself. */
> --- 1507,1515 ----
>
> /* Find the entry with the vcall offset. */
> stmt = gimple_build_assign (vtabletmp2,
> ! fold_build_pointer_plus_loc (input_location,
> ! vtabletmp2,
> ! virtual_offset));
> gsi_insert_after (bsi, stmt, GSI_NEW_STMT);
>
> /* Get the offset itself. */
> *************** thunk_adjust (gimple_stmt_iterator * bsi
> *** 1533,1541 ****
> find_referenced_vars_in (stmt);
>
> /* Adjust the `this' pointer. */
> ! ptr = fold_build2_loc (input_location,
> ! POINTER_PLUS_EXPR, TREE_TYPE (ptr), ptr,
> ! offsettmp);
> }
>
> if (!this_adjusting
> --- 1529,1535 ----
> find_referenced_vars_in (stmt);
>
> /* Adjust the `this' pointer. */
> ! ptr = fold_build_pointer_plus_loc (input_location, ptr, offsettmp);
> }
>
> if (!this_adjusting
> *************** thunk_adjust (gimple_stmt_iterator * bsi
> *** 1554,1562 ****
> mark_symbols_for_renaming (stmt);
> find_referenced_vars_in (stmt);
> }
> ! ptr = fold_build2_loc (input_location,
> ! POINTER_PLUS_EXPR, TREE_TYPE (ptrtmp), ptrtmp,
> ! size_int (fixed_offset));
> }
>
> /* Emit the statement and gimplify the adjustment expression. */
> --- 1548,1555 ----
> mark_symbols_for_renaming (stmt);
> find_referenced_vars_in (stmt);
> }
> ! ptr = fold_build_pointer_plus_hwi_loc (input_location,
> ! ptrtmp, fixed_offset);
> }
>
> /* Emit the statement and gimplify the adjustment expression. */
> Index: trunk/gcc/fold-const.c
> ===================================================================
> *** trunk.orig/gcc/fold-const.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/fold-const.c 2011-07-11 17:13:24.000000000 +0200
> *************** build_range_check (location_t loc, tree
> *** 4221,4228 ****
> low = fold_convert_loc (loc, sizetype, low);
> low = fold_build1_loc (loc, NEGATE_EXPR, sizetype, low);
> return build_range_check (loc, type,
> ! fold_build2_loc (loc, POINTER_PLUS_EXPR,
> ! etype, exp, low),
> 1, build_int_cst (etype, 0), value);
> }
> return 0;
> --- 4221,4227 ----
> low = fold_convert_loc (loc, sizetype, low);
> low = fold_build1_loc (loc, NEGATE_EXPR, sizetype, low);
> return build_range_check (loc, type,
> ! fold_build_pointer_plus_loc (loc, exp, low),
> 1, build_int_cst (etype, 0), value);
> }
> return 0;
> *************** fold_binary_loc (location_t loc,
> *** 9584,9592 ****
> inner = fold_build2_loc (loc, PLUS_EXPR, sizetype,
> arg01, fold_convert_loc (loc, sizetype, arg1));
> return fold_convert_loc (loc, type,
> ! fold_build2_loc (loc, POINTER_PLUS_EXPR,
> ! TREE_TYPE (arg00),
> ! arg00, inner));
> }
>
> /* PTR_CST +p CST -> CST1 */
> --- 9583,9590 ----
> inner = fold_build2_loc (loc, PLUS_EXPR, sizetype,
> arg01, fold_convert_loc (loc, sizetype, arg1));
> return fold_convert_loc (loc, type,
> ! fold_build_pointer_plus_loc (loc,
> ! arg00, inner));
> }
>
> /* PTR_CST +p CST -> CST1 */
> Index: trunk/gcc/omp-low.c
> ===================================================================
> *** trunk.orig/gcc/omp-low.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/omp-low.c 2011-07-11 17:13:24.000000000 +0200
> *************** extract_omp_for_data (gimple for_stmt, s
> *** 310,318 ****
> break;
> case LE_EXPR:
> if (POINTER_TYPE_P (TREE_TYPE (loop->n2)))
> ! loop->n2 = fold_build2_loc (loc,
> ! POINTER_PLUS_EXPR, TREE_TYPE (loop->n2),
> ! loop->n2, size_one_node);
> else
> loop->n2 = fold_build2_loc (loc,
> PLUS_EXPR, TREE_TYPE (loop->n2), loop->n2,
> --- 310,316 ----
> break;
> case LE_EXPR:
> if (POINTER_TYPE_P (TREE_TYPE (loop->n2)))
> ! loop->n2 = fold_build_pointer_plus_hwi_loc (loc, loop->n2, 1);
> else
> loop->n2 = fold_build2_loc (loc,
> PLUS_EXPR, TREE_TYPE (loop->n2), loop->n2,
> *************** extract_omp_for_data (gimple for_stmt, s
> *** 321,329 ****
> break;
> case GE_EXPR:
> if (POINTER_TYPE_P (TREE_TYPE (loop->n2)))
> ! loop->n2 = fold_build2_loc (loc,
> ! POINTER_PLUS_EXPR, TREE_TYPE (loop->n2),
> ! loop->n2, size_int (-1));
> else
> loop->n2 = fold_build2_loc (loc,
> MINUS_EXPR, TREE_TYPE (loop->n2), loop->n2,
> --- 319,325 ----
> break;
> case GE_EXPR:
> if (POINTER_TYPE_P (TREE_TYPE (loop->n2)))
> ! loop->n2 = fold_build_pointer_plus_hwi_loc (loc, loop->n2, -1);
> else
> loop->n2 = fold_build2_loc (loc,
> MINUS_EXPR, TREE_TYPE (loop->n2), loop->n2,
> *************** expand_omp_for_generic (struct omp_regio
> *** 3914,3921 ****
> t = fold_build2 (MULT_EXPR, itype, t,
> fold_convert (itype, fd->loops[i].step));
> if (POINTER_TYPE_P (vtype))
> ! t = fold_build2 (POINTER_PLUS_EXPR, vtype,
> ! fd->loops[i].n1, fold_convert (sizetype, t));
> else
> t = fold_build2 (PLUS_EXPR, itype, fd->loops[i].n1, t);
> t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
> --- 3910,3916 ----
> t = fold_build2 (MULT_EXPR, itype, t,
> fold_convert (itype, fd->loops[i].step));
> if (POINTER_TYPE_P (vtype))
> ! t = fold_build_pointer_plus (fd->loops[i].n1, t);
> else
> t = fold_build2 (PLUS_EXPR, itype, fd->loops[i].n1, t);
> t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
> *************** expand_omp_for_generic (struct omp_regio
> *** 3944,3951 ****
> vback = gimple_omp_continue_control_def (stmt);
>
> if (POINTER_TYPE_P (type))
> ! t = fold_build2 (POINTER_PLUS_EXPR, type, vmain,
> ! fold_convert (sizetype, fd->loop.step));
> else
> t = fold_build2 (PLUS_EXPR, type, vmain, fd->loop.step);
> t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
> --- 3939,3945 ----
> vback = gimple_omp_continue_control_def (stmt);
>
> if (POINTER_TYPE_P (type))
> ! t = fold_build_pointer_plus (vmain, fd->loop.step);
> else
> t = fold_build2 (PLUS_EXPR, type, vmain, fd->loop.step);
> t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
> *************** expand_omp_for_generic (struct omp_regio
> *** 3989,3997 ****
> set_immediate_dominator (CDI_DOMINATORS, bb, last_bb);
>
> if (POINTER_TYPE_P (vtype))
> ! t = fold_build2 (POINTER_PLUS_EXPR, vtype,
> ! fd->loops[i].v,
> ! fold_convert (sizetype, fd->loops[i].step));
> else
> t = fold_build2 (PLUS_EXPR, vtype, fd->loops[i].v,
> fd->loops[i].step);
> --- 3983,3989 ----
> set_immediate_dominator (CDI_DOMINATORS, bb, last_bb);
>
> if (POINTER_TYPE_P (vtype))
> ! t = fold_build_pointer_plus (fd->loops[i].v, fd->loops[i].step);
> else
> t = fold_build2 (PLUS_EXPR, vtype, fd->loops[i].v,
> fd->loops[i].step);
> *************** expand_omp_for_static_nochunk (struct om
> *** 4239,4246 ****
> t = fold_convert (itype, s0);
> t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
> if (POINTER_TYPE_P (type))
> ! t = fold_build2 (POINTER_PLUS_EXPR, type, fd->loop.n1,
> ! fold_convert (sizetype, t));
> else
> t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
> t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
> --- 4231,4237 ----
> t = fold_convert (itype, s0);
> t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
> if (POINTER_TYPE_P (type))
> ! t = fold_build_pointer_plus (fd->loop.n1, t);
> else
> t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
> t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
> *************** expand_omp_for_static_nochunk (struct om
> *** 4251,4258 ****
> t = fold_convert (itype, e0);
> t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
> if (POINTER_TYPE_P (type))
> ! t = fold_build2 (POINTER_PLUS_EXPR, type, fd->loop.n1,
> ! fold_convert (sizetype, t));
> else
> t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
> e = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE,
> --- 4242,4248 ----
> t = fold_convert (itype, e0);
> t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
> if (POINTER_TYPE_P (type))
> ! t = fold_build_pointer_plus (fd->loop.n1, t);
> else
> t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
> e = force_gimple_operand_gsi (&gsi, t, true, NULL_TREE,
> *************** expand_omp_for_static_nochunk (struct om
> *** 4267,4274 ****
> vback = gimple_omp_continue_control_def (stmt);
>
> if (POINTER_TYPE_P (type))
> ! t = fold_build2 (POINTER_PLUS_EXPR, type, vmain,
> ! fold_convert (sizetype, fd->loop.step));
> else
> t = fold_build2 (PLUS_EXPR, type, vmain, fd->loop.step);
> t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
> --- 4257,4263 ----
> vback = gimple_omp_continue_control_def (stmt);
>
> if (POINTER_TYPE_P (type))
> ! t = fold_build_pointer_plus (vmain, fd->loop.step);
> else
> t = fold_build2 (PLUS_EXPR, type, vmain, fd->loop.step);
> t = force_gimple_operand_gsi (&gsi, t, false, NULL_TREE,
> *************** expand_omp_for_static_chunk (struct omp_
> *** 4442,4449 ****
> t = fold_build2 (MULT_EXPR, itype, threadid, fd->chunk_size);
> t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
> if (POINTER_TYPE_P (type))
> ! t = fold_build2 (POINTER_PLUS_EXPR, type, fd->loop.n1,
> ! fold_convert (sizetype, t));
> else
> t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
> v_extra = force_gimple_operand_gsi (&si, t, true, NULL_TREE,
> --- 4431,4437 ----
> t = fold_build2 (MULT_EXPR, itype, threadid, fd->chunk_size);
> t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
> if (POINTER_TYPE_P (type))
> ! t = fold_build_pointer_plus (fd->loop.n1, t);
> else
> t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
> v_extra = force_gimple_operand_gsi (&si, t, true, NULL_TREE,
> *************** expand_omp_for_static_chunk (struct omp_
> *** 4475,4482 ****
> t = fold_convert (itype, s0);
> t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
> if (POINTER_TYPE_P (type))
> ! t = fold_build2 (POINTER_PLUS_EXPR, type, fd->loop.n1,
> ! fold_convert (sizetype, t));
> else
> t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
> t = force_gimple_operand_gsi (&si, t, false, NULL_TREE,
> --- 4463,4469 ----
> t = fold_convert (itype, s0);
> t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
> if (POINTER_TYPE_P (type))
> ! t = fold_build_pointer_plus (fd->loop.n1, t);
> else
> t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
> t = force_gimple_operand_gsi (&si, t, false, NULL_TREE,
> *************** expand_omp_for_static_chunk (struct omp_
> *** 4487,4494 ****
> t = fold_convert (itype, e0);
> t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
> if (POINTER_TYPE_P (type))
> ! t = fold_build2 (POINTER_PLUS_EXPR, type, fd->loop.n1,
> ! fold_convert (sizetype, t));
> else
> t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
> e = force_gimple_operand_gsi (&si, t, true, NULL_TREE,
> --- 4474,4480 ----
> t = fold_convert (itype, e0);
> t = fold_build2 (MULT_EXPR, itype, t, fd->loop.step);
> if (POINTER_TYPE_P (type))
> ! t = fold_build_pointer_plus (fd->loop.n1, t);
> else
> t = fold_build2 (PLUS_EXPR, type, t, fd->loop.n1);
> e = force_gimple_operand_gsi (&si, t, true, NULL_TREE,
> *************** expand_omp_for_static_chunk (struct omp_
> *** 4503,4510 ****
> v_back = gimple_omp_continue_control_def (stmt);
>
> if (POINTER_TYPE_P (type))
> ! t = fold_build2 (POINTER_PLUS_EXPR, type, v_main,
> ! fold_convert (sizetype, fd->loop.step));
> else
> t = fold_build2 (PLUS_EXPR, type, v_main, fd->loop.step);
> stmt = gimple_build_assign (v_back, t);
> --- 4489,4495 ----
> v_back = gimple_omp_continue_control_def (stmt);
>
> if (POINTER_TYPE_P (type))
> ! t = fold_build_pointer_plus (v_main, fd->loop.step);
> else
> t = fold_build2 (PLUS_EXPR, type, v_main, fd->loop.step);
> stmt = gimple_build_assign (v_back, t);
> Index: trunk/gcc/tree-affine.c
> ===================================================================
> *** trunk.orig/gcc/tree-affine.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/tree-affine.c 2011-07-11 17:13:24.000000000 +0200
> *************** add_elt_to_tree (tree expr, tree type, t
> *** 387,393 ****
> return fold_convert (type, elt);
>
> if (POINTER_TYPE_P (type))
> ! return fold_build2 (POINTER_PLUS_EXPR, type, expr, elt);
> return fold_build2 (PLUS_EXPR, type, expr, elt);
> }
>
> --- 387,393 ----
> return fold_convert (type, elt);
>
> if (POINTER_TYPE_P (type))
> ! return fold_build_pointer_plus (expr, elt);
> return fold_build2 (PLUS_EXPR, type, expr, elt);
> }
>
> *************** add_elt_to_tree (tree expr, tree type, t
> *** 399,405 ****
> if (POINTER_TYPE_P (type))
> {
> elt = fold_build1 (NEGATE_EXPR, type1, elt);
> ! return fold_build2 (POINTER_PLUS_EXPR, type, expr, elt);
> }
> return fold_build2 (MINUS_EXPR, type, expr, elt);
> }
> --- 399,405 ----
> if (POINTER_TYPE_P (type))
> {
> elt = fold_build1 (NEGATE_EXPR, type1, elt);
> ! return fold_build_pointer_plus (expr, elt);
> }
> return fold_build2 (MINUS_EXPR, type, expr, elt);
> }
> *************** add_elt_to_tree (tree expr, tree type, t
> *** 423,429 ****
> {
> if (code == MINUS_EXPR)
> elt = fold_build1 (NEGATE_EXPR, type1, elt);
> ! return fold_build2 (POINTER_PLUS_EXPR, type, expr, elt);
> }
> return fold_build2 (code, type, expr, elt);
> }
> --- 423,429 ----
> {
> if (code == MINUS_EXPR)
> elt = fold_build1 (NEGATE_EXPR, type1, elt);
> ! return fold_build_pointer_plus (expr, elt);
> }
> return fold_build2 (code, type, expr, elt);
> }
> Index: trunk/gcc/tree-data-ref.c
> ===================================================================
> *** trunk.orig/gcc/tree-data-ref.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/tree-data-ref.c 2011-07-11 17:13:24.000000000 +0200
> *************** split_constant_offset_1 (tree type, tree
> *** 604,611 ****
> split_constant_offset (poffset, &poffset, &off1);
> off0 = size_binop (PLUS_EXPR, off0, off1);
> if (POINTER_TYPE_P (TREE_TYPE (base)))
> ! base = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (base),
> ! base, fold_convert (sizetype, poffset));
> else
> base = fold_build2 (PLUS_EXPR, TREE_TYPE (base), base,
> fold_convert (TREE_TYPE (base), poffset));
> --- 604,610 ----
> split_constant_offset (poffset, &poffset, &off1);
> off0 = size_binop (PLUS_EXPR, off0, off1);
> if (POINTER_TYPE_P (TREE_TYPE (base)))
> ! base = fold_build_pointer_plus (base, poffset);
> else
> base = fold_build2 (PLUS_EXPR, TREE_TYPE (base), base,
> fold_convert (TREE_TYPE (base), poffset));
> Index: trunk/gcc/tree-loop-distribution.c
> ===================================================================
> *** trunk.orig/gcc/tree-loop-distribution.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/tree-loop-distribution.c 2011-07-11 17:13:24.000000000 +0200
> *************** generate_memset_zero (gimple stmt, tree
> *** 285,293 ****
> TYPE_SIZE_UNIT (TREE_TYPE (op0)));
> }
>
> ! addr_base = fold_build2_loc (loc, POINTER_PLUS_EXPR,
> ! TREE_TYPE (DR_BASE_ADDRESS (dr)),
> ! DR_BASE_ADDRESS (dr), addr_base);
> mem = force_gimple_operand (addr_base, &stmts, true, NULL);
> gimple_seq_add_seq (&stmt_list, stmts);
>
> --- 285,292 ----
> TYPE_SIZE_UNIT (TREE_TYPE (op0)));
> }
>
> ! addr_base = fold_build_pointer_plus_loc (loc,
> ! DR_BASE_ADDRESS (dr), addr_base);
> mem = force_gimple_operand (addr_base, &stmts, true, NULL);
> gimple_seq_add_seq (&stmt_list, stmts);
>
> Index: trunk/gcc/tree-mudflap.c
> ===================================================================
> *** trunk.orig/gcc/tree-mudflap.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/tree-mudflap.c 2011-07-11 17:13:24.000000000 +0200
> *************** mf_xform_derefs_1 (gimple_stmt_iterator
> *** 843,851 ****
> elt = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (elt)),
> elt);
> addr = fold_convert_loc (location, ptr_type_node, elt ? elt : base);
> ! addr = fold_build2_loc (location, POINTER_PLUS_EXPR, ptr_type_node,
> ! addr, fold_convert_loc (location, sizetype,
> ! byte_position (field)));
> }
> else
> addr = build1 (ADDR_EXPR, build_pointer_type (type), t);
> --- 843,850 ----
> elt = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (elt)),
> elt);
> addr = fold_convert_loc (location, ptr_type_node, elt ? elt : base);
> ! addr = fold_build_pointer_plus_loc (location,
> ! addr, byte_position (field));
> }
> else
> addr = build1 (ADDR_EXPR, build_pointer_type (type), t);
> *************** mf_xform_derefs_1 (gimple_stmt_iterator
> *** 861,893 ****
> case INDIRECT_REF:
> addr = TREE_OPERAND (t, 0);
> base = addr;
> ! limit = fold_build2_loc (location, POINTER_PLUS_EXPR, ptr_type_node,
> ! fold_build2_loc (location,
> ! POINTER_PLUS_EXPR, ptr_type_node, base,
> ! size),
> ! size_int (-1));
> break;
>
> case MEM_REF:
> ! addr = build2 (POINTER_PLUS_EXPR, TREE_TYPE (TREE_OPERAND (t, 1)),
> ! TREE_OPERAND (t, 0),
> ! fold_convert (sizetype, TREE_OPERAND (t, 1)));
> base = addr;
> ! limit = fold_build2_loc (location, POINTER_PLUS_EXPR, ptr_type_node,
> ! fold_build2_loc (location,
> ! POINTER_PLUS_EXPR, ptr_type_node, base,
> ! size),
> ! size_int (-1));
> break;
>
> case TARGET_MEM_REF:
> addr = tree_mem_ref_addr (ptr_type_node, t);
> base = addr;
> ! limit = fold_build2_loc (location, POINTER_PLUS_EXPR, ptr_type_node,
> ! fold_build2_loc (location,
> ! POINTER_PLUS_EXPR, ptr_type_node, base,
> ! size),
> ! size_int (-1));
> break;
>
> case ARRAY_RANGE_REF:
> --- 860,883 ----
> case INDIRECT_REF:
> addr = TREE_OPERAND (t, 0);
> base = addr;
> ! limit = fold_build_pointer_plus_hwi_loc
> ! (location, fold_build_pointer_plus_loc (location, base, size), -1);
> break;
>
> case MEM_REF:
> ! addr = fold_build_pointer_plus (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1));
> base = addr;
> ! limit = fold_build_pointer_plus_hwi_loc (location,
> ! fold_build_pointer_plus_loc (location,
> ! base, size), -1);
> break;
>
> case TARGET_MEM_REF:
> addr = tree_mem_ref_addr (ptr_type_node, t);
> base = addr;
> ! limit = fold_build_pointer_plus_hwi_loc (location,
> ! fold_build_pointer_plus_loc (location,
> ! base, size), -1);
> break;
>
> case ARRAY_RANGE_REF:
> *************** mf_xform_derefs_1 (gimple_stmt_iterator
> *** 920,934 ****
>
> addr = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
> addr = convert (ptr_type_node, addr);
> ! addr = fold_build2_loc (location, POINTER_PLUS_EXPR,
> ! ptr_type_node, addr, ofs);
>
> base = addr;
> ! limit = fold_build2_loc (location, POINTER_PLUS_EXPR, ptr_type_node,
> ! fold_build2_loc (location,
> ! POINTER_PLUS_EXPR, ptr_type_node,
> ! base, size),
> ! size_int (-1));
> }
> break;
>
> --- 910,921 ----
>
> addr = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
> addr = convert (ptr_type_node, addr);
> ! addr = fold_build_pointer_plus_loc (location, addr, ofs);
>
> base = addr;
> ! limit = fold_build_pointer_plus_hwi_loc (location,
> ! fold_build_pointer_plus_loc (location,
> ! base, size), -1);
> }
> break;
>
> Index: trunk/gcc/tree-predcom.c
> ===================================================================
> *** trunk.orig/gcc/tree-predcom.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/tree-predcom.c 2011-07-11 17:13:24.000000000 +0200
> *************** ref_at_iteration (struct loop *loop, tre
> *** 1396,1402 ****
> {
> val = fold_build2 (MULT_EXPR, sizetype, iv.step,
> size_int (iter));
> ! val = fold_build2 (POINTER_PLUS_EXPR, type, iv.base, val);
> }
> else
> {
> --- 1396,1402 ----
> {
> val = fold_build2 (MULT_EXPR, sizetype, iv.step,
> size_int (iter));
> ! val = fold_build_pointer_plus (iv.base, val);
> }
> else
> {
> Index: trunk/gcc/tree-ssa-address.c
> ===================================================================
> *** trunk.orig/gcc/tree-ssa-address.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/tree-ssa-address.c 2011-07-11 17:23:28.000000000 +0200
> *************** tree_mem_ref_addr (tree type, tree mem_r
> *** 302,308 ****
> }
>
> if (addr_off)
> ! addr = fold_build2 (POINTER_PLUS_EXPR, type, addr_base, addr_off);
> else
> addr = addr_base;
>
> --- 302,308 ----
> }
>
> if (addr_off)
> ! addr = fold_build_pointer_plus (addr_base, addr_off);
> else
> addr = addr_base;
>
> *************** add_to_parts (struct mem_address *parts,
> *** 521,529 ****
> /* Add ELT to base. */
> type = TREE_TYPE (parts->base);
> if (POINTER_TYPE_P (type))
> ! parts->base = fold_build2 (POINTER_PLUS_EXPR, type,
> ! parts->base,
> ! fold_convert (sizetype, elt));
> else
> parts->base = fold_build2 (PLUS_EXPR, type,
> parts->base, elt);
> --- 521,527 ----
> /* Add ELT to base. */
> type = TREE_TYPE (parts->base);
> if (POINTER_TYPE_P (type))
> ! parts->base = fold_build_pointer_plus (parts->base, elt);
> else
> parts->base = fold_build2 (PLUS_EXPR, type,
> parts->base, elt);
> *************** create_mem_ref (gimple_stmt_iterator *gs
> *** 692,698 ****
> tree alias_ptr_type, tree iv_cand, tree base_hint, bool speed)
> {
> tree mem_ref, tmp;
> - tree atype;
> struct mem_address parts;
>
> addr_to_parts (type, addr, iv_cand, base_hint, &parts, speed);
> --- 690,695 ----
> *************** create_mem_ref (gimple_stmt_iterator *gs
> *** 731,741 ****
>
> if (parts.index)
> {
> - atype = TREE_TYPE (tmp);
> parts.base = force_gimple_operand_gsi_1 (gsi,
> ! fold_build2 (POINTER_PLUS_EXPR, atype,
> ! tmp,
> ! fold_convert (sizetype, parts.base)),
> is_gimple_mem_ref_addr, NULL_TREE, true, GSI_SAME_STMT);
> }
> else
> --- 728,735 ----
>
> if (parts.index)
> {
> parts.base = force_gimple_operand_gsi_1 (gsi,
> ! fold_build_pointer_plus (tmp, parts.base),
> is_gimple_mem_ref_addr, NULL_TREE, true, GSI_SAME_STMT);
> }
> else
> *************** create_mem_ref (gimple_stmt_iterator *gs
> *** 758,768 ****
> /* Add index to base. */
> if (parts.base)
> {
> - atype = TREE_TYPE (parts.base);
> parts.base = force_gimple_operand_gsi_1 (gsi,
> ! fold_build2 (POINTER_PLUS_EXPR, atype,
> ! parts.base,
> ! parts.index),
> is_gimple_mem_ref_addr, NULL_TREE, true, GSI_SAME_STMT);
> }
> else
> --- 752,759 ----
> /* Add index to base. */
> if (parts.base)
> {
> parts.base = force_gimple_operand_gsi_1 (gsi,
> ! fold_build_pointer_plus (parts.base, parts.index),
> is_gimple_mem_ref_addr, NULL_TREE, true, GSI_SAME_STMT);
> }
> else
> *************** create_mem_ref (gimple_stmt_iterator *gs
> *** 779,789 ****
> /* Try adding offset to base. */
> if (parts.base)
> {
> - atype = TREE_TYPE (parts.base);
> parts.base = force_gimple_operand_gsi_1 (gsi,
> ! fold_build2 (POINTER_PLUS_EXPR, atype,
> ! parts.base,
> ! fold_convert (sizetype, parts.offset)),
> is_gimple_mem_ref_addr, NULL_TREE, true, GSI_SAME_STMT);
> }
> else
> --- 770,777 ----
> /* Try adding offset to base. */
> if (parts.base)
> {
> parts.base = force_gimple_operand_gsi_1 (gsi,
> ! fold_build_pointer_plus (parts.base, parts.offset),
> is_gimple_mem_ref_addr, NULL_TREE, true, GSI_SAME_STMT);
> }
> else
> Index: trunk/gcc/tree-ssa-loop-ivopts.c
> ===================================================================
> *** trunk.orig/gcc/tree-ssa-loop-ivopts.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/tree-ssa-loop-ivopts.c 2011-07-11 17:13:24.000000000 +0200
> *************** force_expr_to_var_cost (tree expr, bool
> *** 3586,3594 ****
> symbol_cost[i] = computation_cost (addr, i) + 1;
>
> address_cost[i]
> ! = computation_cost (build2 (POINTER_PLUS_EXPR, type,
> ! addr,
> ! build_int_cst (sizetype, 2000)), i) + 1;
> if (dump_file && (dump_flags & TDF_DETAILS))
> {
> fprintf (dump_file, "force_expr_to_var_cost %s costs:\n", i ? "speed" : "size");
> --- 3586,3592 ----
> symbol_cost[i] = computation_cost (addr, i) + 1;
>
> address_cost[i]
> ! = computation_cost (fold_build_pointer_plus_hwi (addr, 2000), i) + 1;
> if (dump_file && (dump_flags & TDF_DETAILS))
> {
> fprintf (dump_file, "force_expr_to_var_cost %s costs:\n", i ? "speed" : "size");
> Index: trunk/gcc/tree-ssa-loop-niter.c
> ===================================================================
> *** trunk.orig/gcc/tree-ssa-loop-niter.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/tree-ssa-loop-niter.c 2011-07-11 17:13:24.000000000 +0200
> *************** number_of_iterations_lt_to_ne (tree type
> *** 762,769 ****
> else if (POINTER_TYPE_P (type))
> noloop = fold_build2 (GT_EXPR, boolean_type_node,
> iv0->base,
> ! fold_build2 (POINTER_PLUS_EXPR, type,
> ! iv1->base, tmod));
> else
> noloop = fold_build2 (GT_EXPR, boolean_type_node,
> iv0->base,
> --- 762,768 ----
> else if (POINTER_TYPE_P (type))
> noloop = fold_build2 (GT_EXPR, boolean_type_node,
> iv0->base,
> ! fold_build_pointer_plus (iv1->base, tmod));
> else
> noloop = fold_build2 (GT_EXPR, boolean_type_node,
> iv0->base,
> *************** number_of_iterations_lt_to_ne (tree type
> *** 788,797 ****
> noloop = boolean_false_node;
> else if (POINTER_TYPE_P (type))
> noloop = fold_build2 (GT_EXPR, boolean_type_node,
> ! fold_build2 (POINTER_PLUS_EXPR, type,
> ! iv0->base,
> ! fold_build1 (NEGATE_EXPR,
> ! type1, tmod)),
> iv1->base);
> else
> noloop = fold_build2 (GT_EXPR, boolean_type_node,
> --- 787,795 ----
> noloop = boolean_false_node;
> else if (POINTER_TYPE_P (type))
> noloop = fold_build2 (GT_EXPR, boolean_type_node,
> ! fold_build_pointer_plus (iv0->base,
> ! fold_build1 (NEGATE_EXPR,
> ! type1, tmod)),
> iv1->base);
> else
> noloop = fold_build2 (GT_EXPR, boolean_type_node,
> *************** number_of_iterations_le (tree type, affi
> *** 1166,1181 ****
> if (integer_nonzerop (iv0->step))
> {
> if (POINTER_TYPE_P (type))
> ! iv1->base = fold_build2 (POINTER_PLUS_EXPR, type, iv1->base,
> ! build_int_cst (type1, 1));
> else
> iv1->base = fold_build2 (PLUS_EXPR, type1, iv1->base,
> build_int_cst (type1, 1));
> }
> else if (POINTER_TYPE_P (type))
> ! iv0->base = fold_build2 (POINTER_PLUS_EXPR, type, iv0->base,
> ! fold_build1 (NEGATE_EXPR, type1,
> ! build_int_cst (type1, 1)));
> else
> iv0->base = fold_build2 (MINUS_EXPR, type1,
> iv0->base, build_int_cst (type1, 1));
> --- 1164,1176 ----
> if (integer_nonzerop (iv0->step))
> {
> if (POINTER_TYPE_P (type))
> ! iv1->base = fold_build_pointer_plus_hwi (iv1->base, 1);
> else
> iv1->base = fold_build2 (PLUS_EXPR, type1, iv1->base,
> build_int_cst (type1, 1));
> }
> else if (POINTER_TYPE_P (type))
> ! iv0->base = fold_build_pointer_plus_hwi (iv0->base, -1);
> else
> iv0->base = fold_build2 (MINUS_EXPR, type1,
> iv0->base, build_int_cst (type1, 1));
> Index: trunk/gcc/tree-ssa-loop-prefetch.c
> ===================================================================
> *** trunk.orig/gcc/tree-ssa-loop-prefetch.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/tree-ssa-loop-prefetch.c 2011-07-11 17:13:24.000000000 +0200
> *************** issue_prefetch_ref (struct mem_ref *ref,
> *** 1100,1107 ****
> /* Determine the address to prefetch. */
> delta = (ahead + ap * ref->prefetch_mod) *
> int_cst_value (ref->group->step);
> ! addr = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node,
> ! addr_base, size_int (delta));
> addr = force_gimple_operand_gsi (&bsi, unshare_expr (addr), true, NULL,
> true, GSI_SAME_STMT);
> }
> --- 1100,1106 ----
> /* Determine the address to prefetch. */
> delta = (ahead + ap * ref->prefetch_mod) *
> int_cst_value (ref->group->step);
> ! addr = fold_build_pointer_plus_hwi (addr_base, delta);
> addr = force_gimple_operand_gsi (&bsi, unshare_expr (addr), true, NULL,
> true, GSI_SAME_STMT);
> }
> *************** issue_prefetch_ref (struct mem_ref *ref,
> *** 1112,1119 ****
> forward = fold_build2 (MULT_EXPR, sizetype,
> fold_convert (sizetype, ref->group->step),
> fold_convert (sizetype, size_int (ahead)));
> ! addr = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, addr_base,
> ! forward);
> addr = force_gimple_operand_gsi (&bsi, unshare_expr (addr), true,
> NULL, true, GSI_SAME_STMT);
> }
> --- 1111,1117 ----
> forward = fold_build2 (MULT_EXPR, sizetype,
> fold_convert (sizetype, ref->group->step),
> fold_convert (sizetype, size_int (ahead)));
> ! addr = fold_build_pointer_plus (addr_base, forward);
> addr = force_gimple_operand_gsi (&bsi, unshare_expr (addr), true,
> NULL, true, GSI_SAME_STMT);
> }
> Index: trunk/gcc/tree-vect-data-refs.c
> ===================================================================
> *** trunk.orig/gcc/tree-vect-data-refs.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/tree-vect-data-refs.c 2011-07-11 17:13:24.000000000 +0200
> *************** vect_analyze_data_refs (loop_vec_info lo
> *** 2645,2653 ****
> inner-loop: *(BASE+INIT). (The first location is actually
> BASE+INIT+OFFSET, but we add OFFSET separately later). */
> tree inner_base = build_fold_indirect_ref
> ! (fold_build2 (POINTER_PLUS_EXPR,
> ! TREE_TYPE (base), base,
> ! fold_convert (sizetype, init)));
>
> if (vect_print_dump_info (REPORT_DETAILS))
> {
> --- 2645,2651 ----
> inner-loop: *(BASE+INIT). (The first location is actually
> BASE+INIT+OFFSET, but we add OFFSET separately later). */
> tree inner_base = build_fold_indirect_ref
> ! (fold_build_pointer_plus (base, init));
>
> if (vect_print_dump_info (REPORT_DETAILS))
> {
> *************** vect_create_addr_base_for_vector_ref (gi
> *** 2928,2935 ****
>
> /* base + base_offset */
> if (loop_vinfo)
> ! addr_base = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (data_ref_base),
> ! data_ref_base, base_offset);
> else
> {
> addr_base = build1 (ADDR_EXPR,
> --- 2926,2932 ----
>
> /* base + base_offset */
> if (loop_vinfo)
> ! addr_base = fold_build_pointer_plus (data_ref_base, base_offset);
> else
> {
> addr_base = build1 (ADDR_EXPR,
> Index: trunk/gcc/tree-vect-loop-manip.c
> ===================================================================
> *** trunk.orig/gcc/tree-vect-loop-manip.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/tree-vect-loop-manip.c 2011-07-11 17:13:24.000000000 +0200
> *************** vect_update_ivs_after_vectorizer (loop_v
> *** 1819,1827 ****
> fold_convert (TREE_TYPE (step_expr), niters),
> step_expr);
> if (POINTER_TYPE_P (TREE_TYPE (init_expr)))
> ! ni = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (init_expr),
> ! init_expr,
> ! fold_convert (sizetype, off));
> else
> ni = fold_build2 (PLUS_EXPR, TREE_TYPE (init_expr),
> init_expr,
> --- 1819,1825 ----
> fold_convert (TREE_TYPE (step_expr), niters),
> step_expr);
> if (POINTER_TYPE_P (TREE_TYPE (init_expr)))
> ! ni = fold_build_pointer_plus (init_expr, off);
> else
> ni = fold_build2 (PLUS_EXPR, TREE_TYPE (init_expr),
> init_expr,
> *************** vect_create_cond_for_alias_checks (loop_
> *** 2471,2484 ****
> }
>
> seg_a_min = addr_base_a;
> ! seg_a_max = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (addr_base_a),
> ! addr_base_a, segment_length_a);
> if (tree_int_cst_compare (DR_STEP (dr_a), size_zero_node) < 0)
> seg_a_min = seg_a_max, seg_a_max = addr_base_a;
>
> seg_b_min = addr_base_b;
> ! seg_b_max = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (addr_base_b),
> ! addr_base_b, segment_length_b);
> if (tree_int_cst_compare (DR_STEP (dr_b), size_zero_node) < 0)
> seg_b_min = seg_b_max, seg_b_max = addr_base_b;
>
> --- 2469,2480 ----
> }
>
> seg_a_min = addr_base_a;
> ! seg_a_max = fold_build_pointer_plus (addr_base_a, segment_length_a);
> if (tree_int_cst_compare (DR_STEP (dr_a), size_zero_node) < 0)
> seg_a_min = seg_a_max, seg_a_max = addr_base_a;
>
> seg_b_min = addr_base_b;
> ! seg_b_max = fold_build_pointer_plus (addr_base_b, segment_length_b);
> if (tree_int_cst_compare (DR_STEP (dr_b), size_zero_node) < 0)
> seg_b_min = seg_b_max, seg_b_max = addr_base_b;
>
> Index: trunk/gcc/tree-vrp.c
> ===================================================================
> *** trunk.orig/gcc/tree-vrp.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/tree-vrp.c 2011-07-11 17:13:24.000000000 +0200
> *************** extract_range_from_assert (value_range_t
> *** 1877,1884 ****
> anti_max,
> build_int_cst (TREE_TYPE (var_vr->min), 1));
> else
> ! min = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (var_vr->min),
> ! anti_max, size_int (1));
> max = real_max;
> set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
> }
> --- 1877,1883 ----
> anti_max,
> build_int_cst (TREE_TYPE (var_vr->min), 1));
> else
> ! min = fold_build_pointer_plus_hwi (anti_max, 1);
> max = real_max;
> set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
> }
> *************** extract_range_from_assert (value_range_t
> *** 1905,1913 ****
> anti_min,
> build_int_cst (TREE_TYPE (var_vr->min), 1));
> else
> ! max = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (var_vr->min),
> ! anti_min,
> ! size_int (-1));
> min = real_min;
> set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
> }
> --- 1904,1910 ----
> anti_min,
> build_int_cst (TREE_TYPE (var_vr->min), 1));
> else
> ! max = fold_build_pointer_plus_hwi (anti_min, -1);
> min = real_min;
> set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
> }
> Index: trunk/gcc/c-family/c-common.c
> ===================================================================
> *** trunk.orig/gcc/c-family/c-common.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/c-family/c-common.c 2011-07-11 17:13:24.000000000 +0200
> *************** pointer_int_sum (location_t loc, enum tr
> *** 3760,3766 ****
> if (resultcode == MINUS_EXPR)
> intop = fold_build1_loc (loc, NEGATE_EXPR, sizetype, intop);
>
> ! ret = fold_build2_loc (loc, POINTER_PLUS_EXPR, result_type, ptrop, intop);
>
> fold_undefer_and_ignore_overflow_warnings ();
>
> --- 3760,3766 ----
> if (resultcode == MINUS_EXPR)
> intop = fold_build1_loc (loc, NEGATE_EXPR, sizetype, intop);
>
> ! ret = fold_build_pointer_plus_loc (loc, ptrop, intop);
>
> fold_undefer_and_ignore_overflow_warnings ();
>
> Index: trunk/gcc/c-family/c-omp.c
> ===================================================================
> *** trunk.orig/gcc/c-family/c-omp.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/c-family/c-omp.c 2011-07-11 17:13:24.000000000 +0200
> *************** c_finish_omp_for (location_t locus, tree
> *** 424,430 ****
> if (TREE_CODE (incr) == POSTDECREMENT_EXPR
> || TREE_CODE (incr) == PREDECREMENT_EXPR)
> t = fold_build1_loc (elocus, NEGATE_EXPR, sizetype, t);
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (decl), decl, t);
> incr = build2 (MODIFY_EXPR, void_type_node, decl, t);
> }
> break;
> --- 424,430 ----
> if (TREE_CODE (incr) == POSTDECREMENT_EXPR
> || TREE_CODE (incr) == PREDECREMENT_EXPR)
> t = fold_build1_loc (elocus, NEGATE_EXPR, sizetype, t);
> ! t = fold_build_pointer_plus (decl, t);
> incr = build2 (MODIFY_EXPR, void_type_node, decl, t);
> }
> break;
> Index: trunk/gcc/config/alpha/alpha.c
> ===================================================================
> *** trunk.orig/gcc/config/alpha/alpha.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/alpha/alpha.c 2011-07-11 17:13:24.000000000 +0200
> *************** alpha_va_start (tree valist, rtx nextarg
> *** 5990,5997 ****
> if (TARGET_ABI_OPEN_VMS)
> {
> t = make_tree (ptr_type_node, virtual_incoming_args_rtx);
> ! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t,
> ! size_int (offset + NUM_ARGS * UNITS_PER_WORD));
> t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> --- 5990,5996 ----
> if (TARGET_ABI_OPEN_VMS)
> {
> t = make_tree (ptr_type_node, virtual_incoming_args_rtx);
> ! t = fold_build_pointer_plus_hwi (t, offset + NUM_ARGS * UNITS_PER_WORD);
> t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> *************** alpha_va_start (tree valist, rtx nextarg
> *** 6007,6014 ****
> valist, offset_field, NULL_TREE);
>
> t = make_tree (ptr_type_node, virtual_incoming_args_rtx);
> ! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t,
> ! size_int (offset));
> t = build2 (MODIFY_EXPR, TREE_TYPE (base_field), base_field, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> --- 6006,6012 ----
> valist, offset_field, NULL_TREE);
>
> t = make_tree (ptr_type_node, virtual_incoming_args_rtx);
> ! t = fold_build_pointer_plus_hwi (t, offset);
> t = build2 (MODIFY_EXPR, TREE_TYPE (base_field), base_field, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> *************** alpha_gimplify_va_arg_1 (tree type, tree
> *** 6069,6076 ****
> }
>
> /* Build the final address and force that value into a temporary. */
> ! addr = build2 (POINTER_PLUS_EXPR, ptr_type, fold_convert (ptr_type, base),
> ! fold_convert (sizetype, addend));
> internal_post = NULL;
> gimplify_expr (&addr, pre_p, &internal_post, is_gimple_val, fb_rvalue);
> gimple_seq_add_seq (pre_p, internal_post);
> --- 6067,6073 ----
> }
>
> /* Build the final address and force that value into a temporary. */
> ! addr = fold_build_pointer_plus (fold_convert (ptr_type, base), addend);
> internal_post = NULL;
> gimplify_expr (&addr, pre_p, &internal_post, is_gimple_val, fb_rvalue);
> gimple_seq_add_seq (pre_p, internal_post);
> Index: trunk/gcc/config/i386/i386.c
> ===================================================================
> *** trunk.orig/gcc/config/i386/i386.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/i386/i386.c 2011-07-11 17:44:25.000000000 +0200
> *************** ix86_va_start (tree valist, rtx nextarg)
> *** 7559,7566 ****
> ovf_rtx = cfun->machine->split_stack_varargs_pointer;
> t = make_tree (type, ovf_rtx);
> if (words != 0)
> ! t = build2 (POINTER_PLUS_EXPR, type, t,
> ! size_int (words * UNITS_PER_WORD));
> t = build2 (MODIFY_EXPR, type, ovf, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> --- 7559,7565 ----
> ovf_rtx = cfun->machine->split_stack_varargs_pointer;
> t = make_tree (type, ovf_rtx);
> if (words != 0)
> ! t = fold_build_pointer_plus_hwi (t, words * UNITS_PER_WORD);
> t = build2 (MODIFY_EXPR, type, ovf, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> *************** ix86_va_start (tree valist, rtx nextarg)
> *** 7572,7579 ****
> type = TREE_TYPE (sav);
> t = make_tree (type, frame_pointer_rtx);
> if (!ix86_varargs_gpr_size)
> ! t = build2 (POINTER_PLUS_EXPR, type, t,
> ! size_int (-8 * X86_64_REGPARM_MAX));
> t = build2 (MODIFY_EXPR, type, sav, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> --- 7571,7577 ----
> type = TREE_TYPE (sav);
> t = make_tree (type, frame_pointer_rtx);
> if (!ix86_varargs_gpr_size)
> ! t = fold_build_pointer_plus_hwi (t, -8 * X86_64_REGPARM_MAX);
> t = build2 (MODIFY_EXPR, type, sav, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> *************** ix86_gimplify_va_arg (tree valist, tree
> *** 7729,7743 ****
> if (needed_intregs)
> {
> /* int_addr = gpr + sav; */
> ! t = fold_convert (sizetype, gpr);
> ! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
> gimplify_assign (int_addr, t, pre_p);
> }
> if (needed_sseregs)
> {
> /* sse_addr = fpr + sav; */
> ! t = fold_convert (sizetype, fpr);
> ! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, t);
> gimplify_assign (sse_addr, t, pre_p);
> }
> if (need_temp)
> --- 7727,7739 ----
> if (needed_intregs)
> {
> /* int_addr = gpr + sav; */
> ! t = fold_build_pointer_plus (sav, gpr);
> gimplify_assign (int_addr, t, pre_p);
> }
> if (needed_sseregs)
> {
> /* sse_addr = fpr + sav; */
> ! t = fold_build_pointer_plus (sav, fpr);
> gimplify_assign (sse_addr, t, pre_p);
> }
> if (need_temp)
> *************** ix86_gimplify_va_arg (tree valist, tree
> *** 7791,7802 ****
> src_offset = REGNO (reg) * 8;
> }
> src_addr = fold_convert (addr_type, src_addr);
> ! src_addr = fold_build2 (POINTER_PLUS_EXPR, addr_type, src_addr,
> ! size_int (src_offset));
>
> dest_addr = fold_convert (daddr_type, addr);
> ! dest_addr = fold_build2 (POINTER_PLUS_EXPR, daddr_type, dest_addr,
> ! size_int (prev_size));
> if (cur_size == GET_MODE_SIZE (mode))
> {
> src = build_va_arg_indirect_ref (src_addr);
> --- 7787,7796 ----
> src_offset = REGNO (reg) * 8;
> }
> src_addr = fold_convert (addr_type, src_addr);
> ! src_addr = fold_build_pointer_plus_hwi (src_addr, src_offset);
>
> dest_addr = fold_convert (daddr_type, addr);
> ! dest_addr = fold_build_pointer_plus_hwi (dest_addr, prev_size);
> if (cur_size == GET_MODE_SIZE (mode))
> {
> src = build_va_arg_indirect_ref (src_addr);
> *************** ix86_gimplify_va_arg (tree valist, tree
> *** 7851,7869 ****
> else
> {
> HOST_WIDE_INT align = arg_boundary / 8;
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), ovf,
> ! size_int (align - 1));
> ! t = fold_convert (sizetype, t);
> t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
> ! size_int (-align));
> ! t = fold_convert (TREE_TYPE (ovf), t);
> }
>
> gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
> gimplify_assign (addr, t, pre_p);
>
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t,
> ! size_int (rsize * UNITS_PER_WORD));
> gimplify_assign (unshare_expr (ovf), t, pre_p);
>
> if (container)
> --- 7845,7859 ----
> else
> {
> HOST_WIDE_INT align = arg_boundary / 8;
> ! t = fold_build_pointer_plus_hwi (ovf, align - 1);
> t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
> ! build_int_cst (TREE_TYPE (t), -align));
> }
>
> gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
> gimplify_assign (addr, t, pre_p);
>
> ! t = fold_build_pointer_plus_hwi (t, rsize * UNITS_PER_WORD);
> gimplify_assign (unshare_expr (ovf), t, pre_p);
>
> if (container)
> Index: trunk/gcc/config/ia64/ia64.c
> ===================================================================
> *** trunk.orig/gcc/config/ia64/ia64.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/ia64/ia64.c 2011-07-11 17:13:24.000000000 +0200
> *************** ia64_gimplify_va_arg (tree valist, tree
> *** 4738,4749 ****
> if ((TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == INTEGER_TYPE)
> ? int_size_in_bytes (type) > 8 : TYPE_ALIGN (type) > 8 * BITS_PER_UNIT)
> {
> ! tree t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (valist), valist,
> ! size_int (2 * UNITS_PER_WORD - 1));
> ! t = fold_convert (sizetype, t);
> t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
> ! size_int (-2 * UNITS_PER_WORD));
> ! t = fold_convert (TREE_TYPE (valist), t);
> gimplify_assign (unshare_expr (valist), t, pre_p);
> }
>
> --- 4738,4746 ----
> if ((TREE_CODE (type) == REAL_TYPE || TREE_CODE (type) == INTEGER_TYPE)
> ? int_size_in_bytes (type) > 8 : TYPE_ALIGN (type) > 8 * BITS_PER_UNIT)
> {
> ! tree t = fold_build_pointer_plus_hwi (valist, 2 * UNITS_PER_WORD - 1);
> t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
> ! build_int_cst (TREE_TYPE (t), -2 * UNITS_PER_WORD));
> gimplify_assign (unshare_expr (valist), t, pre_p);
> }
>
> Index: trunk/gcc/config/mep/mep.c
> ===================================================================
> *** trunk.orig/gcc/config/mep/mep.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/mep/mep.c 2011-07-11 17:13:24.000000000 +0200
> *************** mep_expand_va_start (tree valist, rtx ne
> *** 3620,3633 ****
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
>
> /* va_list.next_gp_limit = va_list.next_gp + 4 * ns; */
> ! u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u,
> ! size_int (4 * ns));
> t = build2 (MODIFY_EXPR, ptr_type_node, next_gp_limit, u);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
>
> ! u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u,
> ! size_int (8 * ((ns+1)/2)));
> /* va_list.next_cop = ROUND_UP(va_list.next_gp_limit,8); */
> t = build2 (MODIFY_EXPR, ptr_type_node, next_cop, u);
> TREE_SIDE_EFFECTS (t) = 1;
> --- 3620,3631 ----
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
>
> /* va_list.next_gp_limit = va_list.next_gp + 4 * ns; */
> ! u = fold_build_pointer_plus_hwi (u, 4 * ns);
> t = build2 (MODIFY_EXPR, ptr_type_node, next_gp_limit, u);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
>
> ! u = fold_build_pointer_plus_hwi (u, 8 * ((ns+1)/2));
> /* va_list.next_cop = ROUND_UP(va_list.next_gp_limit,8); */
> t = build2 (MODIFY_EXPR, ptr_type_node, next_cop, u);
> TREE_SIDE_EFFECTS (t) = 1;
> *************** mep_gimplify_va_arg_expr (tree valist, t
> *** 3715,3726 ****
> gimplify_and_add (tmp, pre_p);
> }
>
> ! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node,
> ! unshare_expr (next_gp), size_int (4));
> gimplify_assign (unshare_expr (next_gp), tmp, pre_p);
>
> ! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node,
> ! unshare_expr (next_cop), size_int (8));
> gimplify_assign (unshare_expr (next_cop), tmp, pre_p);
>
> tmp = build1 (GOTO_EXPR, void_type_node, unshare_expr (label_sover));
> --- 3713,3722 ----
> gimplify_and_add (tmp, pre_p);
> }
>
> ! tmp = fold_build_pointer_plus_hwi (unshare_expr (next_gp), 4);
> gimplify_assign (unshare_expr (next_gp), tmp, pre_p);
>
> ! tmp = fold_build_pointer_plus_hwi (unshare_expr (next_cop), 8);
> gimplify_assign (unshare_expr (next_cop), tmp, pre_p);
>
> tmp = build1 (GOTO_EXPR, void_type_node, unshare_expr (label_sover));
> *************** mep_gimplify_va_arg_expr (tree valist, t
> *** 3734,3741 ****
> tmp = build2 (MODIFY_EXPR, void_type_node, res_addr, unshare_expr (next_stack));
> gimplify_and_add (tmp, pre_p);
>
> ! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node,
> ! unshare_expr (next_stack), size_int (rsize));
> gimplify_assign (unshare_expr (next_stack), tmp, pre_p);
>
> /* - - */
> --- 3730,3736 ----
> tmp = build2 (MODIFY_EXPR, void_type_node, res_addr, unshare_expr (next_stack));
> gimplify_and_add (tmp, pre_p);
>
> ! tmp = fold_build_pointer_plus_hwi (unshare_expr (next_stack), rsize);
> gimplify_assign (unshare_expr (next_stack), tmp, pre_p);
>
> /* - - */
> Index: trunk/gcc/config/mips/mips.c
> ===================================================================
> *** trunk.orig/gcc/config/mips/mips.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/mips/mips.c 2011-07-11 17:13:24.000000000 +0200
> *************** mips_va_start (tree valist, rtx nextarg)
> *** 5452,5459 ****
> words used by named arguments. */
> t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
> if (cum->stack_words > 0)
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl), t,
> ! size_int (cum->stack_words * UNITS_PER_WORD));
> t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
>
> --- 5452,5458 ----
> words used by named arguments. */
> t = make_tree (TREE_TYPE (ovfl), virtual_incoming_args_rtx);
> if (cum->stack_words > 0)
> ! t = fold_build_pointer_plus_hwi (t, cum->stack_words * UNITS_PER_WORD);
> t = build2 (MODIFY_EXPR, TREE_TYPE (ovfl), ovfl, t);
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
>
> *************** mips_va_start (tree valist, rtx nextarg)
> *** 5469,5476 ****
> fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
> fpr_offset &= -UNITS_PER_FPVALUE;
> if (fpr_offset)
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ftop), t,
> ! size_int (-fpr_offset));
> t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
>
> --- 5468,5474 ----
> fpr_offset = gpr_save_area_size + UNITS_PER_FPVALUE - 1;
> fpr_offset &= -UNITS_PER_FPVALUE;
> if (fpr_offset)
> ! t = fold_build_pointer_plus_hwi (t, -fpr_offset);
> t = build2 (MODIFY_EXPR, TREE_TYPE (ftop), ftop, t);
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
>
> *************** mips_gimplify_va_arg_expr (tree valist,
> *** 5615,5638 ****
> addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0). */
> t = fold_convert (sizetype, t);
> t = fold_build1 (NEGATE_EXPR, sizetype, t);
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (top), top, t);
> if (BYTES_BIG_ENDIAN && rsize > size)
> ! {
> ! u = size_int (rsize - size);
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
> ! }
> COND_EXPR_THEN (addr) = t;
>
> if (osize > UNITS_PER_WORD)
> {
> /* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize. */
> ! u = size_int (osize - 1);
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovfl),
> ! unshare_expr (ovfl), u);
> ! t = fold_convert (sizetype, t);
> ! u = size_int (-osize);
> t = build2 (BIT_AND_EXPR, sizetype, t, u);
> - t = fold_convert (TREE_TYPE (ovfl), t);
> align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
> unshare_expr (ovfl), t);
> }
> --- 5613,5629 ----
> addr_rtx = top - off + (BYTES_BIG_ENDIAN ? RSIZE - SIZE : 0). */
> t = fold_convert (sizetype, t);
> t = fold_build1 (NEGATE_EXPR, sizetype, t);
> ! t = fold_build_pointer_plus (top, t);
> if (BYTES_BIG_ENDIAN && rsize > size)
> ! t = fold_build_pointer_plus_hwi (t, rsize - size);
> COND_EXPR_THEN (addr) = t;
>
> if (osize > UNITS_PER_WORD)
> {
> /* [9] Emit: ovfl = ((intptr_t) ovfl + osize - 1) & -osize. */
> ! t = fold_build_pointer_plus_hwi (unshare_expr (ovfl), osize - 1);
> ! u = build_int_cst (TREE_TYPE (t), -osize);
> t = build2 (BIT_AND_EXPR, sizetype, t, u);
> align = build2 (MODIFY_EXPR, TREE_TYPE (ovfl),
> unshare_expr (ovfl), t);
> }
> *************** mips_gimplify_va_arg_expr (tree valist,
> *** 5645,5654 ****
> u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
> t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
> if (BYTES_BIG_ENDIAN && osize > size)
> ! {
> ! u = size_int (osize - size);
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, u);
> ! }
>
> /* String [9] and [10, 11] together. */
> if (align)
> --- 5636,5642 ----
> u = fold_convert (TREE_TYPE (ovfl), build_int_cst (NULL_TREE, osize));
> t = build2 (POSTINCREMENT_EXPR, TREE_TYPE (ovfl), ovfl, u);
> if (BYTES_BIG_ENDIAN && osize > size)
> ! t = fold_build_pointer_plus_hwi (t, osize - size);
>
> /* String [9] and [10, 11] together. */
> if (align)
> Index: trunk/gcc/config/pa/pa.c
> ===================================================================
> *** trunk.orig/gcc/config/pa/pa.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/pa/pa.c 2011-07-11 17:13:24.000000000 +0200
> *************** hppa_gimplify_va_arg_expr (tree valist,
> *** 6112,6118 ****
>
> u = fold_convert (sizetype, size_in_bytes (type));
> u = fold_build1 (NEGATE_EXPR, sizetype, u);
> ! t = build2 (POINTER_PLUS_EXPR, valist_type, valist, u);
>
> /* Align to 4 or 8 byte boundary depending on argument size. */
>
> --- 6112,6118 ----
>
> u = fold_convert (sizetype, size_in_bytes (type));
> u = fold_build1 (NEGATE_EXPR, sizetype, u);
> ! t = fold_build_pointer_plus (valist, u);
>
> /* Align to 4 or 8 byte boundary depending on argument size. */
>
> *************** hppa_gimplify_va_arg_expr (tree valist,
> *** 6124,6133 ****
>
> ofs = (8 - size) % 4;
> if (ofs != 0)
> ! {
> ! u = size_int (ofs);
> ! t = build2 (POINTER_PLUS_EXPR, valist_type, t, u);
> ! }
>
> t = fold_convert (ptr, t);
> t = build_va_arg_indirect_ref (t);
> --- 6124,6130 ----
>
> ofs = (8 - size) % 4;
> if (ofs != 0)
> ! t = fold_build_pointer_plus_hwi (t, ofs);
>
> t = fold_convert (ptr, t);
> t = build_va_arg_indirect_ref (t);
> Index: trunk/gcc/config/rs6000/rs6000.c
> ===================================================================
> *** trunk.orig/gcc/config/rs6000/rs6000.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/rs6000/rs6000.c 2011-07-11 17:13:24.000000000 +0200
> *************** rs6000_va_start (tree valist, rtx nextar
> *** 9131,9138 ****
> /* Find the overflow area. */
> t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
> if (words != 0)
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), t,
> ! size_int (words * UNITS_PER_WORD));
> t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> --- 9131,9137 ----
> /* Find the overflow area. */
> t = make_tree (TREE_TYPE (ovf), virtual_incoming_args_rtx);
> if (words != 0)
> ! t = fold_build_pointer_plus_hwi (t, words * UNITS_PER_WORD);
> t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> *************** rs6000_va_start (tree valist, rtx nextar
> *** 9148,9155 ****
> /* Find the register save area. */
> t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
> if (cfun->machine->varargs_save_offset)
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (sav), t,
> ! size_int (cfun->machine->varargs_save_offset));
> t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> --- 9147,9153 ----
> /* Find the register save area. */
> t = make_tree (TREE_TYPE (sav), virtual_stack_vars_rtx);
> if (cfun->machine->varargs_save_offset)
> ! t = fold_build_pointer_plus_hwi (t, cfun->machine->varargs_save_offset);
> t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> *************** rs6000_gimplify_va_arg (tree valist, tre
> *** 9202,9210 ****
> /* This updates arg ptr by the amount that would be necessary
> to align the zero-sized (but not zero-alignment) item. */
> t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
> ! fold_build2 (POINTER_PLUS_EXPR,
> ! TREE_TYPE (valist),
> ! valist_tmp, size_int (boundary - 1)));
> gimplify_and_add (t, pre_p);
>
> t = fold_convert (sizetype, valist_tmp);
> --- 9200,9206 ----
> /* This updates arg ptr by the amount that would be necessary
> to align the zero-sized (but not zero-alignment) item. */
> t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
> ! fold_build_pointer_plus_hwi (valist_tmp, boundary - 1));
> gimplify_and_add (t, pre_p);
>
> t = fold_convert (sizetype, valist_tmp);
> *************** rs6000_gimplify_va_arg (tree valist, tre
> *** 9339,9358 ****
>
> t = sav;
> if (sav_ofs)
> ! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav, size_int (sav_ofs));
>
> u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
> build_int_cst (TREE_TYPE (reg), n_reg));
> u = fold_convert (sizetype, u);
> u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
> ! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t, u);
>
> /* _Decimal32 varargs are located in the second word of the 64-bit
> FP register for 32-bit binaries. */
> if (!TARGET_POWERPC64
> && TARGET_HARD_FLOAT && TARGET_FPRS
> && TYPE_MODE (type) == SDmode)
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
>
> gimplify_assign (addr, t, pre_p);
>
> --- 9335,9354 ----
>
> t = sav;
> if (sav_ofs)
> ! t = fold_build_pointer_plus_hwi (sav, sav_ofs);
>
> u = build2 (POSTINCREMENT_EXPR, TREE_TYPE (reg), unshare_expr (reg),
> build_int_cst (TREE_TYPE (reg), n_reg));
> u = fold_convert (sizetype, u);
> u = build2 (MULT_EXPR, sizetype, u, size_int (sav_scale));
> ! t = fold_build_pointer_plus (t, u);
>
> /* _Decimal32 varargs are located in the second word of the 64-bit
> FP register for 32-bit binaries. */
> if (!TARGET_POWERPC64
> && TARGET_HARD_FLOAT && TARGET_FPRS
> && TYPE_MODE (type) == SDmode)
> ! t = fold_build_pointer_plus_hwi (t, size);
>
> gimplify_assign (addr, t, pre_p);
>
> *************** rs6000_gimplify_va_arg (tree valist, tre
> *** 9375,9391 ****
> t = ovf;
> if (align != 1)
> {
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (align - 1));
> ! t = fold_convert (sizetype, t);
> t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
> ! size_int (-align));
> ! t = fold_convert (TREE_TYPE (ovf), t);
> }
> gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
>
> gimplify_assign (unshare_expr (addr), t, pre_p);
>
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (t), t, size_int (size));
> gimplify_assign (unshare_expr (ovf), t, pre_p);
>
> if (lab_over)
> --- 9371,9385 ----
> t = ovf;
> if (align != 1)
> {
> ! t = fold_build_pointer_plus_hwi (t, align - 1);
> t = build2 (BIT_AND_EXPR, TREE_TYPE (t), t,
> ! build_int_cst (TREE_TYPE (t), -align));
> }
> gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
>
> gimplify_assign (unshare_expr (addr), t, pre_p);
>
> ! t = fold_build_pointer_plus_hwi (t, size);
> gimplify_assign (unshare_expr (ovf), t, pre_p);
>
> if (lab_over)
> Index: trunk/gcc/config/s390/s390.c
> ===================================================================
> *** trunk.orig/gcc/config/s390/s390.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/s390/s390.c 2011-07-11 17:13:24.000000000 +0200
> *************** s390_va_start (tree valist, rtx nextarg
> *** 8868,8874 ****
> fprintf (stderr, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
> (int)n_gpr, (int)n_fpr, off);
>
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (ovf), t, size_int (off));
>
> t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
> TREE_SIDE_EFFECTS (t) = 1;
> --- 8868,8874 ----
> fprintf (stderr, "va_start: n_gpr = %d, n_fpr = %d off %d\n",
> (int)n_gpr, (int)n_fpr, off);
>
> ! t = fold_build_pointer_plus_hwi (t, off);
>
> t = build2 (MODIFY_EXPR, TREE_TYPE (ovf), ovf, t);
> TREE_SIDE_EFFECTS (t) = 1;
> *************** s390_va_start (tree valist, rtx nextarg
> *** 8880,8887 ****
> || (cfun->va_list_fpr_size && n_fpr < FP_ARG_NUM_REG))
> {
> t = make_tree (TREE_TYPE (sav), return_address_pointer_rtx);
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (sav), t,
> ! size_int (-RETURN_REGNUM * UNITS_PER_LONG));
>
> t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
> TREE_SIDE_EFFECTS (t) = 1;
> --- 8880,8886 ----
> || (cfun->va_list_fpr_size && n_fpr < FP_ARG_NUM_REG))
> {
> t = make_tree (TREE_TYPE (sav), return_address_pointer_rtx);
> ! t = fold_build_pointer_plus_hwi (t, -RETURN_REGNUM * UNITS_PER_LONG);
>
> t = build2 (MODIFY_EXPR, TREE_TYPE (sav), sav, t);
> TREE_SIDE_EFFECTS (t) = 1;
> *************** s390_gimplify_va_arg (tree valist, tree
> *** 9013,9023 ****
> t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
> gimplify_and_add (t, pre_p);
>
> ! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, sav,
> ! size_int (sav_ofs));
> u = build2 (MULT_EXPR, TREE_TYPE (reg), reg,
> fold_convert (TREE_TYPE (reg), size_int (sav_scale)));
> ! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t, fold_convert (sizetype, u));
>
> gimplify_assign (addr, t, pre_p);
>
> --- 9012,9021 ----
> t = build3 (COND_EXPR, void_type_node, t, u, NULL_TREE);
> gimplify_and_add (t, pre_p);
>
> ! t = fold_build_pointer_plus_hwi (sav, sav_ofs);
> u = build2 (MULT_EXPR, TREE_TYPE (reg), reg,
> fold_convert (TREE_TYPE (reg), size_int (sav_scale)));
> ! t = fold_build_pointer_plus (t, u);
>
> gimplify_assign (addr, t, pre_p);
>
> *************** s390_gimplify_va_arg (tree valist, tree
> *** 9030,9044 ****
>
> t = ovf;
> if (size < UNITS_PER_LONG)
> ! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t,
> ! size_int (UNITS_PER_LONG - size));
>
> gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
>
> gimplify_assign (addr, t, pre_p);
>
> ! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, t,
> ! size_int (size));
> gimplify_assign (ovf, t, pre_p);
>
> gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
> --- 9028,9040 ----
>
> t = ovf;
> if (size < UNITS_PER_LONG)
> ! t = fold_build_pointer_plus_hwi (t, UNITS_PER_LONG - size);
>
> gimplify_expr (&t, pre_p, NULL, is_gimple_val, fb_rvalue);
>
> gimplify_assign (addr, t, pre_p);
>
> ! t = fold_build_pointer_plus_hwi (t, size);
> gimplify_assign (ovf, t, pre_p);
>
> gimple_seq_add_stmt (pre_p, gimple_build_label (lab_over));
> Index: trunk/gcc/config/sh/sh.c
> ===================================================================
> *** trunk.orig/gcc/config/sh/sh.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/sh/sh.c 2011-07-11 17:13:24.000000000 +0200
> *************** sh_va_start (tree valist, rtx nextarg)
> *** 7831,7838 ****
> nfp = 8 - nfp;
> else
> nfp = 0;
> ! u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u,
> ! size_int (UNITS_PER_WORD * nfp));
> t = build2 (MODIFY_EXPR, ptr_type_node, next_fp_limit, u);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> --- 7831,7837 ----
> nfp = 8 - nfp;
> else
> nfp = 0;
> ! u = fold_build_pointer_plus_hwi (u, UNITS_PER_WORD * nfp);
> t = build2 (MODIFY_EXPR, ptr_type_node, next_fp_limit, u);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> *************** sh_va_start (tree valist, rtx nextarg)
> *** 7846,7853 ****
> nint = 4 - nint;
> else
> nint = 0;
> ! u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u,
> ! size_int (UNITS_PER_WORD * nint));
> t = build2 (MODIFY_EXPR, ptr_type_node, next_o_limit, u);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> --- 7845,7851 ----
> nint = 4 - nint;
> else
> nint = 0;
> ! u = fold_build_pointer_plus_hwi (u, UNITS_PER_WORD * nint);
> t = build2 (MODIFY_EXPR, ptr_type_node, next_o_limit, u);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> *************** sh_gimplify_va_arg_expr (tree valist, tr
> *** 7983,7990 ****
> gimplify_assign (unshare_expr (next_fp_tmp), valist, pre_p);
> tmp = next_fp_limit;
> if (size > 4 && !is_double)
> ! tmp = build2 (POINTER_PLUS_EXPR, TREE_TYPE (tmp),
> ! unshare_expr (tmp), size_int (4 - size));
> tmp = build2 (GE_EXPR, boolean_type_node,
> unshare_expr (next_fp_tmp), unshare_expr (tmp));
> cmp = build3 (COND_EXPR, void_type_node, tmp,
> --- 7981,7987 ----
> gimplify_assign (unshare_expr (next_fp_tmp), valist, pre_p);
> tmp = next_fp_limit;
> if (size > 4 && !is_double)
> ! tmp = fold_build_pointer_plus_hwi (unshare_expr (tmp), 4 - size);
> tmp = build2 (GE_EXPR, boolean_type_node,
> unshare_expr (next_fp_tmp), unshare_expr (tmp));
> cmp = build3 (COND_EXPR, void_type_node, tmp,
> *************** sh_gimplify_va_arg_expr (tree valist, tr
> *** 7999,8006 ****
> tmp = fold_convert (sizetype, next_fp_tmp);
> tmp = build2 (BIT_AND_EXPR, sizetype, tmp,
> size_int (UNITS_PER_WORD));
> ! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node,
> ! unshare_expr (next_fp_tmp), tmp);
> gimplify_assign (unshare_expr (next_fp_tmp), tmp, pre_p);
> }
> if (is_double)
> --- 7996,8002 ----
> tmp = fold_convert (sizetype, next_fp_tmp);
> tmp = build2 (BIT_AND_EXPR, sizetype, tmp,
> size_int (UNITS_PER_WORD));
> ! tmp = fold_build_pointer_plus (unshare_expr (next_fp_tmp), tmp);
> gimplify_assign (unshare_expr (next_fp_tmp), tmp, pre_p);
> }
> if (is_double)
> *************** sh_gimplify_va_arg_expr (tree valist, tr
> *** 8045,8052 ****
> }
> else
> {
> ! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node,
> ! unshare_expr (next_o), size_int (rsize));
> tmp = build2 (GT_EXPR, boolean_type_node, tmp,
> unshare_expr (next_o_limit));
> tmp = build3 (COND_EXPR, void_type_node, tmp,
> --- 8041,8047 ----
> }
> else
> {
> ! tmp = fold_build_pointer_plus_hwi (unshare_expr (next_o), rsize);
> tmp = build2 (GT_EXPR, boolean_type_node, tmp,
> unshare_expr (next_o_limit));
> tmp = build3 (COND_EXPR, void_type_node, tmp,
> Index: trunk/gcc/config/sparc/sparc.c
> ===================================================================
> *** trunk.orig/gcc/config/sparc/sparc.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/sparc/sparc.c 2011-07-11 17:13:24.000000000 +0200
> *************** sparc_gimplify_va_arg (tree valist, tree
> *** 6677,6684 ****
> incr = valist;
> if (align)
> {
> ! incr = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, incr,
> ! size_int (align - 1));
> incr = fold_convert (sizetype, incr);
> incr = fold_build2 (BIT_AND_EXPR, sizetype, incr,
> size_int (-align));
> --- 6677,6683 ----
> incr = valist;
> if (align)
> {
> ! incr = fold_build_pointer_plus_hwi (incr, align - 1);
> incr = fold_convert (sizetype, incr);
> incr = fold_build2 (BIT_AND_EXPR, sizetype, incr,
> size_int (-align));
> *************** sparc_gimplify_va_arg (tree valist, tree
> *** 6689,6696 ****
> addr = incr;
>
> if (BYTES_BIG_ENDIAN && size < rsize)
> ! addr = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, incr,
> ! size_int (rsize - size));
>
> if (indirect)
> {
> --- 6688,6694 ----
> addr = incr;
>
> if (BYTES_BIG_ENDIAN && size < rsize)
> ! addr = fold_build_pointer_plus_hwi (incr, rsize - size);
>
> if (indirect)
> {
> *************** sparc_gimplify_va_arg (tree valist, tree
> *** 6714,6721 ****
> else
> addr = fold_convert (ptrtype, addr);
>
> ! incr
> ! = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, incr, size_int (rsize));
> gimplify_assign (valist, incr, post_p);
>
> return build_va_arg_indirect_ref (addr);
> --- 6712,6718 ----
> else
> addr = fold_convert (ptrtype, addr);
>
> ! incr = fold_build_pointer_plus_hwi (incr, rsize);
> gimplify_assign (valist, incr, post_p);
>
> return build_va_arg_indirect_ref (addr);
> Index: trunk/gcc/config/spu/spu.c
> ===================================================================
> *** trunk.orig/gcc/config/spu/spu.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/spu/spu.c 2011-07-11 17:13:24.000000000 +0200
> *************** spu_va_start (tree valist, rtx nextarg)
> *** 4183,4199 ****
> /* Find the __args area. */
> t = make_tree (TREE_TYPE (args), nextarg);
> if (crtl->args.pretend_args_size > 0)
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (args), t,
> ! size_int (-STACK_POINTER_OFFSET));
> t = build2 (MODIFY_EXPR, TREE_TYPE (args), args, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
>
> /* Find the __skip area. */
> t = make_tree (TREE_TYPE (skip), virtual_incoming_args_rtx);
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (skip), t,
> ! size_int (crtl->args.pretend_args_size
> ! - STACK_POINTER_OFFSET));
> t = build2 (MODIFY_EXPR, TREE_TYPE (skip), skip, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> --- 4183,4197 ----
> /* Find the __args area. */
> t = make_tree (TREE_TYPE (args), nextarg);
> if (crtl->args.pretend_args_size > 0)
> ! t = fold_build_pointer_plus_hwi (t, -STACK_POINTER_OFFSET);
> t = build2 (MODIFY_EXPR, TREE_TYPE (args), args, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
>
> /* Find the __skip area. */
> t = make_tree (TREE_TYPE (skip), virtual_incoming_args_rtx);
> ! t = fold_build_pointer_plus_hwi (t, (crtl->args.pretend_args_size
> ! - STACK_POINTER_OFFSET));
> t = build2 (MODIFY_EXPR, TREE_TYPE (skip), skip, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> *************** spu_gimplify_va_arg_expr (tree valist, t
> *** 4223,4229 ****
> tree f_args, f_skip;
> tree args, skip;
> HOST_WIDE_INT size, rsize;
> ! tree paddedsize, addr, tmp;
> bool pass_by_reference_p;
>
> f_args = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
> --- 4221,4227 ----
> tree f_args, f_skip;
> tree args, skip;
> HOST_WIDE_INT size, rsize;
> ! tree addr, tmp;
> bool pass_by_reference_p;
>
> f_args = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
> *************** spu_gimplify_va_arg_expr (tree valist, t
> *** 4248,4268 ****
>
> /* build conditional expression to calculate addr. The expression
> will be gimplified later. */
> ! paddedsize = size_int (rsize);
> ! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node, unshare_expr (args), paddedsize);
> tmp = build2 (TRUTH_AND_EXPR, boolean_type_node,
> build2 (GT_EXPR, boolean_type_node, tmp, unshare_expr (skip)),
> build2 (LE_EXPR, boolean_type_node, unshare_expr (args),
> unshare_expr (skip)));
>
> tmp = build3 (COND_EXPR, ptr_type_node, tmp,
> ! build2 (POINTER_PLUS_EXPR, ptr_type_node, unshare_expr (skip),
> ! size_int (32)), unshare_expr (args));
>
> gimplify_assign (addr, tmp, pre_p);
>
> /* update VALIST.__args */
> ! tmp = build2 (POINTER_PLUS_EXPR, ptr_type_node, addr, paddedsize);
> gimplify_assign (unshare_expr (args), tmp, pre_p);
>
> addr = fold_convert (build_pointer_type_for_mode (type, ptr_mode, true),
> --- 4246,4265 ----
>
> /* build conditional expression to calculate addr. The expression
> will be gimplified later. */
> ! tmp = fold_build_pointer_plus_hwi (unshare_expr (args), rsize);
> tmp = build2 (TRUTH_AND_EXPR, boolean_type_node,
> build2 (GT_EXPR, boolean_type_node, tmp, unshare_expr (skip)),
> build2 (LE_EXPR, boolean_type_node, unshare_expr (args),
> unshare_expr (skip)));
>
> tmp = build3 (COND_EXPR, ptr_type_node, tmp,
> ! fold_build_pointer_plus_hwi (unshare_expr (skip), 32),
> ! unshare_expr (args));
>
> gimplify_assign (addr, tmp, pre_p);
>
> /* update VALIST.__args */
> ! tmp = fold_build_pointer_plus_hwi (addr, rsize);
> gimplify_assign (unshare_expr (args), tmp, pre_p);
>
> addr = fold_convert (build_pointer_type_for_mode (type, ptr_mode, true),
> Index: trunk/gcc/config/stormy16/stormy16.c
> ===================================================================
> *** trunk.orig/gcc/config/stormy16/stormy16.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/stormy16/stormy16.c 2011-07-11 17:13:24.000000000 +0200
> *************** xstormy16_expand_builtin_va_start (tree
> *** 1292,1298 ****
> t = make_tree (TREE_TYPE (base), virtual_incoming_args_rtx);
> u = build_int_cst (NULL_TREE, - INCOMING_FRAME_SP_OFFSET);
> u = fold_convert (TREE_TYPE (count), u);
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (base), t, u);
> t = build2 (MODIFY_EXPR, TREE_TYPE (base), base, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> --- 1292,1298 ----
> t = make_tree (TREE_TYPE (base), virtual_incoming_args_rtx);
> u = build_int_cst (NULL_TREE, - INCOMING_FRAME_SP_OFFSET);
> u = fold_convert (TREE_TYPE (count), u);
> ! t = fold_build_pointer_plus (t, u);
> t = build2 (MODIFY_EXPR, TREE_TYPE (base), base, t);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> *************** xstormy16_gimplify_va_arg_expr (tree val
> *** 1350,1356 ****
> NULL_TREE);
> gimplify_and_add (t, pre_p);
>
> ! t = build2 (POINTER_PLUS_EXPR, ptr_type_node, base, count_tmp);
> gimplify_assign (addr, t, pre_p);
>
> t = build1 (GOTO_EXPR, void_type_node, lab_gotaddr);
> --- 1350,1356 ----
> NULL_TREE);
> gimplify_and_add (t, pre_p);
>
> ! t = fold_build_pointer_plus (base, count_tmp);
> gimplify_assign (addr, t, pre_p);
>
> t = build1 (GOTO_EXPR, void_type_node, lab_gotaddr);
> *************** xstormy16_gimplify_va_arg_expr (tree val
> *** 1385,1391 ****
> fold_convert (TREE_TYPE (count), size_tree));
> t = fold_convert (TREE_TYPE (t), fold (t));
> t = fold_build1 (NEGATE_EXPR, TREE_TYPE (t), t);
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (base), base, t);
> gimplify_assign (addr, t, pre_p);
>
> t = build1 (LABEL_EXPR, void_type_node, lab_gotaddr);
> --- 1385,1391 ----
> fold_convert (TREE_TYPE (count), size_tree));
> t = fold_convert (TREE_TYPE (t), fold (t));
> t = fold_build1 (NEGATE_EXPR, TREE_TYPE (t), t);
> ! t = fold_build_pointer_plus (base, t);
> gimplify_assign (addr, t, pre_p);
>
> t = build1 (LABEL_EXPR, void_type_node, lab_gotaddr);
> Index: trunk/gcc/config/xtensa/xtensa.c
> ===================================================================
> *** trunk.orig/gcc/config/xtensa/xtensa.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/config/xtensa/xtensa.c 2011-07-11 17:13:24.000000000 +0200
> *************** xtensa_va_start (tree valist, rtx nextar
> *** 2853,2859 ****
>
> /* Set the __va_stk member to ($arg_ptr - 32). */
> u = make_tree (ptr_type_node, virtual_incoming_args_rtx);
> ! u = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, u, size_int (-32));
> t = build2 (MODIFY_EXPR, ptr_type_node, stk, u);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> --- 2853,2859 ----
>
> /* Set the __va_stk member to ($arg_ptr - 32). */
> u = make_tree (ptr_type_node, virtual_incoming_args_rtx);
> ! u = fold_build_pointer_plus_hwi (u, -32);
> t = build2 (MODIFY_EXPR, ptr_type_node, stk, u);
> TREE_SIDE_EFFECTS (t) = 1;
> expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
> *************** xtensa_gimplify_va_arg_expr (tree valist
> *** 3042,3048 ****
>
> t = fold_convert (sizetype, unshare_expr (ndx));
> t = build2 (MINUS_EXPR, sizetype, t, size);
> ! addr = build2 (POINTER_PLUS_EXPR, ptr_type_node, unshare_expr (array), t);
>
> addr = fold_convert (build_pointer_type (type), addr);
> if (indirect)
> --- 3042,3048 ----
>
> t = fold_convert (sizetype, unshare_expr (ndx));
> t = build2 (MINUS_EXPR, sizetype, t, size);
> ! addr = fold_build_pointer_plus (unshare_expr (array), t);
>
> addr = fold_convert (build_pointer_type (type), addr);
> if (indirect)
> Index: trunk/gcc/cp/call.c
> ===================================================================
> *** trunk.orig/gcc/cp/call.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/cp/call.c 2011-07-11 17:13:24.000000000 +0200
> *************** build_special_member_call (tree instance
> *** 6936,6943 ****
> current_vtt_parm,
> vtt);
> gcc_assert (BINFO_SUBVTT_INDEX (binfo));
> ! sub_vtt = build2 (POINTER_PLUS_EXPR, TREE_TYPE (vtt), vtt,
> ! BINFO_SUBVTT_INDEX (binfo));
>
> if (args == NULL)
> {
> --- 6936,6942 ----
> current_vtt_parm,
> vtt);
> gcc_assert (BINFO_SUBVTT_INDEX (binfo));
> ! sub_vtt = fold_build_pointer_plus (vtt, BINFO_SUBVTT_INDEX (binfo));
>
> if (args == NULL)
> {
> Index: trunk/gcc/cp/class.c
> ===================================================================
> *** trunk.orig/gcc/cp/class.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/cp/class.c 2011-07-11 17:28:24.000000000 +0200
> *************** build_base_path (enum tree_code code,
> *** 374,381 ****
> tf_warning_or_error),
> TREE_TYPE (TREE_TYPE (expr)));
>
> ! v_offset = build2 (POINTER_PLUS_EXPR, TREE_TYPE (v_offset),
> ! v_offset, fold_convert (sizetype, BINFO_VPTR_FIELD (v_binfo)));
> v_offset = build1 (NOP_EXPR,
> build_pointer_type (ptrdiff_type_node),
> v_offset);
> --- 374,380 ----
> tf_warning_or_error),
> TREE_TYPE (TREE_TYPE (expr)));
>
> ! v_offset = fold_build_pointer_plus (v_offset, BINFO_VPTR_FIELD (v_binfo));
> v_offset = build1 (NOP_EXPR,
> build_pointer_type (ptrdiff_type_node),
> v_offset);
> *************** build_base_path (enum tree_code code,
> *** 413,419 ****
> offset = fold_convert (sizetype, offset);
> if (code == MINUS_EXPR)
> offset = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, offset);
> ! expr = build2 (POINTER_PLUS_EXPR, ptr_target_type, expr, offset);
> }
> else
> null_test = NULL;
> --- 412,418 ----
> offset = fold_convert (sizetype, offset);
> if (code == MINUS_EXPR)
> offset = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, offset);
> ! expr = fold_build_pointer_plus (expr, offset);
> }
> else
> null_test = NULL;
> *************** convert_to_base_statically (tree expr, t
> *** 540,549 ****
> expr_type = TREE_TYPE (expr);
> if (!SAME_BINFO_TYPE_P (BINFO_TYPE (base), expr_type))
> {
> - tree pointer_type;
> -
> - pointer_type = build_pointer_type (expr_type);
> -
> /* We use fold_build2 and fold_convert below to simplify the trees
> provided to the optimizers. It is not safe to call these functions
> when processing a template because they do not handle C++-specific
> --- 539,544 ----
> *************** convert_to_base_statically (tree expr, t
> *** 551,559 ****
> gcc_assert (!processing_template_decl);
> expr = cp_build_addr_expr (expr, tf_warning_or_error);
> if (!integer_zerop (BINFO_OFFSET (base)))
> ! expr = fold_build2_loc (input_location,
> ! POINTER_PLUS_EXPR, pointer_type, expr,
> ! fold_convert (sizetype, BINFO_OFFSET (base)));
> expr = fold_convert (build_pointer_type (BINFO_TYPE (base)), expr);
> expr = build_fold_indirect_ref_loc (input_location, expr);
> }
> --- 546,553 ----
> gcc_assert (!processing_template_decl);
> expr = cp_build_addr_expr (expr, tf_warning_or_error);
> if (!integer_zerop (BINFO_OFFSET (base)))
> ! expr = fold_build_pointer_plus_loc (input_location,
> ! expr, BINFO_OFFSET (base));
> expr = fold_convert (build_pointer_type (BINFO_TYPE (base)), expr);
> expr = build_fold_indirect_ref_loc (input_location, expr);
> }
> *************** dfs_accumulate_vtbl_inits (tree binfo,
> *** 7833,7845 ****
>
> /* Figure out the position to which the VPTR should point. */
> vtbl = build1 (ADDR_EXPR, vtbl_ptr_type_node, orig_vtbl);
> - index = size_binop (PLUS_EXPR,
> - size_int (non_fn_entries),
> - size_int (n_inits));
> index = size_binop (MULT_EXPR,
> TYPE_SIZE_UNIT (vtable_entry_type),
> ! index);
> ! vtbl = build2 (POINTER_PLUS_EXPR, TREE_TYPE (vtbl), vtbl, index);
> }
>
> if (ctor_vtbl_p)
> --- 7827,7836 ----
>
> /* Figure out the position to which the VPTR should point. */
> vtbl = build1 (ADDR_EXPR, vtbl_ptr_type_node, orig_vtbl);
> index = size_binop (MULT_EXPR,
> TYPE_SIZE_UNIT (vtable_entry_type),
> ! size_int (non_fn_entries + n_inits));
> ! vtbl = fold_build_pointer_plus (vtbl, index);
> }
>
> if (ctor_vtbl_p)
> Index: trunk/gcc/cp/cp-gimplify.c
> ===================================================================
> *** trunk.orig/gcc/cp/cp-gimplify.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/cp/cp-gimplify.c 2011-07-11 17:13:24.000000000 +0200
> *************** cxx_omp_clause_apply_fn (tree fn, tree a
> *** 1230,1236 ****
> start2 = build_fold_addr_expr_loc (input_location, start2);
>
> end1 = TYPE_SIZE_UNIT (TREE_TYPE (arg1));
> ! end1 = build2 (POINTER_PLUS_EXPR, TREE_TYPE (start1), start1, end1);
>
> p1 = create_tmp_var (TREE_TYPE (start1), NULL);
> t = build2 (MODIFY_EXPR, TREE_TYPE (p1), p1, start1);
> --- 1230,1236 ----
> start2 = build_fold_addr_expr_loc (input_location, start2);
>
> end1 = TYPE_SIZE_UNIT (TREE_TYPE (arg1));
> ! end1 = fold_build_pointer_plus (start1, end1);
>
> p1 = create_tmp_var (TREE_TYPE (start1), NULL);
> t = build2 (MODIFY_EXPR, TREE_TYPE (p1), p1, start1);
> *************** cxx_omp_clause_apply_fn (tree fn, tree a
> *** 1260,1274 ****
> t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
> append_to_statement_list (t, &ret);
>
> ! t = TYPE_SIZE_UNIT (inner_type);
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (p1), p1, t);
> t = build2 (MODIFY_EXPR, TREE_TYPE (p1), p1, t);
> append_to_statement_list (t, &ret);
>
> if (arg2)
> {
> ! t = TYPE_SIZE_UNIT (inner_type);
> ! t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (p2), p2, t);
> t = build2 (MODIFY_EXPR, TREE_TYPE (p2), p2, t);
> append_to_statement_list (t, &ret);
> }
> --- 1260,1272 ----
> t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
> append_to_statement_list (t, &ret);
>
> ! t = fold_build_pointer_plus (p1, TYPE_SIZE_UNIT (inner_type));
> t = build2 (MODIFY_EXPR, TREE_TYPE (p1), p1, t);
> append_to_statement_list (t, &ret);
>
> if (arg2)
> {
> ! t = fold_build_pointer_plus (p2, TYPE_SIZE_UNIT (inner_type));
> t = build2 (MODIFY_EXPR, TREE_TYPE (p2), p2, t);
> append_to_statement_list (t, &ret);
> }
> Index: trunk/gcc/cp/except.c
> ===================================================================
> *** trunk.orig/gcc/cp/except.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/cp/except.c 2011-07-11 17:13:24.000000000 +0200
> *************** expand_start_catch_block (tree decl)
> *** 452,461 ****
> generic exception header. */
> exp = build_exc_ptr ();
> exp = build1 (NOP_EXPR, build_pointer_type (type), exp);
> ! exp = build2 (POINTER_PLUS_EXPR, TREE_TYPE (exp), exp,
> fold_build1_loc (input_location,
> ! NEGATE_EXPR, sizetype,
> ! TYPE_SIZE_UNIT (TREE_TYPE (exp))));
> exp = cp_build_indirect_ref (exp, RO_NULL, tf_warning_or_error);
> initialize_handler_parm (decl, exp);
> return type;
> --- 452,461 ----
> generic exception header. */
> exp = build_exc_ptr ();
> exp = build1 (NOP_EXPR, build_pointer_type (type), exp);
> ! exp = fold_build_pointer_plus (exp,
> fold_build1_loc (input_location,
> ! NEGATE_EXPR, sizetype,
> ! TYPE_SIZE_UNIT (TREE_TYPE (exp))));
> exp = cp_build_indirect_ref (exp, RO_NULL, tf_warning_or_error);
> initialize_handler_parm (decl, exp);
> return type;
> Index: trunk/gcc/cp/init.c
> ===================================================================
> *** trunk.orig/gcc/cp/init.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/cp/init.c 2011-07-11 17:13:24.000000000 +0200
> *************** expand_virtual_init (tree binfo, tree de
> *** 1063,1072 ****
>
> /* Compute the value to use, when there's a VTT. */
> vtt_parm = current_vtt_parm;
> ! vtbl2 = build2 (POINTER_PLUS_EXPR,
> ! TREE_TYPE (vtt_parm),
> ! vtt_parm,
> ! vtt_index);
> vtbl2 = cp_build_indirect_ref (vtbl2, RO_NULL, tf_warning_or_error);
> vtbl2 = convert (TREE_TYPE (vtbl), vtbl2);
>
> --- 1063,1069 ----
>
> /* Compute the value to use, when there's a VTT. */
> vtt_parm = current_vtt_parm;
> ! vtbl2 = fold_build_pointer_plus (vtt_parm, vtt_index);
> vtbl2 = cp_build_indirect_ref (vtbl2, RO_NULL, tf_warning_or_error);
> vtbl2 = convert (TREE_TYPE (vtbl), vtbl2);
>
> *************** build_new_1 (VEC(tree,gc) **placement, t
> *** 2310,2325 ****
> tree size_ptr_type;
>
> /* Adjust so we're pointing to the start of the object. */
> ! data_addr = build2 (POINTER_PLUS_EXPR, TREE_TYPE (alloc_node),
> ! alloc_node, cookie_size);
>
> /* Store the number of bytes allocated so that we can know how
> many elements to destroy later. We use the last sizeof
> (size_t) bytes to store the number of elements. */
> cookie_ptr = size_binop (MINUS_EXPR, cookie_size, size_in_bytes (sizetype));
> ! cookie_ptr = fold_build2_loc (input_location,
> ! POINTER_PLUS_EXPR, TREE_TYPE (alloc_node),
> ! alloc_node, cookie_ptr);
> size_ptr_type = build_pointer_type (sizetype);
> cookie_ptr = fold_convert (size_ptr_type, cookie_ptr);
> cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
> --- 2307,2320 ----
> tree size_ptr_type;
>
> /* Adjust so we're pointing to the start of the object. */
> ! data_addr = fold_build_pointer_plus (alloc_node, cookie_size);
>
> /* Store the number of bytes allocated so that we can know how
> many elements to destroy later. We use the last sizeof
> (size_t) bytes to store the number of elements. */
> cookie_ptr = size_binop (MINUS_EXPR, cookie_size, size_in_bytes (sizetype));
> ! cookie_ptr = fold_build_pointer_plus_loc (input_location,
> ! alloc_node, cookie_ptr);
> size_ptr_type = build_pointer_type (sizetype);
> cookie_ptr = fold_convert (size_ptr_type, cookie_ptr);
> cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
> *************** build_new_1 (VEC(tree,gc) **placement, t
> *** 2329,2338 ****
> if (targetm.cxx.cookie_has_size ())
> {
> /* Also store the element size. */
> ! cookie_ptr = build2 (POINTER_PLUS_EXPR, size_ptr_type, cookie_ptr,
> fold_build1_loc (input_location,
> ! NEGATE_EXPR, sizetype,
> ! size_in_bytes (sizetype)));
>
> cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
> cookie = build2 (MODIFY_EXPR, sizetype, cookie,
> --- 2324,2333 ----
> if (targetm.cxx.cookie_has_size ())
> {
> /* Also store the element size. */
> ! cookie_ptr = fold_build_pointer_plus (cookie_ptr,
> fold_build1_loc (input_location,
> ! NEGATE_EXPR, sizetype,
> ! size_in_bytes (sizetype)));
>
> cookie = cp_build_indirect_ref (cookie_ptr, RO_NULL, complain);
> cookie = build2 (MODIFY_EXPR, sizetype, cookie,
> *************** build_vec_delete_1 (tree base, tree maxi
> *** 2801,2812 ****
> convert (sizetype, maxindex));
>
> tbase = create_temporary_var (ptype);
> ! tbase_init = cp_build_modify_expr (tbase, NOP_EXPR,
> ! fold_build2_loc (input_location,
> ! POINTER_PLUS_EXPR, ptype,
> ! fold_convert (ptype, base),
> ! virtual_size),
> ! complain);
> if (tbase_init == error_mark_node)
> return error_mark_node;
> controller = build3 (BIND_EXPR, void_type_node, tbase,
> --- 2796,2808 ----
> convert (sizetype, maxindex));
>
> tbase = create_temporary_var (ptype);
> ! tbase_init
> ! = cp_build_modify_expr (tbase, NOP_EXPR,
> ! fold_build_pointer_plus_loc (input_location,
> ! fold_convert (ptype,
> ! base),
> ! virtual_size),
> ! complain);
> if (tbase_init == error_mark_node)
> return error_mark_node;
> controller = build3 (BIND_EXPR, void_type_node, tbase,
> *************** build_vec_delete_1 (tree base, tree maxi
> *** 2817,2823 ****
> build2 (EQ_EXPR, boolean_type_node, tbase,
> fold_convert (ptype, base)));
> tmp = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, size_exp);
> ! tmp = build2 (POINTER_PLUS_EXPR, ptype, tbase, tmp);
> tmp = cp_build_modify_expr (tbase, NOP_EXPR, tmp, complain);
> if (tmp == error_mark_node)
> return error_mark_node;
> --- 2813,2819 ----
> build2 (EQ_EXPR, boolean_type_node, tbase,
> fold_convert (ptype, base)));
> tmp = fold_build1_loc (input_location, NEGATE_EXPR, sizetype, size_exp);
> ! tmp = fold_build_pointer_plus (tbase, tmp);
> tmp = cp_build_modify_expr (tbase, NOP_EXPR, tmp, complain);
> if (tmp == error_mark_node)
> return error_mark_node;
> *************** build_vec_delete (tree base, tree maxind
> *** 3751,3760 ****
> type = strip_array_types (TREE_TYPE (type));
> cookie_addr = fold_build1_loc (input_location, NEGATE_EXPR,
> sizetype, TYPE_SIZE_UNIT (sizetype));
> ! cookie_addr = build2 (POINTER_PLUS_EXPR,
> ! size_ptr_type,
> ! fold_convert (size_ptr_type, base),
> ! cookie_addr);
> maxindex = cp_build_indirect_ref (cookie_addr, RO_NULL, complain);
> }
> else if (TREE_CODE (type) == ARRAY_TYPE)
> --- 3747,3754 ----
> type = strip_array_types (TREE_TYPE (type));
> cookie_addr = fold_build1_loc (input_location, NEGATE_EXPR,
> sizetype, TYPE_SIZE_UNIT (sizetype));
> ! cookie_addr = fold_build_pointer_plus (fold_convert (size_ptr_type, base),
> ! cookie_addr);
> maxindex = cp_build_indirect_ref (cookie_addr, RO_NULL, complain);
> }
> else if (TREE_CODE (type) == ARRAY_TYPE)
> Index: trunk/gcc/cp/rtti.c
> ===================================================================
> *** trunk.orig/gcc/cp/rtti.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/cp/rtti.c 2011-07-11 17:13:24.000000000 +0200
> *************** build_headof (tree exp)
> *** 192,199 ****
>
> type = cp_build_qualified_type (ptr_type_node,
> cp_type_quals (TREE_TYPE (exp)));
> ! return build2 (POINTER_PLUS_EXPR, type, exp,
> ! convert_to_integer (sizetype, offset));
> }
>
> /* Get a bad_cast node for the program to throw...
> --- 192,198 ----
>
> type = cp_build_qualified_type (ptr_type_node,
> cp_type_quals (TREE_TYPE (exp)));
> ! return fold_build_pointer_plus (exp, offset);
> }
>
> /* Get a bad_cast node for the program to throw...
> *************** tinfo_base_init (tinfo_s *ti, tree targe
> *** 918,925 ****
> vtable_ptr = cp_build_addr_expr (vtable_ptr, tf_warning_or_error);
>
> /* We need to point into the middle of the vtable. */
> ! vtable_ptr = build2
> ! (POINTER_PLUS_EXPR, TREE_TYPE (vtable_ptr), vtable_ptr,
> size_binop (MULT_EXPR,
> size_int (2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE),
> TYPE_SIZE_UNIT (vtable_entry_type)));
> --- 917,924 ----
> vtable_ptr = cp_build_addr_expr (vtable_ptr, tf_warning_or_error);
>
> /* We need to point into the middle of the vtable. */
> ! vtable_ptr = fold_build_pointer_plus
> ! (vtable_ptr,
> size_binop (MULT_EXPR,
> size_int (2 * TARGET_VTABLE_DATA_ENTRY_DISTANCE),
> TYPE_SIZE_UNIT (vtable_entry_type)));
> Index: trunk/gcc/cp/typeck.c
> ===================================================================
> *** trunk.orig/gcc/cp/typeck.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/cp/typeck.c 2011-07-11 17:13:24.000000000 +0200
> *************** get_member_function_from_ptrfunc (tree *
> *** 3078,3085 ****
> return error_mark_node;
> }
> /* ...and then the delta in the PMF. */
> ! instance_ptr = build2 (POINTER_PLUS_EXPR, TREE_TYPE (instance_ptr),
> ! instance_ptr, fold_convert (sizetype, delta));
>
> /* Hand back the adjusted 'this' argument to our caller. */
> *instance_ptrptr = instance_ptr;
> --- 3078,3084 ----
> return error_mark_node;
> }
> /* ...and then the delta in the PMF. */
> ! instance_ptr = fold_build_pointer_plus (instance_ptr, delta);
>
> /* Hand back the adjusted 'this' argument to our caller. */
> *instance_ptrptr = instance_ptr;
> *************** get_member_function_from_ptrfunc (tree *
> *** 3094,3102 ****
> TREE_NO_WARNING (vtbl) = 1;
>
> /* Finally, extract the function pointer from the vtable. */
> ! e2 = fold_build2_loc (input_location,
> ! POINTER_PLUS_EXPR, TREE_TYPE (vtbl), vtbl,
> ! fold_convert (sizetype, idx));
> e2 = cp_build_indirect_ref (e2, RO_NULL, tf_warning_or_error);
> TREE_CONSTANT (e2) = 1;
>
> --- 3093,3099 ----
> TREE_NO_WARNING (vtbl) = 1;
>
> /* Finally, extract the function pointer from the vtable. */
> ! e2 = fold_build_pointer_plus_loc (input_location, vtbl, idx);
> e2 = cp_build_indirect_ref (e2, RO_NULL, tf_warning_or_error);
> TREE_CONSTANT (e2) = 1;
>
> *************** cp_build_addr_expr_1 (tree arg, bool str
> *** 4841,4848 ****
> {
> tree type = build_pointer_type (argtype);
> tree op0 = fold_convert (type, TREE_OPERAND (val, 0));
> ! tree op1 = fold_convert (sizetype, fold_offsetof (arg, val));
> ! return fold_build2 (POINTER_PLUS_EXPR, type, op0, op1);
> }
>
> /* Handle complex lvalues (when permitted)
> --- 4838,4845 ----
> {
> tree type = build_pointer_type (argtype);
> tree op0 = fold_convert (type, TREE_OPERAND (val, 0));
> ! tree op1 = fold_offsetof (arg, val);
> ! return fold_build_pointer_plus (op0, op1);
> }
>
> /* Handle complex lvalues (when permitted)
> Index: trunk/gcc/cp/typeck2.c
> ===================================================================
> *** trunk.orig/gcc/cp/typeck2.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/cp/typeck2.c 2011-07-11 17:13:24.000000000 +0200
> *************** build_m_component_ref (tree datum, tree
> *** 1566,1574 ****
> /* Build an expression for "object + offset" where offset is the
> value stored in the pointer-to-data-member. */
> ptype = build_pointer_type (type);
> ! datum = build2 (POINTER_PLUS_EXPR, ptype,
> ! fold_convert (ptype, datum),
> ! build_nop (sizetype, component));
> datum = cp_build_indirect_ref (datum, RO_NULL, tf_warning_or_error);
> /* If the object expression was an rvalue, return an rvalue. */
> if (!is_lval)
> --- 1566,1572 ----
> /* Build an expression for "object + offset" where offset is the
> value stored in the pointer-to-data-member. */
> ptype = build_pointer_type (type);
> ! datum = fold_build_pointer_plus (fold_convert (ptype, datum), component);
> datum = cp_build_indirect_ref (datum, RO_NULL, tf_warning_or_error);
> /* If the object expression was an rvalue, return an rvalue. */
> if (!is_lval)
> Index: trunk/gcc/fortran/trans-expr.c
> ===================================================================
> *** trunk.orig/gcc/fortran/trans-expr.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/fortran/trans-expr.c 2011-07-11 17:13:24.000000000 +0200
> *************** fill_with_spaces (tree start, tree type,
> *** 3788,3795 ****
> fold_build2_loc (input_location, MINUS_EXPR, sizetype, i,
> TYPE_SIZE_UNIT (type)));
> gfc_add_modify (&loop, el,
> ! fold_build2_loc (input_location, POINTER_PLUS_EXPR,
> ! TREE_TYPE (el), el, TYPE_SIZE_UNIT (type)));
>
> /* Making the loop... actually loop! */
> tmp = gfc_finish_block (&loop);
> --- 3788,3795 ----
> fold_build2_loc (input_location, MINUS_EXPR, sizetype, i,
> TYPE_SIZE_UNIT (type)));
> gfc_add_modify (&loop, el,
> ! fold_build_pointer_plus_loc (input_location,
> ! el, TYPE_SIZE_UNIT (type)));
>
> /* Making the loop... actually loop! */
> tmp = gfc_finish_block (&loop);
> *************** gfc_trans_string_copy (stmtblock_t * blo
> *** 3915,3922 ****
> built_in_decls[BUILT_IN_MEMMOVE],
> 3, dest, src, slen);
>
> ! tmp4 = fold_build2_loc (input_location, POINTER_PLUS_EXPR, TREE_TYPE (dest),
> ! dest, fold_convert (sizetype, slen));
> tmp4 = fill_with_spaces (tmp4, chartype,
> fold_build2_loc (input_location, MINUS_EXPR,
> TREE_TYPE(dlen), dlen, slen));
> --- 3915,3921 ----
> built_in_decls[BUILT_IN_MEMMOVE],
> 3, dest, src, slen);
>
> ! tmp4 = fold_build_pointer_plus_loc (input_location, dest, slen);
> tmp4 = fill_with_spaces (tmp4, chartype,
> fold_build2_loc (input_location, MINUS_EXPR,
> TREE_TYPE(dlen), dlen, slen));
> Index: trunk/gcc/fortran/trans-intrinsic.c
> ===================================================================
> *** trunk.orig/gcc/fortran/trans-intrinsic.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/fortran/trans-intrinsic.c 2011-07-11 17:13:24.000000000 +0200
> *************** gfc_conv_intrinsic_repeat (gfc_se * se,
> *** 5998,6006 ****
> fold_convert (gfc_charlen_type_node, count));
> tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_charlen_type_node,
> tmp, fold_convert (gfc_charlen_type_node, size));
> ! tmp = fold_build2_loc (input_location, POINTER_PLUS_EXPR, pvoid_type_node,
> ! fold_convert (pvoid_type_node, dest),
> ! fold_convert (sizetype, tmp));
> tmp = build_call_expr_loc (input_location,
> built_in_decls[BUILT_IN_MEMMOVE], 3, tmp, src,
> fold_build2_loc (input_location, MULT_EXPR,
> --- 5998,6005 ----
> fold_convert (gfc_charlen_type_node, count));
> tmp = fold_build2_loc (input_location, MULT_EXPR, gfc_charlen_type_node,
> tmp, fold_convert (gfc_charlen_type_node, size));
> ! tmp = fold_build_pointer_plus_loc (input_location,
> ! fold_convert (pvoid_type_node, dest), tmp);
> tmp = build_call_expr_loc (input_location,
> built_in_decls[BUILT_IN_MEMMOVE], 3, tmp, src,
> fold_build2_loc (input_location, MULT_EXPR,
> Index: trunk/gcc/fortran/trans-types.c
> ===================================================================
> *** trunk.orig/gcc/fortran/trans-types.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/fortran/trans-types.c 2011-07-11 17:13:24.000000000 +0200
> *************** gfc_get_array_descr_info (const_tree typ
> *** 2885,2891 ****
>
> t = base_decl;
> if (!integer_zerop (data_off))
> ! t = build2 (POINTER_PLUS_EXPR, ptype, t, data_off);
> t = build1 (NOP_EXPR, build_pointer_type (ptr_type_node), t);
> info->data_location = build1 (INDIRECT_REF, ptr_type_node, t);
> if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
> --- 2885,2891 ----
>
> t = base_decl;
> if (!integer_zerop (data_off))
> ! t = fold_build_pointer_plus (t, data_off);
> t = build1 (NOP_EXPR, build_pointer_type (ptr_type_node), t);
> info->data_location = build1 (INDIRECT_REF, ptr_type_node, t);
> if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
> *************** gfc_get_array_descr_info (const_tree typ
> *** 2898,2909 ****
>
> for (dim = 0; dim < rank; dim++)
> {
> ! t = build2 (POINTER_PLUS_EXPR, ptype, base_decl,
> ! size_binop (PLUS_EXPR, dim_off, lower_suboff));
> t = build1 (INDIRECT_REF, gfc_array_index_type, t);
> info->dimen[dim].lower_bound = t;
> ! t = build2 (POINTER_PLUS_EXPR, ptype, base_decl,
> ! size_binop (PLUS_EXPR, dim_off, upper_suboff));
> t = build1 (INDIRECT_REF, gfc_array_index_type, t);
> info->dimen[dim].upper_bound = t;
> if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_SHAPE
> --- 2898,2911 ----
>
> for (dim = 0; dim < rank; dim++)
> {
> ! t = fold_build_pointer_plus (base_decl,
> ! size_binop (PLUS_EXPR,
> ! dim_off, lower_suboff));
> t = build1 (INDIRECT_REF, gfc_array_index_type, t);
> info->dimen[dim].lower_bound = t;
> ! t = fold_build_pointer_plus (base_decl,
> ! size_binop (PLUS_EXPR,
> ! dim_off, upper_suboff));
> t = build1 (INDIRECT_REF, gfc_array_index_type, t);
> info->dimen[dim].upper_bound = t;
> if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_SHAPE
> *************** gfc_get_array_descr_info (const_tree typ
> *** 2922,2929 ****
> info->dimen[dim].lower_bound,
> info->dimen[dim].upper_bound);
> }
> ! t = build2 (POINTER_PLUS_EXPR, ptype, base_decl,
> ! size_binop (PLUS_EXPR, dim_off, stride_suboff));
> t = build1 (INDIRECT_REF, gfc_array_index_type, t);
> t = build2 (MULT_EXPR, gfc_array_index_type, t, elem_size);
> info->dimen[dim].stride = t;
> --- 2924,2932 ----
> info->dimen[dim].lower_bound,
> info->dimen[dim].upper_bound);
> }
> ! t = fold_build_pointer_plus (base_decl,
> ! size_binop (PLUS_EXPR,
> ! dim_off, stride_suboff));
> t = build1 (INDIRECT_REF, gfc_array_index_type, t);
> t = build2 (MULT_EXPR, gfc_array_index_type, t, elem_size);
> info->dimen[dim].stride = t;
> Index: trunk/gcc/fortran/trans.c
> ===================================================================
> *** trunk.orig/gcc/fortran/trans.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/fortran/trans.c 2011-07-11 17:13:24.000000000 +0200
> *************** gfc_build_array_ref (tree base, tree off
> *** 345,353 ****
> gfc_array_index_type,
> offset, GFC_DECL_SPAN(decl));
> tmp = gfc_build_addr_expr (pvoid_type_node, base);
> ! tmp = fold_build2_loc (input_location, POINTER_PLUS_EXPR,
> ! pvoid_type_node, tmp,
> ! fold_convert (sizetype, offset));
> tmp = fold_convert (build_pointer_type (type), tmp);
> if (!TYPE_STRING_FLAG (type))
> tmp = build_fold_indirect_ref_loc (input_location, tmp);
> --- 345,351 ----
> gfc_array_index_type,
> offset, GFC_DECL_SPAN(decl));
> tmp = gfc_build_addr_expr (pvoid_type_node, base);
> ! tmp = fold_build_pointer_plus_loc (input_location, tmp, offset);
> tmp = fold_convert (build_pointer_type (type), tmp);
> if (!TYPE_STRING_FLAG (type))
> tmp = build_fold_indirect_ref_loc (input_location, tmp);
> Index: trunk/gcc/java/builtins.c
> ===================================================================
> *** trunk.orig/gcc/java/builtins.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/java/builtins.c 2011-07-11 17:13:24.000000000 +0200
> *************** static tree
> *** 283,292 ****
> build_addr_sum (tree type, tree addr, tree offset)
> {
> tree ptr_type = build_pointer_type (type);
> ! return fold_build2 (POINTER_PLUS_EXPR,
> ! ptr_type,
> ! fold_convert (ptr_type, addr),
> ! fold_convert (sizetype, offset));
> }
>
> /* Make sure that this-arg is non-NULL. This is a security check. */
> --- 283,289 ----
> build_addr_sum (tree type, tree addr, tree offset)
> {
> tree ptr_type = build_pointer_type (type);
> ! return fold_build_pointer_plus (fold_convert (ptr_type, addr), offset);
> }
>
> /* Make sure that this-arg is non-NULL. This is a security check. */
> Index: trunk/gcc/java/class.c
> ===================================================================
> *** trunk.orig/gcc/java/class.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/java/class.c 2011-07-11 17:13:24.000000000 +0200
> *************** make_class_data (tree type)
> *** 2085,2094 ****
> PUSH_FIELD_VALUE (v1, "vtable",
> (flag_indirect_classes
> ? null_pointer_node
> ! : build2 (POINTER_PLUS_EXPR, dtable_ptr_type,
> ! build1 (ADDR_EXPR, dtable_ptr_type,
> ! class_dtable_decl),
> ! dtable_start_offset)));
> if (! flag_hash_synchronization)
> PUSH_FIELD_VALUE (v1, "sync_info", null_pointer_node);
> FINISH_RECORD_CONSTRUCTOR (temp, v1, object_type_node);
> --- 2085,2094 ----
> PUSH_FIELD_VALUE (v1, "vtable",
> (flag_indirect_classes
> ? null_pointer_node
> ! : fold_build_pointer_plus
> ! (build1 (ADDR_EXPR, dtable_ptr_type,
> ! class_dtable_decl),
> ! dtable_start_offset)));
> if (! flag_hash_synchronization)
> PUSH_FIELD_VALUE (v1, "sync_info", null_pointer_node);
> FINISH_RECORD_CONSTRUCTOR (temp, v1, object_type_node);
> *************** make_class_data (tree type)
> *** 2131,2140 ****
> PUSH_FIELD_VALUE (v2, "vtable",
> (flag_indirect_dispatch || dtable_decl == NULL_TREE
> ? null_pointer_node
> ! : build2 (POINTER_PLUS_EXPR, dtable_ptr_type,
> ! build1 (ADDR_EXPR, dtable_ptr_type,
> ! dtable_decl),
> ! dtable_start_offset)));
> add_table_and_syms (&v2, TYPE_OTABLE_METHODS (type),
> "otable", TYPE_OTABLE_DECL (type), otable_ptr_type,
> "otable_syms", TYPE_OTABLE_SYMS_DECL (type));
> --- 2131,2140 ----
> PUSH_FIELD_VALUE (v2, "vtable",
> (flag_indirect_dispatch || dtable_decl == NULL_TREE
> ? null_pointer_node
> ! : fold_build_pointer_plus
> ! (build1 (ADDR_EXPR, dtable_ptr_type,
> ! dtable_decl),
> ! dtable_start_offset)));
> add_table_and_syms (&v2, TYPE_OTABLE_METHODS (type),
> "otable", TYPE_OTABLE_DECL (type), otable_ptr_type,
> "otable_syms", TYPE_OTABLE_SYMS_DECL (type));
> *************** build_symbol_entry (tree decl, tree spec
> *** 2896,2903 ****
> system that this is a "special" symbol, i.e. one that should
> bypass access controls. */
> if (special != NULL_TREE)
> ! signature = build2 (POINTER_PLUS_EXPR, TREE_TYPE (signature), signature,
> ! fold_convert (sizetype, special));
>
> return build_symbol_table_entry (clname, name, signature);
> }
> --- 2896,2902 ----
> system that this is a "special" symbol, i.e. one that should
> bypass access controls. */
> if (special != NULL_TREE)
> ! signature = fold_build_pointer_plus (signature, special);
>
> return build_symbol_table_entry (clname, name, signature);
> }
> Index: trunk/gcc/java/except.c
> ===================================================================
> *** trunk.orig/gcc/java/except.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/java/except.c 2011-07-11 17:13:24.000000000 +0200
> *************** build_exception_object_ref (tree type)
> *** 488,494 ****
> The java object is immediately before the generic exception header. */
> obj = build_exception_object_var ();
> obj = fold_convert (build_pointer_type (type), obj);
> ! obj = build2 (POINTER_PLUS_EXPR, TREE_TYPE (obj), obj,
> fold_build1 (NEGATE_EXPR, sizetype,
> TYPE_SIZE_UNIT (TREE_TYPE (obj))));
> obj = build1 (INDIRECT_REF, type, obj);
> --- 488,494 ----
> The java object is immediately before the generic exception header. */
> obj = build_exception_object_var ();
> obj = fold_convert (build_pointer_type (type), obj);
> ! obj = fold_build_pointer_plus (obj,
> fold_build1 (NEGATE_EXPR, sizetype,
> TYPE_SIZE_UNIT (TREE_TYPE (obj))));
> obj = build1 (INDIRECT_REF, type, obj);
> Index: trunk/gcc/java/expr.c
> ===================================================================
> *** trunk.orig/gcc/java/expr.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/java/expr.c 2011-07-11 17:13:24.000000000 +0200
> *************** build_java_arrayaccess (tree array, tree
> *** 936,942 ****
> size_exp);
>
> /* Sum the byte offset and the address of the data field. */
> ! node = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (node), node, index);
>
> /* Finally, return
>
> --- 936,942 ----
> size_exp);
>
> /* Sum the byte offset and the address of the data field. */
> ! node = fold_build_pointer_plus (node, index);
>
> /* Finally, return
>
> *************** build_field_ref (tree self_value, tree s
> *** 1743,1754 ****
> 1, otable_index),
> field_offset);
>
> - field_offset = fold (convert (sizetype, field_offset));
> self_value = java_check_reference (self_value, check);
> ! address
> ! = fold_build2 (POINTER_PLUS_EXPR,
> ! TREE_TYPE (self_value),
> ! self_value, field_offset);
> address = fold_convert (build_pointer_type (TREE_TYPE (field_decl)),
> address);
> return fold_build1 (INDIRECT_REF, TREE_TYPE (field_decl), address);
> --- 1743,1750 ----
> 1, otable_index),
> field_offset);
>
> self_value = java_check_reference (self_value, check);
> ! address = fold_build_pointer_plus (self_value, field_offset);
> address = fold_convert (build_pointer_type (TREE_TYPE (field_decl)),
> address);
> return fold_build1 (INDIRECT_REF, TREE_TYPE (field_decl), address);
> *************** build_known_method_ref (tree method, tre
> *** 2255,2262 ****
> method_index++;
> }
> method_index *= int_size_in_bytes (method_type_node);
> ! ref = fold_build2 (POINTER_PLUS_EXPR, method_ptr_type_node,
> ! ref, size_int (method_index));
> ref = build1 (INDIRECT_REF, method_type_node, ref);
> func = build3 (COMPONENT_REF, nativecode_ptr_type_node,
> ref, lookup_field (&method_type_node, ncode_ident),
> --- 2251,2257 ----
> method_index++;
> }
> method_index *= int_size_in_bytes (method_type_node);
> ! ref = fold_build_pointer_plus_hwi (ref, method_index);
> ref = build1 (INDIRECT_REF, method_type_node, ref);
> func = build3 (COMPONENT_REF, nativecode_ptr_type_node,
> ref, lookup_field (&method_type_node, ncode_ident),
> *************** build_invokevirtual (tree dtable, tree m
> *** 2349,2356 ****
> size_int (TARGET_VTABLE_USES_DESCRIPTORS));
> }
>
> ! func = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dtable), dtable,
> ! convert (sizetype, method_index));
>
> if (TARGET_VTABLE_USES_DESCRIPTORS)
> func = build1 (NOP_EXPR, nativecode_ptr_type_node, func);
> --- 2344,2350 ----
> size_int (TARGET_VTABLE_USES_DESCRIPTORS));
> }
>
> ! func = fold_build_pointer_plus (dtable, method_index);
>
> if (TARGET_VTABLE_USES_DESCRIPTORS)
> func = build1 (NOP_EXPR, nativecode_ptr_type_node, func);
> Index: trunk/gcc/objc/objc-next-runtime-abi-02.c
> ===================================================================
> *** trunk.orig/gcc/objc/objc-next-runtime-abi-02.c 2011-07-11 17:12:41.000000000 +0200
> --- trunk/gcc/objc/objc-next-runtime-abi-02.c 2011-07-11 17:13:24.000000000 +0200
> *************** objc_v2_build_ivar_ref (tree datum, tree
> *** 1381,1388 ****
> string_type_node, build_fold_addr_expr (datum));
>
> /* (char*)datum + offset */
> ! expr = fold_build2_loc (input_location,
> ! POINTER_PLUS_EXPR, string_type_node, expr, offset);
>
> /* (ftype*)((char*)datum + offset) */
> expr = build_c_cast (input_location, build_pointer_type (ftype), expr);
> --- 1381,1387 ----
> string_type_node, build_fold_addr_expr (datum));
>
> /* (char*)datum + offset */
> ! expr = fold_build_pointer_plus_loc (input_location, expr, offset);
>
> /* (ftype*)((char*)datum + offset) */
> expr = build_c_cast (input_location, build_pointer_type (ftype), expr);
> *************** objc2_build_ehtype_initializer (tree nam
> *** 3486,3492 ****
> }
> addr = build_fold_addr_expr_with_type (next_v2_ehvtable_decl, ptr_type_node);
> offs = size_int (2 * int_cst_value (TYPE_SIZE_UNIT (ptr_type_node)));
> ! addr = fold_build2 (POINTER_PLUS_EXPR, ptr_type_node, addr, offs);
>
> CONSTRUCTOR_APPEND_ELT (initlist, NULL_TREE, addr);
>
> --- 3485,3491 ----
> }
> addr = build_fold_addr_expr_with_type (next_v2_ehvtable_decl, ptr_type_node);
> offs = size_int (2 * int_cst_value (TYPE_SIZE_UNIT (ptr_type_node)));
> ! addr = fold_build_pointer_plus (addr, offs);
>
> CONSTRUCTOR_APPEND_ELT (initlist, NULL_TREE, addr);
>
> Index: trunk/gcc/tree.h
> ===================================================================
> *** trunk.orig/gcc/tree.h 2011-07-11 17:13:09.000000000 +0200
> --- trunk/gcc/tree.h 2011-07-11 17:14:36.000000000 +0200
> *************** truth_value_p (enum tree_code code)
> *** 5316,5321 ****
> --- 5316,5340 ----
> || code == TRUTH_XOR_EXPR || code == TRUTH_NOT_EXPR);
> }
>
> + /* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF. */
> + static inline tree
> + fold_build_pointer_plus_loc (location_t loc, tree ptr, tree off)
> + {
> + return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
> + ptr, fold_convert_loc (loc, sizetype, off));
> + }
> + #define fold_build_pointer_plus(p,o) \
> + fold_build_pointer_plus_loc (UNKNOWN_LOCATION, p, o)
> +
> + /* Build and fold a POINTER_PLUS_EXPR at LOC offsetting PTR by OFF. */
> + static inline tree
> + fold_build_pointer_plus_hwi_loc (location_t loc, tree ptr, HOST_WIDE_INT off)
> + {
> + return fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (ptr),
> + ptr, size_int (off));
> + }
> + #define fold_build_pointer_plus_hwi(p,o) \
> + fold_build_pointer_plus_hwi_loc (UNKNOWN_LOCATION, p, o)
>
> /* In builtins.c */
> extern tree fold_call_expr (location_t, tree, bool);
>
--
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH][1/N][C][C++][Fortran][Java] Change POINTER_PLUS_EXPR offset type requirements
2011-07-14 11:42 ` [PATCH][1/N][C][C++][Fortran][Java] Change " Richard Guenther
@ 2011-07-14 14:38 ` Richard Henderson
0 siblings, 0 replies; 6+ messages in thread
From: Richard Henderson @ 2011-07-14 14:38 UTC (permalink / raw)
To: Richard Guenther; +Cc: gcc-patches
On 07/14/2011 04:28 AM, Richard Guenther wrote:
> On Tue, 12 Jul 2011, Richard Guenther wrote:
>
>>
>> This patch is step 1, it abstracts away the type of the offset operand
>> when building a POINTER_PLUS_EXPR. It does so by introducing
>> fold_build_pointer_plus_expr{_hwi,_loc} helpers and use them in all
>> places that currently build POINTER_PLUS_EXPRs (including those
>> that do not fold the result). This patch will make steps 2 and more
>> purely middle-end (fingers crossed).
>>
>> Bootstrapped and tested on x86_64-unknown-linux-gnu for all languages.
>>
>> I also built cc1 for all supported targets via contrib/config-list.mk
>> and saw no fails that relate to this patch.
>>
>> Are the frontend parts ok?
>
> Ping. Joseph seems to be on vacation - Richard, can you approve
> the C frontend/family parts?
Yeah, this patch is ok.
r~
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2011-07-14 14:35 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-12 10:52 [PATCH][1/N][C][C++][Fortran][Java] Change POINTER_PLUS_EXPR offset type requirements Richard Guenther
2011-07-12 12:30 ` Tobias Burnus
2011-07-12 13:08 ` Jason Merrill
2011-07-12 15:06 ` [PATCH][1/N][C][C++][Fortran]Change " Tom Tromey
2011-07-14 11:42 ` [PATCH][1/N][C][C++][Fortran][Java] Change " Richard Guenther
2011-07-14 14:38 ` Richard Henderson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).