diff options
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. */ |