diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 933ce5f978ce12bbff52d5adc40214186beb039b..4b96a2f00dbca24024d112a5fe286b1857952be0 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 d5cb9eb7d3e84c9f2e3e7fa9e49a9afc28d34d79..ae7687def7058156059400c170c377c3ffbe3f4d 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 0000000000000000000000000000000000000000..166839494658e67da9fa926d303b8bf1ae2164dc --- /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 0000000000000000000000000000000000000000..ab0a165ea904b1b50b658891c229e784d8fb67a0 --- /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 0000000000000000000000000000000000000000..0eaefa1b0f32c8904379cb9ae5bd1bb8fee239da --- /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 ddaee818310e0ecfaacfbe45e9c5ebfcd437afa1..fb4a5bf5dd768d25c673d7050a4288334ee03c39 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;