On 11/4/19 4:24 PM, Jeff Law wrote:
On 11/4/19 6:36 AM, Richard Biener wrote:
On Mon, Nov 4, 2019 at 2:35 PM Richard Biener
<richard.guent...@gmail.com> wrote:
On Mon, Nov 4, 2019 at 10:09 AM Martin Liška <mli...@suse.cz> wrote:
On 11/1/19 10:51 PM, Jeff Law wrote:
On 10/31/19 10:01 AM, Martin Liška wrote:
Hi.
operand_equal_p can properly handle situation where we have a CONSTRUCTOR
where indices are NULL:
if (!operand_equal_p (c0->value, c1->value, flags)
/* In GIMPLE the indexes can be either NULL or matching i.
Double check this so we won't get false
positives for GENERIC. */
|| (c0->index
&& (TREE_CODE (c0->index) != INTEGER_CST
|| compare_tree_int (c0->index, i)))
|| (c1->index
&& (TREE_CODE (c1->index) != INTEGER_CST
|| compare_tree_int (c1->index, i))))
return false;
but the corresponding hash function always hashes field (which
can be NULL_TREE or equal to ctor index).
Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
Ready to be installed?
Thanks,
Martin
gcc/ChangeLog:
2019-10-31 Martin Liska <mli...@suse.cz>
PR ipa/92304
* fold-const.c (operand_compare::hash_operand): Fix field
hashing of CONSTRUCTOR.
OK. One question though, do these routines need to handle
CONSTRUCTOR_NO_CLEARING?
Good point, but I bet it's just a flag used in GENERIC, right?
Yes. It matters for gimplification only. I don't think we can
optimistically make use of it in operand_equal_p.
OTOH for GENERIC and sth like ICF the flags have to match.
Precisely my concern. I'm not immediately aware of any case where it
matters, but it'd be nice to future proof this if we can.
jeff
Sure, I've got the following tested patch.
Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
Ready to be installed?
Thanks,
Martin
>From 2302c15cb2568bc71b4b7bc3abbfd66aafc7c06c Mon Sep 17 00:00:00 2001
From: Martin Liska <mli...@suse.cz>
Date: Mon, 4 Nov 2019 15:39:40 +0100
Subject: [PATCH] Add CONSTRUCTOR_NO_CLEARING to operand_equal_p.
gcc/ChangeLog:
2019-11-04 Martin Liska <mli...@suse.cz>
* fold-const.c (operand_compare::operand_equal_p): Add comparison
of CONSTRUCTOR_NO_CLEARING.
(operand_compare::hash_operand): Likewise.
---
gcc/fold-const.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 1e25859a707..a1f80b91cce 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -3475,6 +3475,9 @@ operand_compare::operand_equal_p (const_tree arg0, const_tree arg1,
case tcc_exceptional:
if (TREE_CODE (arg0) == CONSTRUCTOR)
{
+ if (CONSTRUCTOR_NO_CLEARING (arg0) != CONSTRUCTOR_NO_CLEARING (arg1))
+ return false;
+
/* In GIMPLE constructors are used only to build vectors from
elements. Individual elements in the constructor must be
indexed in increasing order and form an initial sequence.
@@ -3657,6 +3660,7 @@ operand_compare::hash_operand (const_tree t, inchash::hash &hstate,
unsigned HOST_WIDE_INT idx;
tree field, value;
flags &= ~OEP_ADDRESS_OF;
+ hstate.add_int (CONSTRUCTOR_NO_CLEARING (t));
FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), idx, field, value)
{
/* In GIMPLE the indexes can be either NULL or matching i. */
--
2.23.0