diff options
author | Jakub Jelinek <jakub@redhat.com> | 2005-06-07 23:45:07 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2005-06-07 23:45:07 +0200 |
commit | 145357a492e6ebd91f4c11f27f5682be8000ebec (patch) | |
tree | 289feaa6967e1edfb56b045c346f8586a45ab2ef /gcc | |
parent | 75829da2a941c239cb2ba258ea2b58700fd39264 (diff) | |
download | gcc-145357a492e6ebd91f4c11f27f5682be8000ebec.zip gcc-145357a492e6ebd91f4c11f27f5682be8000ebec.tar.gz gcc-145357a492e6ebd91f4c11f27f5682be8000ebec.tar.bz2 |
re PR middle-end/21850 (misscompiling comparision from vector to integer)
PR middle-end/21850
* tree.c (get_unwidened): Stop at NOP_EXPR/CONVERT_EXPR that convert
from vector types.
* gcc.c-torture/execute/20050607-1.c: New test.
From-SVN: r100725
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/20050607-1.c | 16 | ||||
-rw-r--r-- | gcc/tree.c | 13 |
4 files changed, 37 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 74416ef..56573ec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-06-07 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/21850 + * tree.c (get_unwidened): Stop at NOP_EXPR/CONVERT_EXPR that convert + from vector types. + 2005-06-07 Diego Novillo <dnovillo@redhat.com> * tree-ssa-threadupdate.c (struct thread_stats_d): Declare. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ef8a58f..5411467 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-06-07 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/21850 + * gcc.c-torture/execute/20050607-1.c: New test. + 2005-06-07 Thomas Koenig <Thomas.Koenig@online.de> PR libfortran/21926 diff --git a/gcc/testsuite/gcc.c-torture/execute/20050607-1.c b/gcc/testsuite/gcc.c-torture/execute/20050607-1.c new file mode 100644 index 0000000..41579bb --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20050607-1.c @@ -0,0 +1,16 @@ +/* PR middle-end/21850 */ + +extern void abort (void); + +typedef int V2SI __attribute__ ((vector_size (8))); + +int +main (void) +{ +#if (__INT_MAX__ == 2147483647) \ + && (__LONG_LONG_MAX__ == 9223372036854775807LL) + if (((int)(long long)(V2SI){ 2, 2 }) != 2) + abort (); +#endif + return 0; +} @@ -4937,9 +4937,16 @@ get_unwidened (tree op, tree for_type) while (TREE_CODE (op) == NOP_EXPR || TREE_CODE (op) == CONVERT_EXPR) { - int bitschange - = TYPE_PRECISION (TREE_TYPE (op)) - - TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op, 0))); + int bitschange; + + /* TYPE_PRECISION on vector types has different meaning + (TYPE_VECTOR_SUBPARTS) and casts from vectors are view conversions, + so avoid them here. */ + if (TREE_CODE (TREE_TYPE (TREE_OPERAND (op, 0))) == VECTOR_TYPE) + break; + + bitschange = TYPE_PRECISION (TREE_TYPE (op)) + - TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (op, 0))); /* Truncations are many-one so cannot be removed. Unless we are later going to truncate down even farther. */ |