From 145357a492e6ebd91f4c11f27f5682be8000ebec Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 7 Jun 2005 23:45:07 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/execute/20050607-1.c | 16 ++++++++++++++++ gcc/tree.c | 13 ++++++++++--- 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/20050607-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 74416efb538e..56573ec013d4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-06-07 Jakub Jelinek + + PR middle-end/21850 + * tree.c (get_unwidened): Stop at NOP_EXPR/CONVERT_EXPR that convert + from vector types. + 2005-06-07 Diego Novillo * tree-ssa-threadupdate.c (struct thread_stats_d): Declare. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ef8a58fcd571..5411467e053c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-06-07 Jakub Jelinek + + PR middle-end/21850 + * gcc.c-torture/execute/20050607-1.c: New test. + 2005-06-07 Thomas Koenig 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 000000000000..41579bbba5ef --- /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; +} diff --git a/gcc/tree.c b/gcc/tree.c index 15488fbc8608..2f5f924cdbef 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -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. */