OSDN Git Service

2013-03-13 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 13 Mar 2013 12:15:06 +0000 (12:15 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 13 Mar 2013 12:15:06 +0000 (12:15 +0000)
PR tree-optimization/56608
* tree-vect-slp.c (vect_schedule_slp): Do not remove scalar
calls when vectorizing basic-blocks.

* gcc.dg/vect/fast-math-bb-slp-call-3.c: New testcase.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-3.c [new file with mode: 0644]
gcc/tree-vect-slp.c

index 8008ab6..6a6d572 100644 (file)
@@ -1,3 +1,9 @@
+2013-03-13  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/56608
+       * tree-vect-slp.c (vect_schedule_slp): Do not remove scalar
+       calls when vectorizing basic-blocks.
+
 2013-03-13  Jakub Jelinek  <jakub@redhat.com>
 
        PR plugins/45078
index 9fa73be..c08f340 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-13  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/56608
+       * gcc.dg/vect/fast-math-bb-slp-call-3.c: New testcase.
+
 2013-03-13  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/56611
diff --git a/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-3.c b/gcc/testsuite/gcc.dg/vect/fast-math-bb-slp-call-3.c
new file mode 100644 (file)
index 0000000..5878d41
--- /dev/null
@@ -0,0 +1,68 @@
+#include <stdlib.h>
+#include <math.h>
+
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+
+typedef struct {
+    int initialHeight, initialWidth;
+    int rotatedHeight, rotatedWidth;
+    int autoCropHeight, autoCropWidth;
+} ufraw_data;
+
+void __attribute__((noinline,noclone))
+ufraw_test(ufraw_data *uf)
+{
+  int iWidth = uf->initialWidth;
+  int iHeight = uf->initialHeight;
+  double aspectRatio = ((double)iWidth) / iHeight;
+  double midX = iWidth / 2.0 - 0.5;
+  double midY = iHeight / 2.0 - 0.5;
+  double maxX = 0, maxY = 0;
+  double minX = 999999, minY = 999999;
+  double lastX = 0, lastY = 0, area = 0;
+  double scale;
+  int i;
+  for (i = 0; i < iWidth + iHeight - 1; i++)
+    {
+      int x, y;
+      if (i < iWidth) { // Trace the left border of the image
+         x = i;
+         y = 0;
+      } else { // Trace the bottom border of the image
+         x = iWidth - 1;
+         y = i - iWidth + 1;
+      }
+      double srcX = x - midX;
+      double srcY = y - midY;
+      // A digital planimeter:
+      area += srcY * lastX - srcX * lastY;
+      lastX = srcX;
+      lastY = srcY;
+      maxX = MAX(maxX, fabs(srcX));
+      maxY = MAX(maxY, fabs(srcY));
+      if (fabs(srcX / srcY) > aspectRatio)
+       minX = MIN(minX, fabs(srcX));
+      else
+       minY = MIN(minY, fabs(srcY));
+    }
+  scale = sqrt((iWidth - 1) * (iHeight - 1) / area);
+  uf->rotatedWidth = MIN(ceil(2 * maxX + 1.0) * scale, 2 * iWidth);
+  uf->rotatedHeight = MIN(ceil(2 * maxY + 1.0) * scale, 2 * iHeight);
+  uf->autoCropWidth = MIN(floor(2 * minX) * scale, 2 * iWidth);
+  uf->autoCropHeight = MIN(floor(2 * minY) * scale, 2 * iHeight);
+  if (uf->autoCropWidth != 3)
+    abort ();
+}
+
+int main()
+{
+  ufraw_data uf_data;
+  ufraw_data *uf = &uf_data;
+  uf->initialWidth = 4;
+  uf->initialHeight = 5;
+  ufraw_test(uf);
+  return 0;
+}
+
+/* { dg-final { cleanup-tree-dump "slp" } } */
index 3b2fc80..e184326 100644 (file)
@@ -3181,7 +3181,15 @@ vect_schedule_slp (loop_vec_info loop_vinfo, bb_vec_info bb_vinfo)
       unsigned int j;
       gimple_stmt_iterator gsi;
 
-      vect_remove_slp_scalar_calls (root);
+      /* Remove scalar call stmts.  Do not do this for basic-block
+        vectorization as not all uses may be vectorized.
+        ???  Why should this be necessary?  DCE should be able to
+        remove the stmts itself.
+        ???  For BB vectorization we can as well remove scalar
+        stmts starting from the SLP tree root if they have no
+        uses.  */
+      if (loop_vinfo)
+       vect_remove_slp_scalar_calls (root);
 
       for (j = 0; SLP_TREE_SCALAR_STMTS (root).iterate (j, &store)
                   && j < SLP_INSTANCE_GROUP_SIZE (instance); j++)