"Andrew Dunstan" <[EMAIL PROTECTED]> writes:icc once compiled the kernel. But they had to teach it quite a lots of gccisms.
Of course, the linux kernel is aimed at a limited set of compilers - as I understand it basically gcc although it has been made to build with Intel compilers
Intel's icc compiler supports strict alias analysis, but the default was off.- which makes things somewhat easier for them. What is our target
set of compilers? What is our target version of C?
"Pretty much anything that speaks ANSI C" is my usual feeling about
that. As yet we have not heard of any non-gcc compilers in which this
is a problem, although you have a point that some compiler somewhere may
do this and not have a way to turn it off :-(
gcc is quite good at propagating constants around. This is heavily used in the linux-kernel: __builtin_constant(x), and then large switch statements that are completely evaluated at compile time. There is a good chance that gcc figures out that MemSet(,0,sizeof(double)) are two writes to two integer values, and then decides that they can't alias with reads/write to the double.Also note that uninhibited casting between types can still cause alignment
We understand that issue, we solved it years ago.
BTW, I haven't looked at the problem spots in detail. How many of them
are due to the use of MemSet in conjunction with other access to a chunk
of memory? ISTM that we need not worry about code motion around a
MemSet call, since that would require the compiler to prove that the
memset() path through the macro wouldn't be affected, which I doubt it
I'll search for a suitable gcc list and post the memset macro - that might give a definitive answer.
---------------------------(end of broadcast)--------------------------- TIP 3: if posting/reading through Usenet, please send an appropriate subscribe-nomail command to [EMAIL PROTECTED] so that your message can get through to the mailing list cleanly