diff options
author | Ira Rosen <irar@il.ibm.com> | 2012-01-12 14:41:44 +0000 |
---|---|---|
committer | Ira Rosen <irar@gcc.gnu.org> | 2012-01-12 14:41:44 +0000 |
commit | 82db3d43de58dd1c6e0c074fc2e0e85cdc09f0cc (patch) | |
tree | 3467c5cd21b186bcb2ee3ad3559793fbeb64f44e /gcc | |
parent | 869eea243d175a1c6b6ac152795c28ae986512d3 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/pr51799.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/vect/vect-widen-shift-u8.c | 3 | ||||
-rw-r--r-- | gcc/tree-vect-patterns.c | 10 |
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)) { |