aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorMarc Glisse <marc.glisse@inria.fr>2017-05-25 10:45:48 +0200
committerMarc Glisse <glisse@gcc.gnu.org>2017-05-25 08:45:48 +0000
commit11d6b45d431b0aa30cf5ce3941b01ba4fd342af5 (patch)
tree30846871027092d0e1d084d5e2b5812c8c5e3518 /gcc/tree.c
parent10bc8017a3028c291e7b85486bc66bfc12b5f377 (diff)
downloadgcc-11d6b45d431b0aa30cf5ce3941b01ba4fd342af5.zip
gcc-11d6b45d431b0aa30cf5ce3941b01ba4fd342af5.tar.gz
gcc-11d6b45d431b0aa30cf5ce3941b01ba4fd342af5.tar.bz2
Allow some NOP conversions in (X+CST1)+CST2 in match.pd
2017-05-25 Marc Glisse <marc.glisse@inria.fr> gcc/ * match.pd ((A +- CST1) +- CST2): Allow some conversions. * tree.c (drop_tree_overflow): Handle COMPLEX_CST and VECTOR_CST. gcc/testsuite/ * gcc.dg/tree-ssa/addadd.c: New file. From-SVN: r248448
Diffstat (limited to 'gcc/tree.c')
-rw-r--r--gcc/tree.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index db31620..a58f9aa 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -13138,6 +13138,25 @@ drop_tree_overflow (tree t)
and drop the flag. */
t = copy_node (t);
TREE_OVERFLOW (t) = 0;
+
+ /* For constants that contain nested constants, drop the flag
+ from those as well. */
+ if (TREE_CODE (t) == COMPLEX_CST)
+ {
+ if (TREE_OVERFLOW (TREE_REALPART (t)))
+ TREE_REALPART (t) = drop_tree_overflow (TREE_REALPART (t));
+ if (TREE_OVERFLOW (TREE_IMAGPART (t)))
+ TREE_IMAGPART (t) = drop_tree_overflow (TREE_IMAGPART (t));
+ }
+ if (TREE_CODE (t) == VECTOR_CST)
+ {
+ for (unsigned i = 0; i < VECTOR_CST_NELTS (t); ++i)
+ {
+ tree& elt = VECTOR_CST_ELT (t, i);
+ if (TREE_OVERFLOW (elt))
+ elt = drop_tree_overflow (elt);
+ }
+ }
return t;
}