OSDN Git Service

2012-07-06 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Jul 2012 09:21:36 +0000 (09:21 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Jul 2012 09:21:36 +0000 (09:21 +0000)
Backport from mainline
2012-06-18  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/53693
* tree-vect-patterns.c (vect_operation_fits_smaller_type):
Reject operands with more than one use.

* g++.dg/torture/pr53693.C: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@189313 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr53693.C [new file with mode: 0644]
gcc/tree-vect-patterns.c

index 886c0e6..2fd2142 100644 (file)
@@ -1,6 +1,15 @@
 2012-07-06  Richard Guenther  <rguenther@suse.de>
 
        Backport from mainline
+       2012-06-18  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/53693
+       * tree-vect-patterns.c (vect_operation_fits_smaller_type):
+       Reject operands with more than one use.
+
+2012-07-06  Richard Guenther  <rguenther@suse.de>
+
+       Backport from mainline
        2012-04-11  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/52621
index ccd328f..0a78b6d 100644 (file)
@@ -1,6 +1,14 @@
 2012-07-06  Richard Guenther  <rguenther@suse.de>
 
        Backport from mainline
+       2012-06-18  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/53693
+       * g++.dg/torture/pr53693.C: New testcase.
+
+2012-07-06  Richard Guenther  <rguenther@suse.de>
+
+       Backport from mainline
        2012-04-11  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/52621
diff --git a/gcc/testsuite/g++.dg/torture/pr53693.C b/gcc/testsuite/g++.dg/torture/pr53693.C
new file mode 100644 (file)
index 0000000..b67a484
--- /dev/null
@@ -0,0 +1,21 @@
+// { dg-do compile }
+
+void
+filter_scanlines (void *src_buffer, void *dst_buffer, int dst_pitch, int width)
+{
+  int x;
+  unsigned short *src, *dst_a, *dst_b;
+
+  src = (unsigned short *) src_buffer;
+  dst_a = (unsigned short *) dst_buffer;
+  dst_b = ((unsigned short *) dst_buffer) + (dst_pitch >> 1);
+
+  for (x = 0; x < width; x++)
+    {
+      unsigned char gs, gh;
+      gs = src[x];
+      gh = gs + (gs >> 1);
+      dst_a[x] = (gh << 5) | (gh);
+      dst_b[x] = ((gs  - gh) << 5)  | (gs  - gh);
+    }
+}
index 9c84d0a..c3f24a1 100644 (file)
@@ -937,6 +937,11 @@ vect_operation_fits_smaller_type (gimple stmt, tree def, tree *new_type,
       || TREE_CODE (const_oprnd) != INTEGER_CST)
     return false;
 
+  /* If oprnd has other uses besides that in stmt we cannot mark it
+     as being part of a pattern only.  */
+  if (!has_single_use (oprnd))
+    return false;
+
   /* If we are in the middle of a sequence, we use DEF from a previous
      statement.  Otherwise, OPRND has to be a result of type promotion.  */
   if (*new_type)