Re: Question about GCC 5.2.0 and expression reordering

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

 



On 14/06/17 18:56, Andrew Haley wrote:
> On 14/06/17 17:40, David Barto wrote:
>> Thanks for that. Can you point to the relevant portion of the standard that
>> I can then quote back to my Boss who is quite concerned about this?
> 
> 1.9  Program execution  [intro.execution]
> 
> The semantic descriptions in this International Standard define a
> parameterized nondeterministic abstract machine. This International
> Standard places no requirement on the structure of conforming
> implementations.  In particular, they need not copy or emulate the
> structure of the abstract machine. Rather, conforming implementations
> are required to emulate (only) the observable behavior of the abstract
> machine as explained below.5
> 
> 5) This provision is sometimes called the “as-if” rule, because an
> implementation is free to disregard any requirement of this
> International Standard as long as the result is as if the requirement
> had been obeyed, as far as can be determined from the observable
> behavior of the program. For instance, an actual implementation need
> not evaluate part of an expression if it can deduce that its value is
> not used and that no side effects affecting the observable behavior of
> the program are produced.
> 
>> And if there is such a flag to disable the “Optimization” performed here
>> what would I enable?
> 
> I have no idea.
> 

There is "-fsched-spec-load" and "-fsched-spec-load-dangerous" that
might be relevant, but I did not think these were enabled by default.
Maybe "-fno-sched-spec" ?  "-fhoist-adjecent-loads" ?


If you need to avoid this optimisation in this one case, you can force
the "f20type == URI" to have a side effect by using a cast to volatile
(such as Linux's ACCESS_ONCE macro) on URI.

But gcc can do this sort of re-arrangement at any time, in any place.
It is fine for the compiler to do something with undefined behaviour as
long as the compiler knows what will actually happen (so it can add two
ints that overflow, but it can't dereference a null pointer), and when
the results of the undefined behaviour are not used.  In this particular
case the compiler will want to schedule reading the URI as early as
possible, so that it has made its way through caches and into the cpu
for when it is needed.




[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux