public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Eric Botcazou <ebotcazou@adacore.com>
To: gcc-patches@gcc.gnu.org
Subject: Fix ICE with scalar_storage_order attribute at -O
Date: Fri, 09 Feb 2018 09:50:00 -0000	[thread overview]
Message-ID: <1832183.4RgaH2jVQo@polaris> (raw)

[-- Attachment #1: Type: text/plain, Size: 753 bytes --]

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

[-- Attachment #2: p.diff --]
[-- Type: text/x-patch, Size: 431 bytes --]

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.  */

[-- Attachment #3: sso8_pkg.ads --]
[-- Type: text/x-adasrc, Size: 785 bytes --]

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;

[-- Attachment #4: sso8.adb --]
[-- Type: text/x-adasrc, Size: 257 bytes --]

-- { 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;

                 reply	other threads:[~2018-02-09  9:50 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1832183.4RgaH2jVQo@polaris \
    --to=ebotcazou@adacore.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).