aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/omp-simd-clone.c15
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/gomp/pr95108.c18
4 files changed, 43 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ce5ccab..0f0dbd0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2020-05-14 Jakub Jelinek <jakub@redhat.com>
+ PR middle-end/95108
+ * omp-simd-clone.c (struct modify_stmt_info): Add after_stmt member.
+ (ipa_simd_modify_stmt_ops): For PHIs, only add before first stmt in
+ entry block if info->after_stmt is NULL, otherwise add after that stmt
+ and update it after adding each stmt.
+ (ipa_simd_modify_function_body): Initialize info.after_stmt.
+
* function.h (struct function): Add has_omp_target bit.
* omp-offload.c (omp_discover_declare_target_fn_r): New function,
old renamed to ...
diff --git a/gcc/omp-simd-clone.c b/gcc/omp-simd-clone.c
index 71ff034..09fdd60 100644
--- a/gcc/omp-simd-clone.c
+++ b/gcc/omp-simd-clone.c
@@ -821,6 +821,7 @@ simd_clone_init_simd_arrays (struct cgraph_node *node,
struct modify_stmt_info {
ipa_param_body_adjustments *adjustments;
gimple *stmt;
+ gimple *after_stmt;
/* True if the parent statement was modified by
ipa_simd_modify_stmt_ops. */
bool modified;
@@ -912,7 +913,10 @@ ipa_simd_modify_stmt_ops (tree *tp, int *walk_subtrees, void *data)
gimple_stmt_iterator gsi;
if (gimple_code (info->stmt) == GIMPLE_PHI)
{
- gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
+ if (info->after_stmt)
+ gsi = gsi_for_stmt (info->after_stmt);
+ else
+ gsi = gsi_after_labels (single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)));
/* Cache SSA_NAME for next time. */
if (pbr
&& TREE_CODE (*orig_tp) == ADDR_EXPR
@@ -924,7 +928,12 @@ ipa_simd_modify_stmt_ops (tree *tp, int *walk_subtrees, void *data)
}
else
gsi = gsi_for_stmt (info->stmt);
- gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
+ if (info->after_stmt)
+ gsi_insert_after (&gsi, stmt, GSI_SAME_STMT);
+ else
+ gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);
+ if (gimple_code (info->stmt) == GIMPLE_PHI)
+ info->after_stmt = stmt;
*orig_tp = repl;
}
else if (!useless_type_conversion_p (TREE_TYPE (*tp), TREE_TYPE (repl)))
@@ -1015,6 +1024,7 @@ ipa_simd_modify_function_body (struct cgraph_node *node,
gphi *phi = as_a <gphi *> (gsi_stmt (gsi));
int i, n = gimple_phi_num_args (phi);
info.stmt = phi;
+ info.after_stmt = NULL;
struct walk_stmt_info wi;
memset (&wi, 0, sizeof (wi));
info.modified = false;
@@ -1040,6 +1050,7 @@ ipa_simd_modify_function_body (struct cgraph_node *node,
{
gimple *stmt = gsi_stmt (gsi);
info.stmt = stmt;
+ info.after_stmt = NULL;
struct walk_stmt_info wi;
memset (&wi, 0, sizeof (wi));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2c96a24..13d5548 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-05-14 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/95108
+ * gcc.dg/gomp/pr95108.c: New test.
+
2020-05-14 Uroš Bizjak <ubizjak@gmail.com>
PR target/95046
diff --git a/gcc/testsuite/gcc.dg/gomp/pr95108.c b/gcc/testsuite/gcc.dg/gomp/pr95108.c
new file mode 100644
index 0000000..b492333
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/pr95108.c
@@ -0,0 +1,18 @@
+/* PR middle-end/95108 */
+/* { dg-do compile { target vect_simd_clones } } */
+/* { dg-options "-O2 -fopenmp-simd -w" } */
+
+int *v;
+
+#pragma omp declare simd
+void
+foo (int x)
+{
+ int *a = &x + 1;
+
+ for (;;)
+ {
+ *v = *a;
+ a = v;
+ }
+}