This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix ICE with scalar_storage_order attribute at -O
- From: Eric Botcazou <ebotcazou at adacore dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 09 Feb 2018 10:50:40 +0100
- Subject: Fix ICE with scalar_storage_order attribute at -O
- Authentication-results: sourceware.org; auth=none
This is a regression present on the mainline in the form of an assertion
failure in optimize_bitfield_assignment_op with a scalar_storage_order
attribute specifying the reverse endianness wrt the native endianness.
I put this assertion because I failed to cover the path at the time but things
have changed since then and the attached testcase triggers it now (and also
checks that the generated code is correct in this case).
Tested on x86_64-suse-linux, applied on the mainline.
2018-02-09 Eric Botcazou <ebotcazou@adacore.com>
* expr.c (optimize_bitfield_assignment_op): Remove obsolete assertion.
2018-02-09 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/sso8.adb: New test.
* gnat.dg/sso8_pkg.ads: New helper.
--
Eric Botcazou
Index: expr.c
===================================================================
--- expr.c (revision 257404)
+++ expr.c (working copy)
@@ -4726,8 +4726,6 @@ optimize_bitfield_assignment_op (poly_ui
}
else if (!REG_P (str_rtx) && GET_CODE (str_rtx) != SUBREG)
return false;
- else
- gcc_assert (!reverse);
/* If the bit field covers the whole REG/MEM, store_field
will likely generate better code. */
with Interfaces;
with System;
with Unchecked_Conversion;
package SSO8_Pkg is
Val8 : Interfaces.Unsigned_8;
type Two_Bit_Int is range 0 .. 3;
for Two_Bit_Int'size use 2;
type Arr is array (1 .. 5) of Boolean;
for Arr'scalar_storage_order use System.High_Order_First;
pragma Pack (Arr);
type Rec is record
Boolean_Data : Boolean;
Array_Data : Arr;
Two_Bit_Data : Two_Bit_Int;
end record;
for Rec use record
Boolean_Data at 0 range 0 .. 0;
Array_Data at 0 range 1 .. 5;
Two_Bit_Data at 0 range 6 .. 7;
end record;
for Rec'size use 8;
for Rec'bit_order use System.High_Order_First;
for Rec'scalar_storage_order use System.High_Order_First;
function Conv is new Unchecked_Conversion (Rec, Interfaces.Unsigned_8);
end SSO8_Pkg;
-- { dg-do run }
-- { dg-options "-O" }
with Interfaces; use Interfaces;
with SSO8_Pkg; use SSO8_Pkg;
procedure SSO8 is
Data : Rec;
begin
Data.Array_Data (2) := True;
Val8 := Conv (Data);
if Val8 /= 32 then
raise Program_Error;
end if;
end;