OpenMP: Fix folding with simd's linear clause [PR106492]
authorTobias Burnus <tobias@codesourcery.com>
Tue, 9 Aug 2022 05:57:40 +0000 (07:57 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Wed, 10 Aug 2022 17:17:35 +0000 (19:17 +0200)
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.

(cherry picked from commit 8a16b9f983824b6b9a25275cd23b6bba8c98b800)

gcc/omp-low.cc
gcc/testsuite/g++.dg/gomp/pr106492.C [new file with mode: 0644]

index bf5779b..eefd910 100644 (file)
@@ -6205,10 +6205,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 (file)
index 0000000..f263bb4
--- /dev/null
@@ -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]);