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]

[patch] Fix PR tree-optimization/46213


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.

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]