This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[openacc, committed] Fix diff_type in expand_oacc_collapse_init
- From: Tom de Vries <Tom_deVries at mentor dot com>
- To: Jakub Jelinek <jakub at redhat dot com>, Thomas Schwinge <thomas at codesourcery dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Richard Biener <rguenther at suse dot de>
- Date: Wed, 7 Feb 2018 12:05:40 +0100
- Subject: [openacc, committed] Fix diff_type in expand_oacc_collapse_init
- Authentication-results: sourceware.org; auth=none
Hi,
this patch fixes an 8 regression in an openacc testcase.
The regression was introduced by r250925, a fix for PR78266, a bug in
the handling of a loop with iteration variable type range smaller than
the size of the parallel dimension the loop is assigned to.
The fix for the regression is to apply the r250925 fix (in
expand_oacc_for) to expand_oacc_collapse_init as well.
Build and reg-tested on x86_64 with nvptx accelerator.
Committed to stage4 trunk.
Thanks,
- Tom
[openacc] Fix diff_type in expand_oacc_collapse_init
2018-02-07 Tom de Vries <tom@codesourcery.com>
PR libgomp/84217
* omp-expand.c (expand_oacc_collapse_init): Ensure diff_type is large
enough.
* c-c++-common/goacc/pr84217.c: New test.
* gfortran.dg/goacc/pr84217.f90: New test.
* testsuite/libgomp.oacc-c-c++-common/pr84217.c: New test.
---
gcc/omp-expand.c | 2 ++
gcc/testsuite/c-c++-common/goacc/pr84217.c | 8 ++++++++
gcc/testsuite/gfortran.dg/goacc/pr84217.f90 | 9 +++++++++
.../testsuite/libgomp.oacc-c-c++-common/pr84217.c | 22 ++++++++++++++++++++++
4 files changed, 41 insertions(+)
diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c
index 90e0631..bb20490 100644
--- a/gcc/omp-expand.c
+++ b/gcc/omp-expand.c
@@ -1433,6 +1433,8 @@ expand_oacc_collapse_init (const struct omp_for_data *fd,
plus_type = sizetype;
if (POINTER_TYPE_P (diff_type) || TYPE_UNSIGNED (diff_type))
diff_type = signed_type_for (diff_type);
+ if (TYPE_PRECISION (diff_type) < TYPE_PRECISION (integer_type_node))
+ diff_type = integer_type_node;
if (tiling)
{
diff --git a/gcc/testsuite/c-c++-common/goacc/pr84217.c b/gcc/testsuite/c-c++-common/goacc/pr84217.c
new file mode 100644
index 0000000..c4f2920
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/goacc/pr84217.c
@@ -0,0 +1,8 @@
+void
+foo (void)
+{
+#pragma acc parallel loop tile (2, 3)
+ for (short i = 0; i < 10; ++i)
+ for (short j = 0; j < 10; ++j)
+ ;
+}
diff --git a/gcc/testsuite/gfortran.dg/goacc/pr84217.f90 b/gcc/testsuite/gfortran.dg/goacc/pr84217.f90
new file mode 100644
index 0000000..cee49e9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/goacc/pr84217.f90
@@ -0,0 +1,9 @@
+subroutine foo
+ integer(2) :: i, j
+ !$acc parallel loop tile(2,3)
+ do i = 1, 10
+ do j = 1, 10
+ end do
+ end do
+ !$acc end parallel loop
+end
diff --git a/libgomp/testsuite/libgomp.oacc-c-c++-common/pr84217.c b/libgomp/testsuite/libgomp.oacc-c-c++-common/pr84217.c
new file mode 100644
index 0000000..18ff66a
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-c-c++-common/pr84217.c
@@ -0,0 +1,22 @@
+extern void abort (void);
+
+#define N 10
+
+int
+main (void)
+{
+ int a[N];
+
+ for (short i = 0; i < N; ++i)
+ a[i] = -1;
+
+#pragma acc parallel loop tile (2)
+ for (short i = 0; i < N; ++i)
+ a[i] = i;
+
+ for (short i = 0; i < N; ++i)
+ if (a[i] != i)
+ abort ();
+
+ return 0;
+}