This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug ada/37604] New: Suboptimal code generation for volatile access
- From: "sam at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 20 Sep 2008 20:13:45 -0000
- Subject: [Bug ada/37604] New: Suboptimal code generation for volatile access
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
The following code generates suboptimal code on i686-pc-linux-gnu:
with Interfaces; use Interfaces;
with System.Storage_Elements;
package A is
Var : unsigned_8;
for Var'Address use System.Storage_Elements.To_Address (1000);
pragma Volatile (Var);
end A;
with A;
with Interfaces; use Interfaces;
procedure U is
begin
A.Var := A.Var or 1;
A.Var := A.Var or 2;
end U;
With -O3 -fomit-frame-pointer, we get:
_ada_u:
movl a__var, %edx <=== indirection instead of...
movzbl (%edx), %eax <=== ...direct access here
orl $1, %eax
movb %al, (%edx)
movl a__var, %edx <=== useless reloading of a__var
movzbl (%edx), %eax
orl $2, %eax
movb %al, (%edx)
ret
If the variable is declared in the same compilation unit, we get:
_ada_u:
movzbl 1000, %eax
orl $1, %eax
movb %al, 1000
movzbl 1000, %eax
orl $2, %eax
movb %al, 1000
ret
We should probably get the same code in both cases.
--
Summary: Suboptimal code generation for volatile access
Product: gcc
Version: 4.4.0
Status: UNCONFIRMED
Keywords: missed-optimization
Severity: normal
Priority: P3
Component: ada
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: sam at gcc dot gnu dot org
GCC host triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37604