aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <tobias@codesourcery.com>2022-08-09 07:57:40 +0200
committerTobias Burnus <tobias@codesourcery.com>2022-08-09 07:57:40 +0200
commit8a16b9f983824b6b9a25275cd23b6bba8c98b800 (patch)
tree2cc829b55a533c2f350c0d986e47c6284a9d1370
parent5f17badb648980275ff4c86b0c207dbd751b00f2 (diff)
downloadgcc-8a16b9f983824b6b9a25275cd23b6bba8c98b800.zip
gcc-8a16b9f983824b6b9a25275cd23b6bba8c98b800.tar.gz
gcc-8a16b9f983824b6b9a25275cd23b6bba8c98b800.tar.bz2
OpenMP: Fix folding with simd's linear clause [PR106492]
gcc/ChangeLog: PR middle-end/106492 * omp-low.cc (lower_rec_input_clauses): Add missing folding to data type of linear-clause list item. gcc/testsuite/ChangeLog: PR middle-end/106492 * g++.dg/gomp/pr106492.C: New test.
-rw-r--r--gcc/omp-low.cc6
-rw-r--r--gcc/testsuite/g++.dg/gomp/pr106492.C49
2 files changed, 52 insertions, 3 deletions
diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
index d73c165..3c4b859 100644
--- a/gcc/omp-low.cc
+++ b/gcc/omp-low.cc
@@ -6241,10 +6241,10 @@ lower_rec_input_clauses (tree clauses, gimple_seq *ilist, gimple_seq *dlist,
}
if (POINTER_TYPE_P (TREE_TYPE (x)))
- x = fold_build2 (POINTER_PLUS_EXPR,
- TREE_TYPE (x), x, t);
+ x = fold_build_pointer_plus (x, t);
else
- x = fold_build2 (PLUS_EXPR, TREE_TYPE (x), x, t);
+ x = fold_build2 (PLUS_EXPR, TREE_TYPE (x), x,
+ fold_convert (TREE_TYPE (x), t));
}
if ((OMP_CLAUSE_CODE (c) != OMP_CLAUSE_LINEAR
diff --git a/gcc/testsuite/g++.dg/gomp/pr106492.C b/gcc/testsuite/g++.dg/gomp/pr106492.C
new file mode 100644
index 0000000..f263bb4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/pr106492.C
@@ -0,0 +1,49 @@
+/* PR middle-end/106492 */
+
+template <typename T>
+struct S {
+ T a : 12;
+ S () : a(0)
+ {
+#pragma omp for simd linear(a)
+ for (int k = 0; k < 64; ++k)
+ a++;
+ }
+};
+struct U {
+ int a : 12;
+ U () : a(0)
+ {
+#pragma omp for simd linear(a)
+ for (int k = 0; k < 64; ++k)
+ a++;
+ }
+};
+
+S<int> s;
+U u;
+
+
+template <typename T>
+struct Sptr {
+ T a;
+ Sptr (T init) : a(init)
+ {
+#pragma omp for simd linear(a)
+ for (int k = 0; k < 64; ++k)
+ a++;
+ }
+};
+struct Uptr {
+ int *a;
+ Uptr (int *init) : a(init)
+ {
+#pragma omp for simd linear(a)
+ for (int k = 0; k < 64; ++k)
+ a++;
+ }
+};
+
+int i[1024];
+Sptr<int *> sptr(i);
+Uptr uptr(&i[100]);