Article View: gnu.gcc.bug
Article #197optimization question
From: Robert E. Brown
Date: Fri, 24 Jul 1992 19:50
Date: Fri, 24 Jul 1992 19:50
117 lines
3170 bytes
3170 bytes
While not exactly a bug report, perhaps the lack of consistency in GCC's
output will count as a bug ...
I am machine generating a lot of C code that contains redundant stores to
global variables and GCC (versions 2.2 and 2.2.2) is not optimizing away
some of the stores that I expect it to delete. It's likely, however, that
I don't fully understand when it's possible to remove stores to global
variables that are not declared as "volatile". For instance, is it legal to
optimize the following code:
long R, A, B, C, D;
void
foo()
{
R = 0;
A = (R < 0);
B = (R == 0);
C = 0;
D = 0;
R = 1;
A = (R < 0);
B = (R == 0);
C = 0;
D = 0;
}
into assembly code that implements just
{
R = 1;
A = 0;
B = 0;
C = 0;
D = 0;
}
or does ANSI say that the compiler has to be smart about making things look
right to a signal handler that may get invoked while foo() is running?
Here's what "gcc -O -S foo.c" (gcc version 2.2.2) produces when configured for
"next" -- a 68K-based computer. This output seems to be consistent with the
desire to make the global variables consistent with respect to a signal
handler. Signals can be delivered between each pair of sequential
instructions, and the handler would not see a variable state that's
inconsistent with naive code for foo(). The compiler has deleted some stores,
however.
#NO_APP
.text
.align 1
.globl _foo
_foo:
link a6,#0
clrl _R
clrl _A
moveq #1,d0
movel d0,_B
clrl _C
clrl _D
movel d0,_R
clrl _B
unlk a6
rts
.comm _R,4
.comm _A,4
.comm _B,4
.comm _C,4
.comm _D,4
On the SPARC, "gcc -O -S foo.c" (GCC version 2.2, configured for "sparc")
produces the following code, which retains all the stores to the global
variables. Even C and D are written more than once -- and their values
definitely don't after the first store! What is the best code that GCC could
produce? Must it look like the 68K code, or can it be optimized to the
assembly code equivalent to {R=1;A=B=C=D=0}?
gcc2_compiled.:
.text
.align 4
.global _foo
.proc 020
_foo:
!#PROLOGUE# 0
save %sp,-112,%sp
!#PROLOGUE# 1
sethi %hi(_R),%i3
st %g0,[%i3+%lo(_R)]
sethi %hi(_A),%i2
st %g0,[%i2+%lo(_A)]
sethi %hi(_B),%i1
mov 1,%g2
st %g2,[%i1+%lo(_B)]
sethi %hi(_C),%i0
st %g0,[%i0+%lo(_C)]
sethi %hi(_D),%g3
st %g0,[%g3+%lo(_D)]
st %g2,[%i3+%lo(_R)]
st %g0,[%i2+%lo(_A)]
st %g0,[%i1+%lo(_B)]
st %g0,[%i0+%lo(_C)]
st %g0,[%g3+%lo(_D)]
ret
restore
.global _R
.common _R,8,"bss"
.global _A
.common _A,8,"bss"
.global _B
.common _B,8,"bss"
.global _C
.common _C,8,"bss"
.global _D
.common _D,8,"bss"
Technical Details
Message-ID:
<9207241950.AA00441@_grettir.quorum.com_>Path:
arc1-ca.pugleaf.net!sparky!uunet!usc!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!quorum.COM!brownShow Full Headers
Complete Article Headers
Newsgroups: gnu.gcc.bug Path: arc1-ca.pugleaf.net!sparky!uunet!usc!zaphod.mps.ohio-state.edu!cis.ohio-state.edu!quorum.COM!brown From: brown@quorum.COM (Robert E. Brown) Subject: optimization question Message-ID: <9207241950.AA00441@_grettir.quorum.com_> Sender: gnulists@ai.mit.edu Organization: GNUs Not Usenet Distribution: gnu Date: Fri, 24 Jul 1992 19:50:51 GMT Approved: bug-gcc@prep.ai.mit.edu Lines: 118