Re: compile warning - Mailing list pgsql-hackers

From Andrew Dunstan
Subject Re: compile warning
Date
Msg-id 3F870786.3030309@dunslane.net
Whole thread Raw
In response to Re: compile warning  (Bruce Momjian <pgman@candle.pha.pa.us>)
Responses Re: compile warning
List pgsql-hackers
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
compilermake 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
takea 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
tcphdrhdr;       __u32         words[5];   };
 
   #define tcp_flag_word(tp) ( ((union tcp_word_hdr *)(tp))->words [3])


   Maybe this gives us a clue.
   cheers
   andrew



pgsql-hackers by date:

Previous
From: Andrew Sullivan
Date:
Subject: Re: 2-phase commit
Next
From: Satoshi Nagayasu
Date:
Subject: Re: 2-phase commit