This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] C undefined behavior fix



On Mon, 7 Jan 2002, mike stump wrote:
>
> Any expansive text on volatile will cover it.  We can see some of the
> bits of it from a C c99 working draft:

Note that if we start using "volatile", then gcc really _has_ to improve
its code generation here. Quite frankly, as it is, "volatile" absolutely
_sucks_ code-generation-wise.

Just as an example, look at your two "hide()" functions:

	#define hide(x) ({ void *vp = x; asm ("" : "+r" (vp)); vp; })

	inline void *hide(void *vp) { void *volatile v; v = vp; return v; }

I already sent out an example of why the "asm" thing generates suboptimal
code, because it forgets the value and is unable to use the knowledge.
However, with "volatile", the code generated _really_ sucks.

Here's the code for the "asm" version of ((*(int *)(0x10000+hide(i)):

	movl    $i, %eax
	movl    65536(%eax), %eax

and here's the code that gcc generates from the "volatile" inline
function:

        movl    $i, %eax
        movl    %eax, (%esp)
        movl    (%esp), %eax
        movl    65536(%eax), %eax

which is just not acceptable for any real use.

		Linus


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]