aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-06-18 14:05:27 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-06-18 14:05:27 +0000
commit9ef7adc086571bf7d2d3664dc7cdeaee27fc3a9b (patch)
tree63fda7b3c2847615a9a2cc1f82d7ccaca1f96618 /gcc
parent9b10be32fd3295d086c4a4cef68e9139a7a07f85 (diff)
downloadgcc-9ef7adc086571bf7d2d3664dc7cdeaee27fc3a9b.zip
gcc-9ef7adc086571bf7d2d3664dc7cdeaee27fc3a9b.tar.gz
gcc-9ef7adc086571bf7d2d3664dc7cdeaee27fc3a9b.tar.bz2
re PR tree-optimization/53693 (ICE in vect_get_vec_def_for_stmt_copy, at tree-vect-stmts.c:1438)
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. From-SVN: r188733
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr53693.C21
-rw-r--r--gcc/tree-vect-patterns.c5
4 files changed, 37 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 194601d..8355d02 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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-06-18 Bill Schmidt <wschmidt@linux.ibm.com>
PR tree-optimization/53703
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 933dca3..392e603 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-06-18 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/53693
+ * g++.dg/torture/pr53693.C: New testcase.
+
2012-06-18 Bill Schmidt <wschmidt@linux.ibm.com>
PR tree-optimization/53703
diff --git a/gcc/testsuite/g++.dg/torture/pr53693.C b/gcc/testsuite/g++.dg/torture/pr53693.C
new file mode 100644
index 0000000..b67a484
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr53693.C
@@ -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);
+ }
+}
diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
index 4138d41..11a5019 100644
--- a/gcc/tree-vect-patterns.c
+++ b/gcc/tree-vect-patterns.c
@@ -991,6 +991,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)