This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix PR79460
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Tue, 14 Feb 2017 16:07:10 +0100 (CET)
- Subject: Re: [PATCH] Fix PR79460
- Authentication-results: sourceware.org; auth=none
- References: <alpine.LSU.2.20.1702141547390.6076@zhemvz.fhfr.qr> <20170214145530.GV1849@tucnak>
On Tue, 14 Feb 2017, Jakub Jelinek wrote:
> On Tue, Feb 14, 2017 at 03:48:38PM +0100, Richard Biener wrote:
> > 2017-02-14 Richard Biener <rguenther@suse.de>
> >
> > PR tree-optimization/79460
> > * tree-scalar-evolution.c (final_value_replacement_loop): Also
> > allow final value replacement of floating point expressions.
> >
> > * gcc.dg/tree-ssa/sccp-3.c: New testcase.
> >
> > Index: gcc/tree-scalar-evolution.c
> > ===================================================================
> > --- gcc/tree-scalar-evolution.c (revision 245417)
> > +++ gcc/tree-scalar-evolution.c (working copy)
> > @@ -3718,8 +3718,10 @@ final_value_replacement_loop (struct loo
> > continue;
> > }
> >
> > - if (!POINTER_TYPE_P (TREE_TYPE (def))
> > - && !INTEGRAL_TYPE_P (TREE_TYPE (def)))
> > + if (! (POINTER_TYPE_P (TREE_TYPE (def))
> > + || INTEGRAL_TYPE_P (TREE_TYPE (def))
> > + || (FLOAT_TYPE_P (TREE_TYPE (def))
> > + && flag_unsafe_math_optimizations)))
>
> I think Segher mentioned in the PR that this should be better
> flag_associative_math.
We don't associate anything though.
Technically we could, for constant niter, fully simulate
the rounding effects (flag_rounding_math would need checking then).
Given that reassoc transforms x + x + x + x -> 4 * x with just
-funsafe-math-optimizations using that flag is at least consistent.
I think flag_associative_math wasn't meant to change the number of
rounding steps. flag_fp_contract_mode controls this IMHO, but we
have the reassoc precedent...
> Also, FLOAT_TYPE_P stands not just for
> SCALAR_FLOAT_TYPE_P, but for COMPLEX_TYPE and VECTOR_TYPE thereof as well.
> Does SCEV handle complex and vector types well (it would be really nice
> if it could of course, but then we should use ANY_INTEGRAL_TYPE_P as
> well to also handle complex and vector integers)?
SCEV should gate out types it doesn't handle itself -- it already
gates out VECTOR_TYPE:
static tree
analyze_scalar_evolution_1 (struct loop *loop, tree var, tree res)
{
tree type = TREE_TYPE (var);
gimple *def;
basic_block bb;
struct loop *def_loop;
if (loop == NULL || TREE_CODE (type) == VECTOR_TYPE)
return chrec_dont_know;
and given that it special-cases only REAL_CST, FIXED_CST and INTEGER_CST
in get_scalar_evolution I doubt it handles anything else reasonably.
But as I said, it's SCEVs job to reject them, not users of the API.
I see no reason to not allow vectors for example (it's just the
code might be not ready and uses wrong tree building interfaces).
Richard.
> Jakub
>
>
--
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)