aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vect-loop.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2018-01-19 11:57:34 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-01-19 11:57:34 +0000
commit271134dd4894140542e38a4dcd8b4a07093d823a (patch)
treec5cf9e658d84fb886f540d045d804e2242056a67 /gcc/tree-vect-loop.c
parent4b04107b254614bd041e61aacb514d19bccba212 (diff)
downloadgcc-271134dd4894140542e38a4dcd8b4a07093d823a.zip
gcc-271134dd4894140542e38a4dcd8b4a07093d823a.tar.gz
gcc-271134dd4894140542e38a4dcd8b4a07093d823a.tar.bz2
Avoid ICE for nested inductions (PR 83914)
This testcase ICEd because we converted the initial value of an induction to the vector element type even for nested inductions. This isn't necessary because the initial expression is vectorised normally, and it meant that init_expr was no longer the original statement operand by the time we called vect_get_vec_def_for_operand. Also, adding the conversion code here made the existing SLP conversion redundant. 2018-01-19 Richard Sandiford <richard.sandiford@linaro.org> gcc/ PR tree-optimization/83914 * tree-vect-loop.c (vectorizable_induction): Don't convert init_expr or apply the peeling adjustment for inductions that are nested within the vectorized loop. gcc/testsuite/ PR tree-optimization/83914 * gcc.dg/vect/pr83914.c: New test. From-SVN: r256884
Diffstat (limited to 'gcc/tree-vect-loop.c')
-rw-r--r--gcc/tree-vect-loop.c50
1 files changed, 23 insertions, 27 deletions
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 79b8186..8b2ecf8 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -7678,28 +7678,33 @@ vectorizable_induction (gimple *phi,
init_expr = PHI_ARG_DEF_FROM_EDGE (phi,
loop_preheader_edge (iv_loop));
- /* Convert the initial value and step to the desired type. */
stmts = NULL;
- init_expr = gimple_convert (&stmts, TREE_TYPE (vectype), init_expr);
- step_expr = gimple_convert (&stmts, TREE_TYPE (vectype), step_expr);
-
- /* If we are using the loop mask to "peel" for alignment then we need
- to adjust the start value here. */
- tree skip_niters = LOOP_VINFO_MASK_SKIP_NITERS (loop_vinfo);
- if (skip_niters != NULL_TREE)
+ if (!nested_in_vect_loop)
{
- if (FLOAT_TYPE_P (vectype))
- skip_niters = gimple_build (&stmts, FLOAT_EXPR, TREE_TYPE (vectype),
- skip_niters);
- else
- skip_niters = gimple_convert (&stmts, TREE_TYPE (vectype),
- skip_niters);
- tree skip_step = gimple_build (&stmts, MULT_EXPR, TREE_TYPE (vectype),
- skip_niters, step_expr);
- init_expr = gimple_build (&stmts, MINUS_EXPR, TREE_TYPE (vectype),
- init_expr, skip_step);
+ /* Convert the initial value to the desired type. */
+ tree new_type = TREE_TYPE (vectype);
+ init_expr = gimple_convert (&stmts, new_type, init_expr);
+
+ /* If we are using the loop mask to "peel" for alignment then we need
+ to adjust the start value here. */
+ tree skip_niters = LOOP_VINFO_MASK_SKIP_NITERS (loop_vinfo);
+ if (skip_niters != NULL_TREE)
+ {
+ if (FLOAT_TYPE_P (vectype))
+ skip_niters = gimple_build (&stmts, FLOAT_EXPR, new_type,
+ skip_niters);
+ else
+ skip_niters = gimple_convert (&stmts, new_type, skip_niters);
+ tree skip_step = gimple_build (&stmts, MULT_EXPR, new_type,
+ skip_niters, step_expr);
+ init_expr = gimple_build (&stmts, MINUS_EXPR, new_type,
+ init_expr, skip_step);
+ }
}
+ /* Convert the step to the desired type. */
+ step_expr = gimple_convert (&stmts, TREE_TYPE (vectype), step_expr);
+
if (stmts)
{
new_bb = gsi_insert_seq_on_edge_immediate (pe, stmts);
@@ -7718,15 +7723,6 @@ vectorizable_induction (gimple *phi,
/* Enforced above. */
unsigned int const_nunits = nunits.to_constant ();
- /* Convert the init to the desired type. */
- stmts = NULL;
- init_expr = gimple_convert (&stmts, TREE_TYPE (vectype), init_expr);
- if (stmts)
- {
- new_bb = gsi_insert_seq_on_edge_immediate (pe, stmts);
- gcc_assert (!new_bb);
- }
-
/* Generate [VF*S, VF*S, ... ]. */
if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (step_expr)))
{