]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix misoptimization at -O2 in LTO mode
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 19 Mar 2025 07:55:04 +0000 (08:55 +0100)
committerEric Botcazou <ebotcazou@adacore.com>
Wed, 19 Mar 2025 07:56:51 +0000 (08:56 +0100)
This is a regression in recent releases. The problem is that the IPA mod/ref
pass looks through the (nominal) type of a pointer-to-discriminated-type
parameter in a call to a subprogram in order to see the (actual) type used
for the dereferences of the parameter in the callee, which is a
pointer-to-constrained-subtype.

Historically the discriminated type is marked with the may_alias attribute
because of the symmetric effect for the argument in the caller, so we mark
the constrained subtype with the attribute now for the sake of the callee.

gcc/ada/
* gcc-interface/decl.cc (gnat_to_gnu_entity) <E_Record_Subtype>: Set
the may_alias attribute if a specific GCC type is built.

gcc/ada/gcc-interface/decl.cc

index 1854c587543d4d45da3c0dc1f04d1f919521db32..1694b4eb1065f3162be614d22b9d0b6bfb3c8d25 100644 (file)
@@ -3651,6 +3651,14 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, bool definition)
              TYPE_PACKED (gnu_type) = TYPE_PACKED (gnu_base_type);
              TYPE_REVERSE_STORAGE_ORDER (gnu_type)
                = Reverse_Storage_Order (gnat_entity);
+
+             /* Do the same for subtypes as for the base type, since pointers
+                to them may symmetrically also point to the latter.  */
+             prepend_one_attribute
+               (&attr_list, ATTR_MACHINE_ATTRIBUTE,
+                get_identifier ("may_alias"), NULL_TREE,
+                gnat_entity);
+
              process_attributes (&gnu_type, &attr_list, true, gnat_entity);
 
              /* Set the size, alignment and alias set of the type to match