From 2b33282907e37ff709826b7f60832b036ceb6cbd Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 25 Apr 2014 15:52:52 +0200 Subject: [PATCH] re PR tree-optimization/60960 (Wrong result when a vector variable is divided by a literal constant) PR tree-optimization/60960 * tree-vect-generic.c (expand_vector_operation): Only call expand_vector_divmod if type's mode satisfies VECTOR_MODE_P. * gcc.c-torture/execute/pr60960.c: New test. From-SVN: r209802 --- gcc/ChangeLog | 6 +++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.c-torture/execute/pr60960.c | 38 +++++++++++++++++++ gcc/tree-vect-generic.c | 3 +- 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr60960.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f0fc311dbc03..b5f0816bc731 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-04-25 Jakub Jelinek + + PR tree-optimization/60960 + * tree-vect-generic.c (expand_vector_operation): Only call + expand_vector_divmod if type's mode satisfies VECTOR_MODE_P. + 2014-04-25 Tom de Vries * expr.c (clobber_reg_mode): New function. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ba00dc81f025..728a267812f0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-25 Jakub Jelinek + + PR tree-optimization/60960 + * gcc.c-torture/execute/pr60960.c: New test. + 2014-04-25 Marek Polacek * gcc.dg/pr18079-2.c: Fix quoting in dg-warning. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr60960.c b/gcc/testsuite/gcc.c-torture/execute/pr60960.c new file mode 100644 index 000000000000..b4f08d4c543f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr60960.c @@ -0,0 +1,38 @@ +/* PR tree-optimization/60960 */ + +typedef unsigned char v4qi __attribute__ ((vector_size (4))); + +__attribute__((noinline, noclone)) v4qi +f1 (v4qi v) +{ + return v / 2; +} + +__attribute__((noinline, noclone)) v4qi +f2 (v4qi v) +{ + return v / (v4qi) { 2, 2, 2, 2 }; +} + +__attribute__((noinline, noclone)) v4qi +f3 (v4qi x, v4qi y) +{ + return x / y; +} + +int +main () +{ + v4qi x = { 5, 5, 5, 5 }; + v4qi y = { 2, 2, 2, 2 }; + v4qi z = f1 (x); + if (__builtin_memcmp (&y, &z, sizeof (y)) != 0) + __builtin_abort (); + z = f2 (x); + if (__builtin_memcmp (&y, &z, sizeof (y)) != 0) + __builtin_abort (); + z = f3 (x, y); + if (__builtin_memcmp (&y, &z, sizeof (y)) != 0) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-vect-generic.c b/gcc/tree-vect-generic.c index d8b220001661..2ca19f04abcb 100644 --- a/gcc/tree-vect-generic.c +++ b/gcc/tree-vect-generic.c @@ -971,7 +971,8 @@ expand_vector_operation (gimple_stmt_iterator *gsi, tree type, tree compute_type if (!optimize || !VECTOR_INTEGER_TYPE_P (type) - || TREE_CODE (rhs2) != VECTOR_CST) + || TREE_CODE (rhs2) != VECTOR_CST + || !VECTOR_MODE_P (TYPE_MODE (type))) break; ret = expand_vector_divmod (gsi, type, rhs1, rhs2, code);