]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2018-09-05 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 5 Sep 2018 10:33:41 +0000 (10:33 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 5 Sep 2018 10:33:41 +0000 (10:33 +0000)
PR tree-optimization/87217
* tree-ssa-sccvn.c (vuse_valueize): New.
(vn_reference_lookup_pieces): Use it.
(vn_reference_lookup): Likewise.

* gfortran.dg/pr87217.f: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@264121 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr87217.f [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index 45b97c17386a343077d78372da2619e3dea317f9..47bc612b82081393391a67c56027389ecc8b748a 100644 (file)
@@ -1,3 +1,10 @@
+2018-09-05  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/87217
+       * tree-ssa-sccvn.c (vuse_valueize): New.
+       (vn_reference_lookup_pieces): Use it.
+       (vn_reference_lookup): Likewise.
+
 2018-09-05  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/87137
index 386e3844ce9293eb548f92a7500dce2a85eac996..12bb8a29d8928fe95cb407b4e238e7af4a75239c 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-05  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/87217
+       * gfortran.dg/pr87217.f: New testcase.
+
 2018-09-05   Pádraig Brady p@draigbrady.com
 
        PR c++/87137
diff --git a/gcc/testsuite/gfortran.dg/pr87217.f b/gcc/testsuite/gfortran.dg/pr87217.f
new file mode 100644 (file)
index 0000000..163a276
--- /dev/null
@@ -0,0 +1,32 @@
+! { dg-do compile }
+! { dg-options "-O3" }
+      implicit real*8 (a-h,o-z)
+      common clop6(3),dps(6),aml6(6,6)
+      dimension y1(3)
+      dimension dclo(3)
+      dimension dx(3),dy(3)
+      save
+      do 80 ii=1,itco
+        y1(3)=dps(1)
+        do 40 l=1,3
+          dy(l)=clop6(l)-y1(l)
+   40   continue
+        dczp=abs(dy(3))
+        if(dcx.le.c1m10.and.dcz.le.c1m10.and.dcxp.le.c1m10.and.dczp
+     +  .le.c1m10.and.dcy.le.c1m10.and.dcyp.le.c1m10) goto 90
+   80 continue
+      write(6) itco
+      ii=itco
+   90 continue
+      if(ii.ne.itco) then
+        do 65 k=1,3
+          do 55 j=1,3
+            jj=2*j
+            kk=2*k
+            dclo(k)=aml6(kk-1,jj-1)*dx(j)+dclo(k)
+            dclo(k)=aml6(kk-1,jj)*dy(j)+dclo(k)
+   55     continue
+   65   continue
+      endif
+      end
+
index 1e4bfe5f7ba9712a6ce943bd79edb0d9f2be5d5d..105605a45f8f5f02fa356589af8061f772b0670e 100644 (file)
@@ -493,6 +493,25 @@ vuse_ssa_val (tree x)
   return x;
 }
 
+/* Similar to the above but used as callback for walk_non_aliases_vuses
+   and thus should stop at unvisited VUSE to not walk across region
+   boundaries.  */
+
+static tree
+vuse_valueize (tree vuse)
+{
+  do
+    {
+      bool visited;
+      vuse = SSA_VAL (vuse, &visited);
+      if (!visited)
+       return NULL_TREE;
+      gcc_assert (vuse != VN_TOP);
+    }
+  while (SSA_NAME_IN_FREE_LIST (vuse));
+  return vuse;
+}
+
 
 /* Return the vn_kind the expression computed by the stmt should be
    associated with.  */
@@ -2573,7 +2592,7 @@ vn_reference_lookup_pieces (tree vuse, alias_set_type set, tree type,
          (vn_reference_t)walk_non_aliased_vuses (&r, vr1.vuse,
                                                  vn_reference_lookup_2,
                                                  vn_reference_lookup_3,
-                                                 vuse_ssa_val, &vr1);
+                                                 vuse_valueize, &vr1);
       gcc_checking_assert (vr1.operands == shared_lookup_references);
     }
 
@@ -2629,7 +2648,7 @@ vn_reference_lookup (tree op, tree vuse, vn_lookup_kind kind,
        (vn_reference_t)walk_non_aliased_vuses (&r, vr1.vuse,
                                                vn_reference_lookup_2,
                                                vn_reference_lookup_3,
-                                               vuse_ssa_val, &vr1);
+                                               vuse_valueize, &vr1);
       gcc_checking_assert (vr1.operands == shared_lookup_references);
       if (wvnresult)
        {