From 59a05b0ca26ba2af84ccafe3422f35c0460dff1c Mon Sep 17 00:00:00 2001
From: Eric Botcazou <ebotcazou@adacore.com>
Date: Wed, 21 Oct 2009 10:08:39 +0000
Subject: [PATCH] tree-vect-stmts.c (exist_non_indexing_operands_for_use_p):
 Tweak order of checks.

	* tree-vect-stmts.c (exist_non_indexing_operands_for_use_p): Tweak
	order of checks.

From-SVN: r153051
---
 gcc/ChangeLog                                    |  5 +++++
 gcc/testsuite/ChangeLog                          |  5 +++++
 gcc/testsuite/gnat.dg/loop_optimization7.adb     | 16 ++++++++++++++++
 gcc/testsuite/gnat.dg/loop_optimization7.ads     |  9 +++++++++
 gcc/testsuite/gnat.dg/loop_optimization7_pkg.ads | 10 ++++++++++
 gcc/tree-vect-stmts.c                            | 10 ++++------
 6 files changed, 49 insertions(+), 6 deletions(-)
 create mode 100644 gcc/testsuite/gnat.dg/loop_optimization7.adb
 create mode 100644 gcc/testsuite/gnat.dg/loop_optimization7.ads
 create mode 100644 gcc/testsuite/gnat.dg/loop_optimization7_pkg.ads

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 933ce5f978ce..4b96a2f00dbc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2009-10-21  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* tree-vect-stmts.c (exist_non_indexing_operands_for_use_p): Tweak
+	order of checks.
+
 2009-10-20  Richard Henderson  <rth@redhat.com>
 
 	* tree-eh.c (lower_try_finally_copy): Do lower_eh_constructs_1
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d5cb9eb7d3e8..ae7687def705 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2009-10-21  Eric Botcazou  <ebotcazou@adacore.com>
+
+	* gnat.dg/loop_optimization7.ad[sb]: New test.
+	* gnat.dg/loop_optimization7_pkg.ads: New helper.
+
 2009-10-21  Janus Weil  <janus@gcc.gnu.org>
 
 	PR fortran/41706
diff --git a/gcc/testsuite/gnat.dg/loop_optimization7.adb b/gcc/testsuite/gnat.dg/loop_optimization7.adb
new file mode 100644
index 000000000000..166839494658
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/loop_optimization7.adb
@@ -0,0 +1,16 @@
+-- { dg-do compile }
+-- { dg-options "-O3" }
+-- { dg-options "-O3 -msse" { target i?86-*-* x86_64-*-* } }
+
+package body Loop_Optimization7 is
+
+  function Conv (A : Arr) return Arr is
+    Result : Arr;
+  begin
+    for I in A'Range loop
+      Result (I) := Conv (A (I));
+    end loop;
+    return Result;
+  end;
+
+end Loop_Optimization7;
diff --git a/gcc/testsuite/gnat.dg/loop_optimization7.ads b/gcc/testsuite/gnat.dg/loop_optimization7.ads
new file mode 100644
index 000000000000..ab0a165ea904
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/loop_optimization7.ads
@@ -0,0 +1,9 @@
+with Loop_Optimization7_Pkg; use Loop_Optimization7_Pkg;
+
+package Loop_Optimization7  is
+
+   type Arr is array (1..8) of Rec;
+
+   function Conv (A : Arr) return Arr;
+
+end Loop_Optimization7;
diff --git a/gcc/testsuite/gnat.dg/loop_optimization7_pkg.ads b/gcc/testsuite/gnat.dg/loop_optimization7_pkg.ads
new file mode 100644
index 000000000000..0eaefa1b0f32
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/loop_optimization7_pkg.ads
@@ -0,0 +1,10 @@
+package Loop_Optimization7_Pkg is
+  pragma Pure;
+
+  type Rec is record
+    F : Float;
+  end record;
+
+  function Conv (Trig : Rec) return Rec;
+
+end Loop_Optimization7_Pkg;
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index ddaee818310e..fb4a5bf5dd76 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -172,13 +172,13 @@ exist_non_indexing_operands_for_use_p (tree use, gimple stmt)
 {
   tree operand;
   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);
- 
+
   /* USE corresponds to some operand in STMT. If there is no data
      reference in STMT, then any operand that corresponds to USE
      is not indexing an array.  */
   if (!STMT_VINFO_DATA_REF (stmt_info))
     return true;
- 
+
   /* STMT has a data_ref. FORNOW this means that its of one of
      the following forms:
      -1- ARRAY_REF = var
@@ -191,14 +191,12 @@ exist_non_indexing_operands_for_use_p (tree use, gimple stmt)
 
      Therefore, all we need to check is if STMT falls into the
      first case, and whether var corresponds to USE.  */
- 
-  if (TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME)
-    return false;
 
   if (!gimple_assign_copy_p (stmt))
     return false;
+  if (TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME)
+    return false;
   operand = gimple_assign_rhs1 (stmt);
-
   if (TREE_CODE (operand) != SSA_NAME)
     return false;
 
-- 
GitLab