Messages in this thread |  | | Date | Sun, 11 Nov 2001 15:02:28 +0100 | From | Manfred Spraul <> | Subject | Re: [PATCH] take 2 of the tr-based current |
| |
Anton Blanchard wrote:
>I changed the code a bit so that get_cpu() is now inline - this >represents our situation better. I think it is valid for gcc to cache >get_cpu across a function call in the below example because it knows >that get_cpu does not refer to any global variables. > You are right: it seems that gcc internally decides if an inline function is const or pure.
static inline int get_TR(void) { int reg; __asm__ ( "rep; nop;\n\t" "xor %0,%0\n\t" : "=r" (reg)); return ret; }
is always optimized as if get_TR is a function with __attribute__((const)).
Ben, is it intentional that get_TR is _not_ marked as inline? Your version produces explicit function calls with -O2, and incorrect code with -O99 (gcc decides to inline get_TR even without an inline directive, and then optimizes away the calls after schedule.)
It seems that Anton's version generates the best code. I've tested the attached version with egcs-1.1.2, gcc-2.96-98 and gcc3-3.0.1-3, with -O0, -O2 and -O99.
-- Manfred
[unhandled content-type:application/msword] |  |