diff options
author | Bob Duff <duff@adacore.com> | 2022-09-27 12:10:21 -0400 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2022-10-06 11:22:48 +0200 |
commit | 7d8ba0c67cfb68e3a7806b30c3075d06e8feeb7c (patch) | |
tree | a0bcf0283aec262eb299d2705d4b1efadb36e4fe /gcc/ada/exp_ch5.adb | |
parent | 86b786dc7295f6288296abb38d05572c3f98a758 (diff) | |
download | gcc-7d8ba0c67cfb68e3a7806b30c3075d06e8feeb7c.zip gcc-7d8ba0c67cfb68e3a7806b30c3075d06e8feeb7c.tar.gz gcc-7d8ba0c67cfb68e3a7806b30c3075d06e8feeb7c.tar.bz2 |
ada: Disable slice-of-component optimization in some cases
This patch disables the Fast_Copy_Bitfield optimization in certain rare
cases that currently do not work (crash in gigi). We could improve
Expand_Assign_Array_Bitfield_Fast to handle these cases properly, but
that change is delicate, so for now, we simply disable the optimization.
gcc/ada/
* exp_ch5.adb
(Expand_Assign_Array_Loop_Or_Bitfield): Disable the
Fast_Copy_Bitfield optimization in certain cases.
Diffstat (limited to 'gcc/ada/exp_ch5.adb')
-rw-r--r-- | gcc/ada/exp_ch5.adb | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/gcc/ada/exp_ch5.adb b/gcc/ada/exp_ch5.adb index 209741c..9669737 100644 --- a/gcc/ada/exp_ch5.adb +++ b/gcc/ada/exp_ch5.adb @@ -1660,6 +1660,15 @@ package body Exp_Ch5 is return False; end Volatile_Or_Independent; + function Slice_Of_Packed_Component (L : Node_Id) return Boolean is + (Nkind (L) = N_Slice + and then Nkind (Prefix (L)) = N_Indexed_Component + and then Is_Bit_Packed_Array (Etype (Prefix (Prefix (L))))); + -- L is the left-hand side Name. Returns True if L is a slice of a + -- component of a bit-packed array. The optimization is disabled in + -- that case, because Expand_Assign_Array_Bitfield_Fast cannot + -- currently handle that case correctly. + L : constant Node_Id := Name (N); R : constant Node_Id := Expression (N); -- Left- and right-hand sides of the assignment statement @@ -1681,6 +1690,7 @@ package body Exp_Ch5 is and then not Reverse_Storage_Order (R_Type) and then Ndim = 1 and then Slices + and then not Slice_Of_Packed_Component (L) and then not Volatile_Or_Independent (L, L_Type) and then not Volatile_Or_Independent (R, R_Type) then |