aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/doc/invoke.texi3
-rw-r--r--gcc/params.opt4
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr84201.c22
-rw-r--r--gcc/tree-vect-loop.cc8
4 files changed, 37 insertions, 0 deletions
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index b01ffab..a0fa5e1 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -14989,6 +14989,9 @@ in an inner loop relative to the loop being vectorized. The factor applied
is the maximum of the estimated number of iterations of the inner loop and
this parameter. The default value of this parameter is 50.
+@item vect-induction-float
+Enable loop vectorization of floating point inductions.
+
@item avoid-fma-max-bits
Maximum number of bits for which we avoid creating FMAs.
diff --git a/gcc/params.opt b/gcc/params.opt
index f76f783..9561aa6 100644
--- a/gcc/params.opt
+++ b/gcc/params.opt
@@ -1176,6 +1176,10 @@ Controls how loop vectorizer uses partial vectors. 0 means never, 1 means only
Common Joined UInteger Var(param_vect_inner_loop_cost_factor) Init(50) IntegerRange(1, 10000) Param Optimization
The maximum factor which the loop vectorizer applies to the cost of statements in an inner loop relative to the loop being vectorized.
+-param=vect-induction-float=
+Common Joined UInteger Var(param_vect_induction_float) Init(1) IntegerRage(0, 1) Param Optimization
+Enable loop vectorization of floating point inductions.
+
-param=vrp1-mode=
Common Joined Var(param_vrp1_mode) Enum(vrp_mode) Init(VRP_MODE_VRP) Param Optimization
--param=vrp1-mode=[vrp|ranger] Specifies the mode VRP1 should operate in.
diff --git a/gcc/testsuite/gcc.dg/vect/pr84201.c b/gcc/testsuite/gcc.dg/vect/pr84201.c
new file mode 100644
index 0000000..1cc6d1f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr84201.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-Ofast --param vect-induction-float=0" } */
+
+void foo (float *a, float f, float s, int n)
+{
+ for (int i = 0; i < n; ++i)
+ {
+ a[i] = f;
+ f += s;
+ }
+}
+
+void bar (double *a, double f, double s, int n)
+{
+ for (int i = 0; i < n; ++i)
+ {
+ a[i] = f;
+ f += s;
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "vectorized 0 loops" 2 "vect" } } */
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 1f30fc8..7fcec12 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -8175,6 +8175,14 @@ vectorizable_induction (loop_vec_info loop_vinfo,
return false;
}
+ if (FLOAT_TYPE_P (vectype) && !param_vect_induction_float)
+ {
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+ "floating point induction vectorization disabled\n");
+ return false;
+ }
+
step_expr = STMT_VINFO_LOOP_PHI_EVOLUTION_PART (stmt_info);
gcc_assert (step_expr != NULL_TREE);
tree step_vectype = get_same_sized_vectype (TREE_TYPE (step_expr), vectype);