aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2018-01-03 21:46:45 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-01-03 21:46:45 +0000
commite251d3ec013bc46d58470988fc45566051a9030b (patch)
tree590f6ba979027fdb7f511fcb2b1c482643337955 /gcc
parentb194a722446f51ffa11ea49affe6893a6361cfac (diff)
downloadgcc-e251d3ec013bc46d58470988fc45566051a9030b.zip
gcc-e251d3ec013bc46d58470988fc45566051a9030b.tar.gz
gcc-e251d3ec013bc46d58470988fc45566051a9030b.tar.bz2
Move code that stubs out IFN_MASK_LOADs
vectorizable_mask_load_store replaces scalar IFN_MASK_LOAD calls with dummy assignments, so that they never survive vectorisation. This patch moves the code to vect_transform_loop instead, so that we only change the scalar statements once all of them have been vectorised. This makes it easier to handle other types of functions that need stubbing out, and also makes it easier to handle groups and patterns. 2018-01-03 Richard Sandiford <richard.sandiford@linaro.org> gcc/ * tree-vect-loop.c (vect_transform_loop): Stub out scalar IFN_MASK_LOAD calls here rather than... * tree-vect-stmts.c (vectorizable_mask_load_store): ...here. From-SVN: r256210
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/tree-vect-loop.c19
-rw-r--r--gcc/tree-vect-stmts.c31
3 files changed, 25 insertions, 31 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5dbf3ba..309c009 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,10 @@
2018-01-03 Richard Sandiford <richard.sandiford@linaro.org>
+
+ * tree-vect-loop.c (vect_transform_loop): Stub out scalar
+ IFN_MASK_LOAD calls here rather than...
+ * tree-vect-stmts.c (vectorizable_mask_load_store): ...here.
+
+2018-01-03 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 2fd11df..c2501a8 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -7810,6 +7810,25 @@ vect_transform_loop (loop_vec_info loop_vinfo)
gsi_next (&si);
}
} /* stmts in BB */
+
+ /* Stub out scalar statements that must not survive vectorization.
+ Doing this here helps with grouped statements, or statements that
+ are involved in patterns. */
+ for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
+ !gsi_end_p (gsi); gsi_next (&gsi))
+ {
+ gcall *call = dyn_cast <gcall *> (gsi_stmt (gsi));
+ if (call && gimple_call_internal_p (call, IFN_MASK_LOAD))
+ {
+ tree lhs = gimple_get_lhs (call);
+ if (!VECTOR_TYPE_P (TREE_TYPE (lhs)))
+ {
+ tree zero = build_zero_cst (TREE_TYPE (lhs));
+ gimple *new_stmt = gimple_build_assign (lhs, zero);
+ gsi_replace (&gsi, new_stmt, true);
+ }
+ }
+ }
} /* BBs in loop */
/* The vectorization factor is always > 1, so if we use an IV increment of 1.
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 27a8f7b..96c6605 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -2347,20 +2347,6 @@ vectorizable_mask_load_store (gimple *stmt, gimple_stmt_iterator *gsi,
STMT_VINFO_RELATED_STMT (prev_stmt_info) = new_stmt;
prev_stmt_info = vinfo_for_stmt (new_stmt);
}
-
- /* Ensure that even with -fno-tree-dce the scalar MASK_LOAD is removed
- from the IL. */
- if (STMT_VINFO_RELATED_STMT (stmt_info))
- {
- stmt = STMT_VINFO_RELATED_STMT (stmt_info);
- stmt_info = vinfo_for_stmt (stmt);
- }
- tree lhs = gimple_call_lhs (stmt);
- new_stmt = gimple_build_assign (lhs, build_zero_cst (TREE_TYPE (lhs)));
- set_vinfo_for_stmt (new_stmt, stmt_info);
- set_vinfo_for_stmt (stmt, NULL);
- STMT_VINFO_STMT (stmt_info) = new_stmt;
- gsi_replace (gsi, new_stmt, true);
return true;
}
else if (vls_type != VLS_LOAD)
@@ -2477,23 +2463,6 @@ vectorizable_mask_load_store (gimple *stmt, gimple_stmt_iterator *gsi,
}
}
- if (vls_type == VLS_LOAD)
- {
- /* Ensure that even with -fno-tree-dce the scalar MASK_LOAD is removed
- from the IL. */
- if (STMT_VINFO_RELATED_STMT (stmt_info))
- {
- stmt = STMT_VINFO_RELATED_STMT (stmt_info);
- stmt_info = vinfo_for_stmt (stmt);
- }
- tree lhs = gimple_call_lhs (stmt);
- new_stmt = gimple_build_assign (lhs, build_zero_cst (TREE_TYPE (lhs)));
- set_vinfo_for_stmt (new_stmt, stmt_info);
- set_vinfo_for_stmt (stmt, NULL);
- STMT_VINFO_STMT (stmt_info) = new_stmt;
- gsi_replace (gsi, new_stmt, true);
- }
-
return true;
}