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: