[Bug ada/37604] New: Suboptimal code generation for volatile access
sam at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Sat Sep 20 20:15:00 GMT 2008
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
More information about the Gcc-bugs
mailing list