This fixes a recent code quality regression for targets that do not
require the strict alignment of memory accesses: the compiler would
generate a useless temporary for a slice of an array component in an
overaligned record type.
Running these commands:
gcc -c p.adb -gnatws -gnatD
grep loop p.adb.dg
On the following sources:
procedure P (N : Positive) is
type Rec1 is record
I : Integer;
end record;
type Arr is array (Positive range <>) of Rec1;
type Rec2 is record
A : Arr (1 .. 128);
end record;
for Rec2'Alignment use 8;
procedure Proc (A : Arr) is
begin
null;
end;
R : Rec2;
begin
Proc (R.A (1 .. N));
end;
Should execute silently.
2019-09-19 Eric Botcazou <ebotcazou@adacore.com>
gcc/ada/
* exp_util.adb (Is_Possibly_Unaligned_Slice): Do not return true
on pure alignment considerations if the target does not require
the strict alignment of memory accesses.
From-SVN: r275956
+2019-09-19 Eric Botcazou <ebotcazou@adacore.com>
+
+ * exp_util.adb (Is_Possibly_Unaligned_Slice): Do not return true
+ on pure alignment considerations if the target does not require
+ the strict alignment of memory accesses.
+
2019-09-19 Eric Botcazou <ebotcazou@adacore.com>
* sem_ch12.adb (Check_Private_View): Add a comment to indicate
-- We are definitely in trouble if the record in question
-- has an alignment, and either we know this alignment is
-- inconsistent with the alignment of the slice, or we don't
- -- know what the alignment of the slice should be.
+ -- know what the alignment of the slice should be. But this
+ -- really matters only if the target has strict alignment.
- if Known_Alignment (Ptyp)
+ if Target_Strict_Alignment
+ and then Known_Alignment (Ptyp)
and then (Unknown_Alignment (Styp)
or else Alignment (Styp) > Alignment (Ptyp))
then