Optimisations and undefined behaviour
Jeff Law
law@redhat.com
Mon Nov 9 22:29:00 GMT 2015
On 11/09/2015 03:21 PM, Vincent Lefevre wrote:
> On 2015-11-09 15:11:27 -0700, Jeff Law wrote:
>> I feel it's best to err on the side of safety here -- given a function call,
>> loops and the like, we have to consider the possibility that the statement
>> which exhibits UB may not be executed. And until that statement is
>> executed, we have no license to do anything weird.
>
> BTW, the C standard says that a function may be interrupted by a
> signal at any time. So, if some code that has a visible side effect
> appears before an UB, the program may be interrupted between this
> code and the UB so that the UB will not occur. Thus a compiler does
> not have the license to remove such code with side effect.
Yup. And again, with the way the path isolation code works it'll be
handled correctly :-) We duplicate the path up to and including the UB
statement, then transform the statement which triggers UB in that
duplicated path into a trap.
The main benefit is not in optimizing the UB path itself, but in
removing the CFG edge from the point after the statement with UB back to
the main (non-UB) control flow path. It'd be nice to remove the path
leading *to* the UB statement, but that's not correct to do.
jeff
More information about the Gcc-help
mailing list