This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, PR81464] Handle equal-argument loop exit phi in expand_omp_for_static_chunk
- From: Tom de Vries <Tom_deVries at mentor dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 18 Jul 2017 18:48:56 +0200
- Subject: [PATCH, PR81464] Handle equal-argument loop exit phi in expand_omp_for_static_chunk
- Authentication-results: sourceware.org; auth=none
Hi,
this patch fixes PR81464, an ICE in ompexpssa.
The ICE occurs in expand_omp_for_static_chunk when we're trying to fix
up a loop exit phi:
...
# .MEM_88 = PHI <.MEM_86(46), .MEM_86(71)>
...
It's a loop exit phi with equal arguments, which means that the variable
has the same value when the loop is executed, and when the loop is
skipped, in other words, it's not modified in the loop.
The fixup code ICEs when it cannot find a loop header phi corresponding
to the loop exit phi. But it's expected that there's no loop header phi,
given that the variable is not modified in the loop.
The patch fixes the ICE by not trying to fix up this particular kind of
loop exit phi.
Bootstrapped and reg-tested on x86_64.
OK for trunk?
Thanks,
- Tom
Handle equal-argument loop exit phi in expand_omp_for_static_chunk
2017-07-18 Tom de Vries <tom@codesourcery.com>
PR middle-end/81464
* omp-expand.c (expand_omp_for_static_chunk): Handle equal-argument loop
exit phi.
* gfortran.dg/pr81464.f90: New test.
---
gcc/omp-expand.c | 4 ++++
gcc/testsuite/gfortran.dg/pr81464.f90 | 19 +++++++++++++++++++
2 files changed, 23 insertions(+)
diff --git a/gcc/omp-expand.c b/gcc/omp-expand.c
index 929c530..63b91d7 100644
--- a/gcc/omp-expand.c
+++ b/gcc/omp-expand.c
@@ -4206,6 +4206,10 @@ expand_omp_for_static_chunk (struct omp_region *region,
source_location locus;
phi = psi.phi ();
+ if (operand_equal_p (gimple_phi_arg_def (phi, 0),
+ redirect_edge_var_map_def (vm), 0))
+ continue;
+
t = gimple_phi_result (phi);
gcc_assert (t == redirect_edge_var_map_result (vm));
diff --git a/gcc/testsuite/gfortran.dg/pr81464.f90 b/gcc/testsuite/gfortran.dg/pr81464.f90
new file mode 100644
index 0000000..425cae9
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr81464.f90
@@ -0,0 +1,19 @@
+! { dg-do compile }
+! { dg-options "--param parloops-chunk-size=2 -ftree-parallelize-loops=2 -O1" }
+
+program main
+ implicit none
+ real, dimension(:,:),allocatable :: a, b, c
+ real :: sm
+
+ allocate (a(2,2), b(2,2), c(2,2))
+
+ call random_number(a)
+ call random_number(b)
+
+ c = matmul(a,b)
+ sm = sum(c)
+
+ deallocate(a,b,c)
+
+end program main