Message ID | 000701d0a9af$833a6e80$89af4b80$@arm.com |
---|---|
State | New |
Headers | show |
On Thu, Jun 18, 2015 at 12:14 PM, Bin Cheng <bin.cheng@arm.com> wrote: > And the patch... > > Thanks, > bin > >> -----Original Message----- >> From: gcc-patches-owner@gcc.gnu.org [mailto:gcc-patches- >> owner@gcc.gnu.org] On Behalf Of Bin Cheng >> Sent: Thursday, June 18, 2015 6:13 PM >> To: gcc-patches@gcc.gnu.org >> Subject: [PATCH PR66449]Fix ICE by using POINTER_PLUS_EXPR for pointers. >> >> Hi, >> This patch fixes ICE in PR66449 by using POINTER_PLUS_EXPR for pointers. >> Bootstrap and test on x86_64. Is it OK trunk? Ok. Thanks, Richard. >> Thanks, >> bin >> >> 2015-06-18 Bin Cheng <bin.cheng@arm.com> >> >> PR tree-optimization/66449 >> * tree-ssa-loop-niter.c (loop_exits_before_overflow): Use >> POINTER_PLUS_EXPR for pointers. >> >> gcc/testsuite/ChangeLog >> 2015-06-18 Bin Cheng <bin.cheng@arm.com> >> >> PR tree-optimization/66449 >> * gcc.dg/vect/pr66449.c: New. >> >
Index: gcc/testsuite/gcc.dg/tree-ssa/pr66449.c =================================================================== --- gcc/testsuite/gcc.dg/tree-ssa/pr66449.c (revision 0) +++ gcc/testsuite/gcc.dg/tree-ssa/pr66449.c (revision 0) @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +void *fn1(void *p1, void *p2, long p3) +{ + long a = (long)p1, b = (long)p2, c = p3; + + while (c) + { + int d = ((int *)b)[0]; + + c--; + ((char *)a)[0] = d; + a++; + } + return 0; +} + Index: gcc/tree-ssa-loop-niter.c =================================================================== --- gcc/tree-ssa-loop-niter.c (revision 224020) +++ gcc/tree-ssa-loop-niter.c (working copy) @@ -3902,7 +3902,12 @@ loop_exits_before_overflow (tree base, tree step, by proving the reverse conditions are false using loop's initial condition. */ - stepped = fold_build2 (PLUS_EXPR, TREE_TYPE (base), base, step); + if (POINTER_TYPE_P (TREE_TYPE (base))) + code = POINTER_PLUS_EXPR; + else + code = PLUS_EXPR; + + stepped = fold_build2 (code, TREE_TYPE (base), base, step); if (operand_equal_p (stepped, civ->base, 0)) { if (tree_int_cst_sign_bit (step))