aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2001-01-28 11:35:45 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2001-01-28 11:35:45 +0100
commit6001735ea0da3d5d89a8f249a79fc8198ff28513 (patch)
tree94c342ca0fab35fea5547deab7b00d988fa3f612 /gcc
parent666bd4e75249b156c8fa42c38f0c4edd0000ea91 (diff)
downloadgcc-6001735ea0da3d5d89a8f249a79fc8198ff28513.zip
gcc-6001735ea0da3d5d89a8f249a79fc8198ff28513.tar.gz
gcc-6001735ea0da3d5d89a8f249a79fc8198ff28513.tar.bz2
optimize.c (copy_body_r): If MODIFY_EXPR has both arguments identical and they would be replaced with...
* optimize.c (copy_body_r): If MODIFY_EXPR has both arguments identical and they would be replaced with constant, remove MODIFY_EXPR from the tree. * g++.old-deja/g++.other/inline18.C: New test. From-SVN: r39317
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/optimize.c20
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.other/inline18.C13
4 files changed, 43 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 6c2093c..3fd306d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2001-01-28 Jakub Jelinek <jakub@redhat.com>
+
+ * optimize.c (copy_body_r): If MODIFY_EXPR has both arguments
+ identical and they would be replaced with constant, remove
+ MODIFY_EXPR from the tree.
+
2001-01-27 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* Make-lang.in: Remove all dependencies on defaults.h.
diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c
index 46f1c85..7a7a27c 100644
--- a/gcc/cp/optimize.c
+++ b/gcc/cp/optimize.c
@@ -338,6 +338,26 @@ copy_body_r (tp, walk_subtrees, data)
TREE_OPERAND (*tp, 1) = TREE_OPERAND (*tp, 3);
TREE_OPERAND (*tp, 3) = NULL_TREE;
}
+ else if (TREE_CODE (*tp) == MODIFY_EXPR
+ && TREE_OPERAND (*tp, 0) == TREE_OPERAND (*tp, 1)
+ && nonstatic_local_decl_p (TREE_OPERAND (*tp, 0))
+ && DECL_CONTEXT (TREE_OPERAND (*tp, 0)) == fn)
+ {
+ /* Assignments like a = a; don't generate any rtl code
+ and don't count as variable modification. Avoid
+ keeping bogosities like 0 = 0. */
+ tree decl = TREE_OPERAND (*tp, 0), value;
+ splay_tree_node n;
+
+ n = splay_tree_lookup (id->decl_map, (splay_tree_key) decl);
+ if (n)
+ {
+ value = (tree) n->value;
+ STRIP_TYPE_NOPS (value);
+ if (TREE_CONSTANT (value) || TREE_READONLY_DECL_P (value))
+ *tp = value;
+ }
+ }
}
/* Keep iterating. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index eec04ff..edd5222 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2001-01-28 Jakub Jelinek <jakub@redhat.com>
+
+ * g++.old-deja/g++.other/inline18.C: New test.
+
2001-01-27 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.c-torture/execute/stdio-opt-2.c: Also test __builtin_puts
diff --git a/gcc/testsuite/g++.old-deja/g++.other/inline18.C b/gcc/testsuite/g++.old-deja/g++.other/inline18.C
new file mode 100644
index 0000000..263fd0e
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.other/inline18.C
@@ -0,0 +1,13 @@
+// Build don't link:
+// Origin: Jakub Jelinek <jakub@redhat.com>
+// Special g++ Options: -O3
+
+static void foo (int a)
+{
+ a = a;
+}
+
+static void bar (void)
+{
+ foo (-1);
+}