bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: GCC optimizes integer overflow: bug or feature?


From: Matthew Woehlke
Subject: Re: GCC optimizes integer overflow: bug or feature?
Date: Wed, 20 Dec 2006 10:24:37 -0600
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.8) Gecko/20061025 Thunderbird/1.5.0.8 Mnenhy/0.7.4.0

Dave Korn wrote:
On 20 December 2006 02:28, Andrew Pinski wrote:
Paul Brook wrote:
Pretty much all optimization will change the behavior of your program.

Now that's a bit TOO strong a statement, critical optimizations like
register allocation and instruction scheduling will generally not change
the behavior of the program (though the basic decision to put something
in a register will, and *surely* no one suggests avoiding this critical
optimization).

Actually they will with multi threaded program, since you can have a case
where it works and now it is broken because one thread has speed up so much
it writes to a variable which had a copy on another thread's stack. So the
argument about it being too strong is wrong because timing matters now a
days.  Instruction scheduling can cause the same issue as it forces a write
too early for another thread to act on.

Why isn't that just a buggy program with wilful disregard for the use of
correct synchronisation techniques?

Excuse me while I beat you on the head with a number of real-life examples of *lock-free* algorithms. :-) Particularly lock-free queues (google should help you find one that applies here), whose correct operation is critically dependent on the order in which the loads and stores are performed. This is a very real, entirely legitimate example where the compiler thinking it knows how to do my job better than I do is wrong.

We (in a major, commercial application) ran into exactly this issue. 'asm volatile("lock orl $0,(%%esp)"::)' is your friend when this happens (it is a barrier across which neither the compiler nor CPU will reorder things). Failing that, no-op cross-library calls (that can't be inlined) seem to do the trick.

--
Matthew
Hi! I'm a .signature virus! Copy me into your ~/.signature, please!





reply via email to

[Prev in Thread] Current Thread [Next in Thread]