[RFC] [Patch] Relax tree-if-conv.c trap assumptions.

Kumar, Venkataramanan Venkataramanan.Kumar@amd.com
Fri Oct 30 10:24:00 GMT 2015


Hi Andrew, 

> -----Original Message-----
> From: Andrew Pinski [mailto:pinskia@gmail.com]
> Sent: Friday, October 30, 2015 3:38 PM
> To: Kumar, Venkataramanan
> Cc: Richard Beiner (richard.guenther@gmail.com); gcc-patches@gcc.gnu.org
> Subject: Re: [RFC] [Patch] Relax tree-if-conv.c trap assumptions.
> 
> On Fri, Oct 30, 2015 at 6:06 PM, Kumar, Venkataramanan
> <Venkataramanan.Kumar@amd.com> wrote:
> > Hi Richard,
> >
> > I am trying to "if covert the store" in the below test case and later
> > help it to get vectorized under -Ofast -ftree-loop-if-convert-stores
> > -fno-common
> >
> > #define LEN 4096
> >  __attribute__((aligned(32))) float array[LEN]; void test() { for (int i = 0; i <
> LEN; i++) {
> >    if (array[i] > (float)0.)
> >                 array[i] =3 ;
> >
> > }
> > }
> >
> > Currently in GCC 5.2  does not vectorize it.
> > https://goo.gl/9nS6Pd
> >
> > However ICC seems to vectorize it
> > https://goo.gl/y1yGHx
> >
> > As discussed with you  earlier, to allow "if convert store"  I am checking the
> following:
> >
> > (1) We already  read the reference "array[i]"  unconditionally once .
> > (2) I am now checking  if we are conditionally writing to memory which is
> defined as read and write and is bound to the definition we are seeing.
> 
> 
> I don't think this is thread safe ....
> 

I thought under -ftree-loop-if-convert-stores it is ok to do this transformation.

Regards,
Venkat.

> Thanks,
> Andrew
> 
> >
> > With this change, I get able to if convert and the vectorize the case also.
> >
> > /build/gcc/xgcc -B ./build/gcc/  ifconv.c -Ofast -fopt-info-vec  -S
> > -ftree-loop-if-convert-stores -fno-common
> > ifconv.c:2:63: note: loop vectorized
> >
> > Patch
> > ------
> > diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index
> > f201ab5..6475cc0 100644
> > --- a/gcc/tree-if-conv.c
> > +++ b/gcc/tree-if-conv.c
> > @@ -727,6 +727,34 @@ write_memrefs_written_at_least_once (gimple
> *stmt,
> >    return true;
> > }
> >
> > +static bool
> > +write_memrefs_safe_to_access_unconditionally (gimple *stmt,
> > +
> > +vec<data_reference_p> drs) {
> > +  int i;
> > +  data_reference_p a;
> > +  bool found = false;
> > +
> > +  for (i = 0; drs.iterate (i, &a); i++)
> > +    {
> > +      if (DR_STMT (a) == stmt
> > +               && DR_IS_WRITE (a)
> > +               && (DR_WRITTEN_AT_LEAST_ONCE (a) == 0)
> > +               && (DR_RW_UNCONDITIONALLY (a) == 1))
> > +             {
> > +               tree base = get_base_address (DR_REF (a));
> > +               found = false;
> > +               if (DECL_P (base)
> > +                   && decl_binds_to_current_def_p (base)
> > +                   && !TREE_READONLY (base))
> > +                 {
> > +                   found = true;
> > +                 }
> > +             }
> > +    }
> > +  return found;
> > +}
> > +
> > /* Return true when the memory references of STMT won't trap in the
> >     if-converted code.  There are two things that we have to check for:
> >
> > @@ -748,8 +776,20 @@ write_memrefs_written_at_least_once (gimple
> > *stmt, static bool ifcvt_memrefs_wont_trap (gimple *stmt,
> > vec<data_reference_p> refs) {
> > -  return write_memrefs_written_at_least_once (stmt, refs)
> > -    && memrefs_read_or_written_unconditionally (stmt, refs);
> > +  bool memrefs_written_once, memrefs_read_written_unconditionally;
> > +  bool memrefs_safe_to_access;
> > +
> > +  memrefs_written_once
> > +             = write_memrefs_written_at_least_once (stmt, refs);
> > +
> > +  memrefs_read_written_unconditionally
> > +             =  memrefs_read_or_written_unconditionally (stmt, refs);
> > +
> > +  memrefs_safe_to_access
> > +             = write_memrefs_safe_to_access_unconditionally (stmt,
> > + refs);
> > +
> > +  return ((memrefs_written_once || memrefs_safe_to_access)
> > +                && memrefs_read_written_unconditionally);
> > }
> >
> >  /* Wrapper around gimple_could_trap_p refined for the needs of the
> >
> >
> > do I need this function write_memrefs_written_at_least_once anymore?
> > Please suggest if there a better way to do this.
> >
> > Bootstrapped and regression  tested on x86_64.
> > I am not  adding change log and comments now, as I  wanted to check
> approach first.
> >
> > Regards,
> > Venkat.
> >
> >


More information about the Gcc-patches mailing list