public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-8892] Fix recent thinko in operand_equal_p
@ 2022-11-04 14:17 Eric Botcazou
0 siblings, 0 replies; only message in thread
From: Eric Botcazou @ 2022-11-04 14:17 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:33561e870dc48966e8c7ede46e95032279a15423
commit r12-8892-g33561e870dc48966e8c7ede46e95032279a15423
Author: Eric Botcazou <ebotcazou@adacore.com>
Date: Fri Nov 4 11:23:12 2022 +0100
Fix recent thinko in operand_equal_p
There is a thinko in a recent improvement made to operand_equal_p where
the code just looks at operand 2 of COMPONENT_REF, if it is present, to
compare addresses. That's wrong because operand 2 contains the number of
DECL_OFFSET_ALIGN-bit-sized words so, when DECL_OFFSET_ALIGN > 8, not all
the bytes are included and some of them are in DECL_FIELD_BIT_OFFSET, see
get_inner_reference for the model computation.
In other words, you would need to compare operand 2 and DECL_OFFSET_ALIGN
and DECL_FIELD_BIT_OFFSET in this situation, but I'm not sure this is worth
the hassle in practice so the fix just removes this alternate handling.
gcc/
* fold-const.cc (operand_compare::operand_equal_p) <COMPONENT_REF>:
Do not take into account operand 2.
(operand_compare::hash_operand) <COMPONENT_REF>: Likewise.
gcc/testsuite/
* gnat.dg/opt99.adb: New test.
* gnat.dg/opt99_pkg1.ads, gnat.dg/opt99_pkg1.adb: New helper.
* gnat.dg/opt99_pkg2.ads: Likewise.
Diff:
---
gcc/fold-const.cc | 18 ++++--------------
gcc/testsuite/gnat.dg/opt99.adb | 15 +++++++++++++++
gcc/testsuite/gnat.dg/opt99_pkg1.adb | 10 ++++++++++
gcc/testsuite/gnat.dg/opt99_pkg1.ads | 19 +++++++++++++++++++
gcc/testsuite/gnat.dg/opt99_pkg2.ads | 13 +++++++++++++
5 files changed, 61 insertions(+), 14 deletions(-)
diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
index 948e13a22d8..eec4c1820ed 100644
--- a/gcc/fold-const.cc
+++ b/gcc/fold-const.cc
@@ -3351,9 +3351,6 @@ operand_compare::operand_equal_p (const_tree arg0, const_tree arg1,
if (compare_address
&& (flags & OEP_ADDRESS_OF_SAME_FIELD) == 0)
{
- if (TREE_OPERAND (arg0, 2)
- || TREE_OPERAND (arg1, 2))
- return OP_SAME_WITH_NULL (2);
tree field0 = TREE_OPERAND (arg0, 1);
tree field1 = TREE_OPERAND (arg1, 1);
@@ -3864,17 +3861,10 @@ operand_compare::hash_operand (const_tree t, inchash::hash &hstate,
if (sflags & OEP_ADDRESS_OF)
{
hash_operand (TREE_OPERAND (t, 0), hstate, flags);
- if (TREE_OPERAND (t, 2))
- hash_operand (TREE_OPERAND (t, 2), hstate,
- flags & ~OEP_ADDRESS_OF);
- else
- {
- tree field = TREE_OPERAND (t, 1);
- hash_operand (DECL_FIELD_OFFSET (field),
- hstate, flags & ~OEP_ADDRESS_OF);
- hash_operand (DECL_FIELD_BIT_OFFSET (field),
- hstate, flags & ~OEP_ADDRESS_OF);
- }
+ hash_operand (DECL_FIELD_OFFSET (TREE_OPERAND (t, 1)),
+ hstate, flags & ~OEP_ADDRESS_OF);
+ hash_operand (DECL_FIELD_BIT_OFFSET (TREE_OPERAND (t, 1)),
+ hstate, flags & ~OEP_ADDRESS_OF);
return;
}
break;
diff --git a/gcc/testsuite/gnat.dg/opt99.adb b/gcc/testsuite/gnat.dg/opt99.adb
new file mode 100644
index 00000000000..8805d47c122
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/opt99.adb
@@ -0,0 +1,15 @@
+-- { dg-do run }
+-- { dg-options "-O" }
+
+with Opt99_Pkg1; use Opt99_Pkg1;
+
+procedure Opt99 is
+ C : constant My_Character := (D => True, C => ' ');
+ D : Derived;
+
+begin
+ Set (D, C, C);
+ if not D.C2.D then
+ raise Program_Error;
+ end if;
+end;
diff --git a/gcc/testsuite/gnat.dg/opt99_pkg1.adb b/gcc/testsuite/gnat.dg/opt99_pkg1.adb
new file mode 100644
index 00000000000..476b09c9524
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/opt99_pkg1.adb
@@ -0,0 +1,10 @@
+package body Opt99_Pkg1 is
+
+ procedure Set (D: in out Derived; C1, C2 : My_Character) is
+ begin
+ D.I := 0;
+ D.C1 := C1;
+ D.C2 := C2;
+ end;
+
+end Opt99_Pkg1;
diff --git a/gcc/testsuite/gnat.dg/opt99_pkg1.ads b/gcc/testsuite/gnat.dg/opt99_pkg1.ads
new file mode 100644
index 00000000000..3e265616d14
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/opt99_pkg1.ads
@@ -0,0 +1,19 @@
+with Opt99_Pkg2;
+
+package Opt99_Pkg1 is
+
+ type My_Character (D : Boolean := False) is record
+ case D is
+ when False => null;
+ when True => C : Character;
+ end case;
+ end record;
+
+ type Derived is new Opt99_Pkg2.Root with record
+ I : Integer;
+ C1, C2 : My_Character;
+ end record;
+
+ procedure Set (D: in out Derived; C1, C2 : My_Character);
+
+end Opt99_Pkg1;
diff --git a/gcc/testsuite/gnat.dg/opt99_pkg2.ads b/gcc/testsuite/gnat.dg/opt99_pkg2.ads
new file mode 100644
index 00000000000..09aaff14e01
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/opt99_pkg2.ads
@@ -0,0 +1,13 @@
+package Opt99_Pkg2 is
+
+ function Get_Max return Positive is (4);
+
+ C : constant Positive := Get_Max;
+
+ type Arr is array (1 .. C) of Integer;
+
+ type Root is tagged record
+ Data : Arr;
+ end record;
+
+end Opt99_Pkg2;
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-11-04 14:17 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-04 14:17 [gcc r12-8892] Fix recent thinko in operand_equal_p Eric Botcazou
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).