Article View: gnu.gcc.bug
Article #430Re: GCC 2.1 codegen bug when function is declared volatile
From: Mike Stump
Date: Wed, 15 Apr 1992 22:47
Date: Wed, 15 Apr 1992 22:47
93 lines
2823 bytes
2823 bytes
Please cite ANSI or any standard or any non-standard or any compiler
that accepts that code without complaints.
You probably cannot. If you can, it is probably a broken compiler.
If you even tried gcc with -pedantic -ansi you would get errors:
t10.c: In function `main':
t10.c:4: warning: ANSI C forbids const or volatile functions
If you remove the volatile keyword, the code works.
Please see the documentation of volatile function in the gcc
distribution for exact semantics.
> Message-Id: <9204150101.AA19311@oz.NeXT.COM>
> Date: Tue, 14 Apr 92 18:01:38 PDT
> From: Bruce_Martin@next.com
> Received: by NeXT Mailer (1.63)
> To: bug-gcc@prep.ai.mit.edu
> Subject: GCC 2.1 codegen bug when function is declared volatile
> Gcc Version: 2.1
> Configuration: i386-mach
> Reported by: Bruce Martin (Bruce_Martin@NeXT.COM)
> Description: if a function is declared volatile, gcc 2.1 produces
> completely bogus code when the optimizer is used. I'm not at all
> sure what the correct response to the following C code should be,
> but the current behavior is definitely wrong (I'm assuming that
> the lack of any error messages means that the compiler should
> succeed in the compilation).
> Things work correctly when the optimizer is not used.
> Test case:
> compiled with: cc1 -O -o foo.s foo.c
> foo.c:
> main()
> {
> volatile double result1, result2;
> volatile double one_over(double);
> do {
> result1 = one_over(12);
> result2 = one_over(12);
> } while (result1 == result2);
> exit(0);
> }
> double
> one_over( double x)
> {
> return (double)( 1.0 / x );
> }
> Result of the compilation (note the lack of any code in main to
> test the return value of one_over, or a call to exit()):
> .file "foo.c"
> gcc2_compiled.:
> .text
> .align 2
> .globl _main
> _main:
> pushl %ebp
> movl %esp,%ebp
> subl $16,%esp
> call ___main
> pushl $1076363264
> pushl $0
> call _one_over
> fstp %st(0)
> .align 2,0x90
> .align 2
> LC0:
> .double 0d1.00000000000000000000e+00
> .align 2
> .globl _one_over
> _one_over:
> pushl %ebp
> movl %esp,%ebp
> fldl LC0
> fdivl 8(%ebp)
> leave
> ret
> .align 2,0x90
Technical Details
Message-ID:
<9204152247.AA01724@cygnus.com>Path:
arc1-ca.pugleaf.net!sparky!uunet!cis.ohio-state.edu!cygnus.com!mrsShow Full Headers
Complete Article Headers
Newsgroups: gnu.gcc.bug Path: arc1-ca.pugleaf.net!sparky!uunet!cis.ohio-state.edu!cygnus.com!mrs From: mrs@cygnus.com (Mike Stump) Subject: Re: GCC 2.1 codegen bug when function is declared volatile Message-ID: <9204152247.AA01724@cygnus.com> Sender: gnulists@ai.mit.edu Organization: GNUs Not Usenet Distribution: gnu Date: Wed, 15 Apr 1992 22:47:24 GMT Approved: bug-gcc@prep.ai.mit.edu Lines: 96