aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIra Rosen <irar@il.ibm.com>2012-01-12 14:41:44 +0000
committerIra Rosen <irar@gcc.gnu.org>2012-01-12 14:41:44 +0000
commit82db3d43de58dd1c6e0c074fc2e0e85cdc09f0cc (patch)
tree3467c5cd21b186bcb2ee3ad3559793fbeb64f44e /gcc
parent869eea243d175a1c6b6ac152795c28ae986512d3 (diff)
downloadgcc-82db3d43de58dd1c6e0c074fc2e0e85cdc09f0cc.zip
gcc-82db3d43de58dd1c6e0c074fc2e0e85cdc09f0cc.tar.gz
gcc-82db3d43de58dd1c6e0c074fc2e0e85cdc09f0cc.tar.bz2
re PR tree-optimization/51799 (Compiler ICE in vect_is_simple_use_1)
PR tree-optimization/51799 * tree-vect-patterns.c (vect_recog_over_widening_pattern): Check that the last operation is a type demotion. From-SVN: r183126
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/vect/pr51799.c18
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-widen-shift-u8.c3
-rw-r--r--gcc/tree-vect-patterns.c10
5 files changed, 38 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1d6a1af..c0898c5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-01-12 Ira Rosen <irar@il.ibm.com>
+
+ PR tree-optimization/51799
+ * tree-vect-patterns.c (vect_recog_over_widening_pattern): Check
+ that the last operation is a type demotion.
+
2012-01-12 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (*zero_extendsidi2_rex64): Correct movl template.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b576b69..56f28ee 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2012-01-12 Ira Rosen <irar@il.ibm.com>
+
+ PR tree-optimization/51799
+ * gcc.dg/vect/pr51799.c: New test.
+ * gcc.dg/vect/vect-widen-shift-u8.c: Expect two widening shift
+ patterns.
+
2012-01-12 Dominique d'Humieres <dominiq@lps.ens.fr>
Tobias Burnus <burnus@net-b.de>
diff --git a/gcc/testsuite/gcc.dg/vect/pr51799.c b/gcc/testsuite/gcc.dg/vect/pr51799.c
new file mode 100644
index 0000000..7d95e36
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/pr51799.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef signed short int16_t;
+typedef unsigned long uint32_t;
+void
+f0a (uint32_t * __restrict__ result, int8_t * __restrict__ arg1,
+ uint32_t * __restrict__ arg4, int8_t temp_6)
+{
+ int idx;
+ for (idx = 0; idx < 416; idx += 1)
+ {
+ result[idx] = (uint8_t)(((arg1[idx] << 7) + arg4[idx]) * temp_6);
+ }
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-widen-shift-u8.c b/gcc/testsuite/gcc.dg/vect/vect-widen-shift-u8.c
index b87a277..49d5a88 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-widen-shift-u8.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-widen-shift-u8.c
@@ -59,7 +59,6 @@ int main (void)
return 0;
}
-/* { dg-final { scan-tree-dump-times "vect_recog_widen_shift_pattern: detected" 1 "vect" { target vect_widen_shift } } } */
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_shift_pattern: detected" 2 "vect" { target vect_widen_shift } } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
-
diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c
index 46d43ce..34ac2e5 100644
--- a/gcc/tree-vect-patterns.c
+++ b/gcc/tree-vect-patterns.c
@@ -1186,13 +1186,15 @@ vect_recog_over_widening_pattern (VEC (gimple, heap) **stmts,
{
use_lhs = gimple_assign_lhs (use_stmt);
use_type = TREE_TYPE (use_lhs);
- /* Support only type promotion or signedess change. Check that USE_TYPE
- is not bigger than the original type. */
+ /* Support only type demotion or signedess change. */
if (!INTEGRAL_TYPE_P (use_type)
- || TYPE_PRECISION (new_type) > TYPE_PRECISION (use_type)
- || TYPE_PRECISION (type) < TYPE_PRECISION (use_type))
+ || TYPE_PRECISION (type) <= TYPE_PRECISION (use_type))
return NULL;
+ /* Check that NEW_TYPE is not bigger than the conversion result. */
+ if (TYPE_PRECISION (new_type) > TYPE_PRECISION (use_type))
+ return NULL;
+
if (TYPE_UNSIGNED (new_type) != TYPE_UNSIGNED (use_type)
|| TYPE_PRECISION (new_type) != TYPE_PRECISION (use_type))
{