aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/ipa-icf-gimple.c17
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/icfmatch.c11
4 files changed, 35 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index aff6fe5..9c9cc65 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-10-11 Jan Hubicka <hubicka@ucw.cz>
+
+ Revert:
+ * ipa-icf-gimple.c (func_checker::compare_operand): Compare only
+ empty constructors.
+
2015-10-16 Eric Botcazou <ebotcazou@adacore.com>
* tree.c (recompute_tree_invariant_for_addr_expr): Assert that the
diff --git a/gcc/ipa-icf-gimple.c b/gcc/ipa-icf-gimple.c
index 934ba90..4696c80 100644
--- a/gcc/ipa-icf-gimple.c
+++ b/gcc/ipa-icf-gimple.c
@@ -415,9 +415,20 @@ func_checker::compare_operand (tree t1, tree t2)
switch (TREE_CODE (t1))
{
case CONSTRUCTOR:
- gcc_assert (!vec_safe_length (CONSTRUCTOR_ELTS (t1))
- && !vec_safe_length (CONSTRUCTOR_ELTS (t2)));
- return true;
+ {
+ unsigned length1 = vec_safe_length (CONSTRUCTOR_ELTS (t1));
+ unsigned length2 = vec_safe_length (CONSTRUCTOR_ELTS (t2));
+
+ if (length1 != length2)
+ return return_false ();
+
+ for (unsigned i = 0; i < length1; i++)
+ if (!compare_operand (CONSTRUCTOR_ELT (t1, i)->value,
+ CONSTRUCTOR_ELT (t2, i)->value))
+ return return_false();
+
+ return true;
+ }
case ARRAY_REF:
case ARRAY_RANGE_REF:
/* First argument is the array, second is the index. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7d8b89f..3d5ad17 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2015-10-11 Jan Hubicka <hubicka@ucw.cz>
+
+ * gcc.c-torture/compile/icfmatch.c: Add testcase
+
2015-10-16 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/67926
diff --git a/gcc/testsuite/gcc.c-torture/compile/icfmatch.c b/gcc/testsuite/gcc.c-torture/compile/icfmatch.c
new file mode 100644
index 0000000..13aad2e
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/icfmatch.c
@@ -0,0 +1,11 @@
+typedef char __attribute__ ((vector_size (4))) v4qi;
+void retv (int a,int b,int c,int d, v4qi *ret)
+{
+ v4qi v = { a, b , c, d };
+ *ret = v;
+}
+void retv2 (int a,int b,int c,int d, v4qi *ret)
+{
+ v4qi v = { a, b , c, d };
+ *ret = v;
+}