From 2cc9c84cec08397ae07264e07e393b9a708a3c4d Mon Sep 17 00:00:00 2001 From: glisse Date: Mon, 29 Oct 2012 17:16:51 +0000 Subject: [PATCH] 2012-10-29 Marc Glisse PR middle-end/55027 gcc/ * tree.c (real_zerop, real_onep, real_twop, real_minus_onep): Handle VECTOR_CST. testsuite/ * gcc.dg/pr55027.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192954 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 +++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.dg/pr55027.c | 12 +++++ gcc/tree.c | 100 +++++++++++++++++++++++++++++++---------- 4 files changed, 99 insertions(+), 24 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr55027.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3f5fe290b1f..4f146736a71 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-10-29 Marc Glisse + + PR middle-end/55027 + * tree.c (real_zerop, real_onep, real_twop, real_minus_onep): + Handle VECTOR_CST. + 2012-10-29 Vladimir Makarov * rtlanal.c (strip_address_mutation): Use SUBREG_REG instead of diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8878dcc8f6f..0c0124d4f1a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-10-29 Marc Glisse + + PR middle-end/55027 + * gcc.dg/pr55027.c: New testcase. + 2012-10-29 Jan Hubicka * gcc.dg/ipa/inline-6.c: New testcase. diff --git a/gcc/testsuite/gcc.dg/pr55027.c b/gcc/testsuite/gcc.dg/pr55027.c new file mode 100644 index 00000000000..e72b8fc03dc --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr55027.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-Ofast -fdump-tree-optimized-raw" } */ + +typedef double v2df __attribute__ ((__vector_size__ (2 * sizeof (double)))); + +void f (v2df *x) +{ + *x = 0 + 1 * *x; +} + +/* { dg-final { scan-tree-dump-not "gimple_assign" "optimized" } } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ diff --git a/gcc/tree.c b/gcc/tree.c index c3642e3cc35..a671aed236e 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -1992,12 +1992,25 @@ real_zerop (const_tree expr) { STRIP_NOPS (expr); - return ((TREE_CODE (expr) == REAL_CST - && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst0) - && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr))))) - || (TREE_CODE (expr) == COMPLEX_CST - && real_zerop (TREE_REALPART (expr)) - && real_zerop (TREE_IMAGPART (expr)))); + switch (TREE_CODE (expr)) + { + case REAL_CST: + return REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst0) + && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))); + case COMPLEX_CST: + return real_zerop (TREE_REALPART (expr)) + && real_zerop (TREE_IMAGPART (expr)); + case VECTOR_CST: + { + unsigned i; + for (i = 0; i < VECTOR_CST_NELTS (expr); ++i) + if (!real_zerop (VECTOR_CST_ELT (expr, i))) + return false; + return true; + } + default: + return false; + } } /* Return 1 if EXPR is the real constant one in real or complex form. @@ -2009,12 +2022,25 @@ real_onep (const_tree expr) { STRIP_NOPS (expr); - return ((TREE_CODE (expr) == REAL_CST - && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst1) - && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr))))) - || (TREE_CODE (expr) == COMPLEX_CST - && real_onep (TREE_REALPART (expr)) - && real_zerop (TREE_IMAGPART (expr)))); + switch (TREE_CODE (expr)) + { + case REAL_CST: + return REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst1) + && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))); + case COMPLEX_CST: + return real_onep (TREE_REALPART (expr)) + && real_zerop (TREE_IMAGPART (expr)); + case VECTOR_CST: + { + unsigned i; + for (i = 0; i < VECTOR_CST_NELTS (expr); ++i) + if (!real_onep (VECTOR_CST_ELT (expr, i))) + return false; + return true; + } + default: + return false; + } } /* Return 1 if EXPR is the real constant two. Trailing zeroes matter @@ -2025,12 +2051,25 @@ real_twop (const_tree expr) { STRIP_NOPS (expr); - return ((TREE_CODE (expr) == REAL_CST - && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst2) - && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr))))) - || (TREE_CODE (expr) == COMPLEX_CST - && real_twop (TREE_REALPART (expr)) - && real_zerop (TREE_IMAGPART (expr)))); + switch (TREE_CODE (expr)) + { + case REAL_CST: + return REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconst2) + && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))); + case COMPLEX_CST: + return real_twop (TREE_REALPART (expr)) + && real_zerop (TREE_IMAGPART (expr)); + case VECTOR_CST: + { + unsigned i; + for (i = 0; i < VECTOR_CST_NELTS (expr); ++i) + if (!real_twop (VECTOR_CST_ELT (expr, i))) + return false; + return true; + } + default: + return false; + } } /* Return 1 if EXPR is the real constant minus one. Trailing zeroes @@ -2041,12 +2080,25 @@ real_minus_onep (const_tree expr) { STRIP_NOPS (expr); - return ((TREE_CODE (expr) == REAL_CST - && REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconstm1) - && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr))))) - || (TREE_CODE (expr) == COMPLEX_CST - && real_minus_onep (TREE_REALPART (expr)) - && real_zerop (TREE_IMAGPART (expr)))); + switch (TREE_CODE (expr)) + { + case REAL_CST: + return REAL_VALUES_EQUAL (TREE_REAL_CST (expr), dconstm1) + && !(DECIMAL_FLOAT_MODE_P (TYPE_MODE (TREE_TYPE (expr)))); + case COMPLEX_CST: + return real_minus_onep (TREE_REALPART (expr)) + && real_zerop (TREE_IMAGPART (expr)); + case VECTOR_CST: + { + unsigned i; + for (i = 0; i < VECTOR_CST_NELTS (expr); ++i) + if (!real_minus_onep (VECTOR_CST_ELT (expr, i))) + return false; + return true; + } + default: + return false; + } } /* Nonzero if EXP is a constant or a cast of a constant. */ -- 2.11.0