This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug target/53090] suboptimal ivopt
- From: "rguenth at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 02 Apr 2014 11:34:39 +0000
- Subject: [Bug target/53090] suboptimal ivopt
- Auto-submitted: auto-generated
- References: <bug-53090-4 at http dot gcc dot gnu dot org/bugzilla/>
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53090
--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
Sth like
Index: gcc/c-family/c-common.c
===================================================================
--- gcc/c-family/c-common.c (revision 209018)
+++ gcc/c-family/c-common.c (working copy)
@@ -4415,19 +4415,21 @@ pointer_int_sum (location_t loc, enum tr
/* Convert the integer argument to a type the same size as sizetype
so the multiply won't overflow spuriously. */
+ enum tree_code code = MULT_EXPR;
if (TYPE_PRECISION (TREE_TYPE (intop)) != TYPE_PRECISION (sizetype)
|| TYPE_UNSIGNED (TREE_TYPE (intop)) != TYPE_UNSIGNED (sizetype))
- intop = convert (c_common_type_for_size (TYPE_PRECISION (sizetype),
- TYPE_UNSIGNED (sizetype)), intop);
+ code = WIDEN_MULT_EXPR;
/* Replace the integer argument with a suitable product by the object size.
Do this multiplication as signed, then convert to the appropriate type
for the pointer operation and disregard an overflow that occurred only
because of the sign-extension change in the latter conversion. */
{
- tree t = build_binary_op (loc,
- MULT_EXPR, intop,
- convert (TREE_TYPE (intop), size_exp), 1);
+ tree t = fold_build2_loc (loc, code,
+ c_common_type_for_size (TYPE_PRECISION
(sizetype),
+ TYPE_UNSIGNED
(sizetype)),
+ intop,
+ convert (TREE_TYPE (intop), size_exp));
intop = convert (sizetype, t);
if (TREE_OVERFLOW_P (intop) && !TREE_OVERFLOW (t))
intop = build_int_cst_wide (TREE_TYPE (intop), TREE_INT_CST_LOW (intop),
but then you notice that for example SCEV doesn't handle WIDEN_MULT_EXPR.