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/46213


On Thu, Nov 4, 2010 at 12:51 PM, Ira Rosen <IRAR@il.ibm.com> wrote:
>
> Hi,
>
> MINUS_EXPR in reduction is supposed to be supported for computations of the
> form: res = res - a[i], and not for res = a[i] - res, but this is not
> checked. The attached patch adds such check.

We can simply support this by treating is as

  tmp = -a[i];
  res = res + tmp;

Richard.

> Bootstrapped on powerpc64-suse-linux and tested on x86_64-suse-linux.
> Committed.
>
> Ira
>
>
> ChangeLog:
>
> ? ? ? ?PR tree-optimization/46213
> ? ? ? ?* tree-vect-loop.c (vect_is_simple_reduction_1): Handle
> ? ? ? ?MINUS_EXPR only if the first operand is reduction operand.
>
> testsuite/ChangeLog:
>
> ? ? ? ?PR tree-optimization/46213
> ? ? ? ?* gfortran.dg/vect/pr46213.f90: New.
>
>
> Index: testsuite/gfortran.dg/vect/pr46213.f90
> ===================================================================
> --- testsuite/gfortran.dg/vect/pr46213.f90 ? ? ?(revision 0)
> +++ testsuite/gfortran.dg/vect/pr46213.f90 ? ? ?(revision 0)
> @@ -0,0 +1,25 @@
> +! { dg-do compile }
> +! { dg-options "-O -fno-tree-loop-ivcanon -ftree-vectorize -fno-tree-ccp
> -fno-tree-ch -finline-small-functions" }
> +
> +module foo
> + ?INTEGER, PARAMETER :: ONE = 1
> +end module foo
> +program test
> + ?use foo
> + ?integer :: a(ONE), b(ONE), c(ONE), d(ONE)
> + ?interface
> + ? ?function h_ext()
> + ? ?end function h_ext
> + ?end interface
> + ?c = j()
> + ?if (any (c .ne. check)) call myabort (7)
> +contains
> + ?function j()
> + ? ? integer :: j(ONE), cc(ONE)
> + ? ? j = cc - j
> + ?end function j
> + ?function get_d()
> + ?end function get_d
> +end program test
> +
> +! { dg-final { cleanup-tree-dump "vect" } }
> Index: tree-vect-loop.c
> ===================================================================
> --- tree-vect-loop.c ? ?(revision 166172)
> +++ tree-vect-loop.c ? ?(working copy)
> @@ -1800,7 +1800,11 @@ vect_is_simple_reduction_1 (loop_vec_inf
> ? ? ?simply rewriting this into "res += -x[i]". ?Avoid changing
> ? ? ?gimple instruction for the first simple tests and only do this
> ? ? ?if we're allowed to change code at all. ?*/
> - ?if (code == MINUS_EXPR && modify)
> + ?if (code == MINUS_EXPR
> + ? ? ?&& modify
> + ? ? ?&& (op1 = gimple_assign_rhs1 (def_stmt))
> + ? ? ?&& TREE_CODE (op1) == SSA_NAME
> + ? ? ?&& SSA_NAME_DEF_STMT (op1) == phi)
> ? ? code = PLUS_EXPR;
>
> ? if (check_reduction
>
>


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