This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Fix PR tree-optimization/40254 - bug in data-refs analysis for basic blocks


On Thu, May 28, 2009 at 9:26 AM, Ira Rosen <IRAR@il.ibm.com> wrote:
>
> Hi,
>
> This patch fixes a bug in data-refs analysis for basic blocks: the
> data-ref's offset should be taken into account.
>
> Bootstrapped with vectorization enabled on powerpc64-suse-linux, tested on
> x86_64-suse-linux.
>
> O.K. for mainline?

Ok.

Thanks,
Richard.

> Thanks,
> Ira
>
>
> ChangeLog:
>
> ? ? ?PR tree-optimization/40254
> ? ? ?* tree-data-ref.c (dr_analyze_innermost): Take POFFSET into account
> ? ? ?in analysis of basic blocks.
>
> testsuite/ChangeLog:
>
> ? ? ?PR tree-optimization/40254
> ? ? ?* gcc.dg/vect/pr40254.c: New test.
>
>
> Index: tree-data-ref.c
> ===================================================================
> --- tree-data-ref.c ? ? (revision 147938)
> +++ tree-data-ref.c ? ? (working copy)
> @@ -718,17 +718,26 @@ dr_analyze_innermost (struct data_refere
> ? ? ? base_iv.no_overflow = true;
> ? ? }
>
> - ?if (!poffset || !in_loop)
> + ?if (!poffset)
> ? ? {
> ? ? ? offset_iv.base = ssize_int (0);
> ? ? ? offset_iv.step = ssize_int (0);
> ? ? }
> - ?else if (!simple_iv (loop, loop_containing_stmt (stmt),
> - ? ? ? ? ? ? ? ? ? ? ?poffset, &offset_iv, false))
> + ?else
> ? ? {
> - ? ? ?if (dump_file && (dump_flags & TDF_DETAILS))
> - ? ? ? fprintf (dump_file, "failed: evolution of offset is not
> affine.\n");
> - ? ? ?return false;
> + ? ? ?if (!in_loop)
> + ? ? ? ?{
> + ? ? ? ? ?offset_iv.base = poffset;
> + ? ? ? ? ?offset_iv.step = ssize_int (0);
> + ? ? ? ?}
> + ? ? ?else if (!simple_iv (loop, loop_containing_stmt (stmt),
> + ? ? ? ? ? ? ? ? ? ? ? ? ? poffset, &offset_iv, false))
> + ? ? ? ?{
> + ? ? ? ? ?if (dump_file && (dump_flags & TDF_DETAILS))
> + ? ? ? ? ? ?fprintf (dump_file, "failed: evolution of offset is not"
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?" affine.\n");
> + ? ? ? ? ?return false;
> + ? ? ? ?}
> ? ? }
>
> ? init = ssize_int (pbitpos / BITS_PER_UNIT);
> Index: testsuite/gcc.dg/vect/pr40254.c
> ===================================================================
> --- testsuite/gcc.dg/vect/pr40254.c ? ? (revision 0)
> +++ testsuite/gcc.dg/vect/pr40254.c ? ? (revision 0)
> @@ -0,0 +1,39 @@
> +#include <stdlib.h>
> +#include <stdarg.h>
> +#include "tree-vect.h"
> +
> +struct s
> +{
> + ?int *x;
> + ?int x1;
> + ?int x2;
> + ?int x3;
> + ?int *y;
> +};
> +
> +struct s arr[64] __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__)));
> +
> +__attribute__ ((noinline)) void
> +foo (int i, int *in_x, int *in_y)
> +{
> + ?arr[i].x = in_x;
> + ?arr[i].y = in_y;
> +}
> +
> +int
> +main (void)
> +{
> + ?int a, b;
> +
> + ?check_vect ();
> +
> + ?foo (5, &a, &b);
> +
> + ?if (arr[5].x != &a || arr[5].y != &b)
> + ? ?abort ();
> +
> + ?return 0;
> +}
> +
> +/* { dg-final { cleanup-tree-dump "vect" } } */
> +
>
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]