Bruce Momjian wrote:

This seems to be a bug in gcc-3.3.1.  -fstrict-aliasing is enabled by
-O2 or higher optimization in gcc 3.3.1.

Now that I think of it, they might be talking about an optimization
called register aliasing, where they are taking the structure and
mapping it to a CPU register for some optimization, and what we are
doing is to store a different structure in there that will not fit in a
register.  A Node will fit in a register (it is only an enum) but the
TriggerData structure will not, meaning the code has to spill the
register to memory, then access the full structure, or something like
that.





Did you mean register renaming? If so, it is only turned on by -O3. But I can see that strict aliasing does help the compiler make the right guess as to which registers to use for what, even without register renaming.



http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Optimize-Options.html#Optimize%20Options says:


|-O|

|-O1|
   Optimize. Optimizing compilation takes somewhat more time, and a lot
   more memory for a large function.

   With |-O|, the compiler tries to reduce code size and execution
   time, without performing any optimizations that take a great deal of
   compilation time.

|-O| turns on the following optimization flags:

-fdefer-pop -fmerge-constants -fthread-jumps -floop-optimize -fcrossjumping -fif-conversion -fif-conversion2 -fdelayed-branch -fguess-branch-probability -fcprop-registers


   |-O| also turns on |-fomit-frame-pointer| on machines where doing so
   does not interfere with debugging.

|-O2|
   Optimize even more. GCC performs nearly all supported optimizations
   that do not involve a space-speed tradeoff. The compiler does not
   perform loop unrolling or function inlining when you specify |-O2|.
   As compared to |-O|, this option increases both compilation time and
   the performance of the generated code.

   |-O2| turns on all optimization flags specified by |-O|. It also
   turns on the following optimization flags:

-fforce-mem -foptimize-sibling-calls -fstrength-reduce -fcse-follow-jumps -fcse-skip-blocks -frerun-cse-after-loop -frerun-loop-opt -fgcse -fgcse-lm -fgcse-sm -fdelete-null-pointer-checks -fexpensive-optimizations -fregmove -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fcaller-saves -fpeephole2 -freorder-blocks -freorder-functions -fstrict-aliasing -falign-functions -falign-jumps -falign-loops -falign-labels


   Please note the warning under |-fgcse| about invoking |-O2| on
   programs that use computed gotos.

|-O3|
   Optimize yet more. |-O3| turns on all optimizations specified by
   |-O2| and also turns on the |-finline-functions| and
   |-frename-registers| options.

In the Linux kernel, you can see this in include/linux/tcp.h:

   /*
    *  The union cast uses a gcc extension to avoid aliasing problems
    *  (union is compatible to any of its members)
    *  This means this part of the code is -fstrict-aliasing safe now.
    */
   union tcp_word_hdr {
       struct tcphdr hdr;
       __u32         words[5];
   };

#define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3])



Maybe this gives us a clue.

cheers

andrew


---------------------------(end of broadcast)--------------------------- TIP 2: you can get off all lists at once with the unregister command (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to