[Bug tree-optimization/51254] Missed Optimization: IVOPTS don't handle unaligned memory access.

duyuehai at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Dec 14 03:14:00 GMT 2011


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51254

--- Comment #5 from Yuehai Du <duyuehai at gmail dot com> 2011-12-14 02:29:07 UTC ---
(In reply to comment #4)
> On Tue, 13 Dec 2011, duyuehai at gmail dot com wrote:
> 
> > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51254
> > 
> > Yuehai Du <duyuehai at gmail dot com> changed:
> > 
> >            What    |Removed                     |Added
> > ----------------------------------------------------------------------------
> >                  CC|                            |duyuehai at gmail dot com,
> >                    |                            |rguenth at gcc dot gnu.org
> > 
> > --- Comment #2 from Yuehai Du <duyuehai at gmail dot com> 2011-12-13 04:15:12 UTC ---
> > Hi Richard
> >   would it be ok if i submit a patch like this to fix this bug:
> > 
> > Index: gcc/tree-ssa-loop-ivopts.c
> > ===================================================================
> > --- gcc/tree-ssa-loop-ivopts.c    (版本 182270)
> > +++ gcc/tree-ssa-loop-ivopts.c    (工作副本)
> > @@ -102,6 +102,7 @@ along with GCC; see the file COPYING3.  If not see
> >     cost of different addressing modes.  This should be moved to a TBD
> >     interface between the GIMPLE and RTL worlds.  */
> >  #include "expr.h"
> > +#include "optabs.h"
> > 
> >  /* The infinite cost.  */
> >  #define INFTY 10000000
> > @@ -1771,6 +1772,7 @@ find_interesting_uses_address (struct ivopts_data
> >      }
> >    else
> >      {
> > +      enum machine_mode mem_mode;
> >        ifs_ivopts_data.ivopts_data = data;
> >        ifs_ivopts_data.stmt = stmt;
> >        ifs_ivopts_data.step = size_zero_node;
> > @@ -1786,7 +1788,9 @@ find_interesting_uses_address (struct ivopts_data
> > 
> >        /* Moreover, on strict alignment platforms, check that it is
> >       sufficiently aligned.  */
> > -      if (STRICT_ALIGNMENT && may_be_unaligned_p (base, step))
> > +      mem_mode = TYPE_MODE (TREE_TYPE (*op_p));
> > +      if (STRICT_ALIGNMENT && may_be_unaligned_p (base, step)
> > +          && optab_handler (movmisalign_optab, mem_mode) == CODE_FOR_nothing)
> >      goto fail;
> > 
> >        base = build_fold_addr_expr (base);
> 
> This won't fix it - the movmisalign optab will not be used at expansion
> time as IVOPTs does not properly transfer the misalignment to the
> access type.

sorry, i made a mistake here. 
My initial target is to make IVOPTS work on vector type misaligned access. And
i see the misalignment information for unaligned vector type access is stored
in type and pointer.
tree-ssa-loop-ivopts.c:
            else if (DR_MISALIGNMENT (first_dr) == -1)
              {
            TREE_TYPE (data_ref)
              = build_aligned_type (TREE_TYPE (data_ref),
                        TYPE_ALIGN (elem_type));
            pi->align = TYPE_ALIGN_UNIT (elem_type);
            pi->misalign = 0;
              }
            else
              {
            TREE_TYPE (data_ref)
              = build_aligned_type (TREE_TYPE (data_ref),
                        TYPE_ALIGN (elem_type));
            pi->misalign = DR_MISALIGNMENT (first_dr);
              }

and IVOPTS will create same type mem_ref when it rewrite use for address. 

so do this work?
      align = TYPE_ALIGN(TREE_TYPE(*op_p));
      if (STRICT_ALIGNMENT && may_be_unaligned_p (base, step)
          && !(mem_mode != BLK_MODE 
              && align < GET_MODE_ALIGNMENT (mem_mode)
              && optab_handler (movmisalign_optab, mem_mode) !=
CODE_FOR_nothing
              )

)
    goto fail;

--
Yuehai Du


> 
> Richard.



More information about the Gcc-bugs mailing list