aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-10-09 10:19:38 +0200
committerRichard Biener <rguenther@suse.de>2020-10-09 11:28:15 +0200
commit5d708c6315e0fc57992cda7b466a5a9877ced4e3 (patch)
tree540e36e6e80f588bc3eacd551c24129cbc552d30
parent1cde5d85bec20877bed063fc0046b9885231a0ae (diff)
downloadgcc-5d708c6315e0fc57992cda7b466a5a9877ced4e3.zip
gcc-5d708c6315e0fc57992cda7b466a5a9877ced4e3.tar.gz
gcc-5d708c6315e0fc57992cda7b466a5a9877ced4e3.tar.bz2
tree-optimization/97347 - fix another SLP constant insertion issue
Just use edge insertion which will appropriately handle the situation from botan. 2020-10-09 Richard Biener <rguenther@suse.de> PR tree-optimization/97347 * tree-vect-slp.c (vect_create_constant_vectors): Use edge insertion when inserting on the fallthru edge, appropriately insert at the start of BBs when inserting after PHIs. * g++.dg/vect/pr97347.cc: New testcase.
-rw-r--r--gcc/testsuite/g++.dg/vect/pr97347.cc41
-rw-r--r--gcc/tree-vect-slp.c19
2 files changed, 54 insertions, 6 deletions
diff --git a/gcc/testsuite/g++.dg/vect/pr97347.cc b/gcc/testsuite/g++.dg/vect/pr97347.cc
new file mode 100644
index 0000000..6a9116c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/vect/pr97347.cc
@@ -0,0 +1,41 @@
+// { dg-do compile }
+// { dg-require-effective-target c++11 }
+
+inline namespace __cxx11 {}
+typedef int size_t;
+class MessageAuthenticationCode;
+class __uniq_ptr_impl {
+ struct _Ptr {
+ using type = MessageAuthenticationCode *;
+ };
+public:
+ using pointer = _Ptr::type;
+};
+class unique_ptr {
+public:
+ using pointer = __uniq_ptr_impl::pointer;
+ unique_ptr(pointer);
+};
+namespace __cxx11 {
+class basic_string {
+public:
+ basic_string(char *);
+ ~basic_string();
+};
+} // namespace __cxx11
+class MessageAuthenticationCode {};
+class SCAN_Name {
+public:
+ SCAN_Name(basic_string);
+ size_t arg_as_integer();
+};
+class SipHash : public MessageAuthenticationCode {
+public:
+ SipHash(size_t c, size_t d) : m_C(c), m_D(d) {}
+ size_t m_C, m_D;
+};
+void create(basic_string algo_spec, char *s) {
+ basic_string provider = s;
+ SCAN_Name req(algo_spec);
+ unique_ptr(new SipHash(req.arg_as_integer(), req.arg_as_integer()));
+}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index 77ea4d0..479c3ee 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -4145,9 +4145,17 @@ vect_create_constant_vectors (vec_info *vinfo, slp_tree op_node)
{
gimple_stmt_iterator gsi;
if (gimple_code (insert_after->stmt) == GIMPLE_PHI)
- gsi = gsi_after_labels (gimple_bb (insert_after->stmt));
+ {
+ gsi = gsi_after_labels (gimple_bb (insert_after->stmt));
+ gsi_insert_seq_before (&gsi, ctor_seq,
+ GSI_CONTINUE_LINKING);
+ }
else if (!stmt_ends_bb_p (insert_after->stmt))
- gsi = gsi_for_stmt (insert_after->stmt);
+ {
+ gsi = gsi_for_stmt (insert_after->stmt);
+ gsi_insert_seq_after (&gsi, ctor_seq,
+ GSI_CONTINUE_LINKING);
+ }
else
{
/* When we want to insert after a def where the
@@ -4155,11 +4163,10 @@ vect_create_constant_vectors (vec_info *vinfo, slp_tree op_node)
edge. */
edge e = find_fallthru_edge
(gimple_bb (insert_after->stmt)->succs);
- gcc_assert (single_pred_p (e->dest));
- gsi = gsi_after_labels (e->dest);
+ basic_block new_bb
+ = gsi_insert_seq_on_edge_immediate (e, ctor_seq);
+ gcc_assert (!new_bb);
}
- gsi_insert_seq_after (&gsi, ctor_seq,
- GSI_CONTINUE_LINKING);
}
else
vinfo->insert_seq_on_entry (NULL, ctor_seq);