[Bug tree-optimization/106822] "Boolean-or" optimization opportunity not consistently used
benjamin.meier70 at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sat Sep 3 23:55:41 GMT 2022
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106822
--- Comment #3 from Benjamin B. Meier <benjamin.meier70 at gmail dot com> ---
> The reason for the difference is because in the case where there is an int in the structure, the alignment is 4 bytes so a 2 or 4 byte read for a and b will not cause an fault while in the first case where there is no int, the alignment is 1 and might cause a fault. Gcc is conservative here on doing the optimization.
Okay, got it. The alignment actually makes a difference here. Thanks, for the
explanation.
> Also || is a short cutting or in c so I don't think this optimization can be done for the original case in a well defined way.
I see that as well, however reading the right hand side expression of the
||-operator has in this case no observable side-effect. Plus if we know that
s->a can be read, we know as well that s cannot be a NULL pointer. Given that,
I would assume the optimization should be valid (and applied).
Another supporting argument for ignoring the short cutting behavior is the
version of "MyStruct" with "int x;": In this case the compiler also always
reads both operands (and therefore ignores the short cut).
So if the compiler uses a nice optimization without jumps if it knows the
alignment is at least 2 bytes, it probably could also use an optimization for
the case that the alignment is only 1 byte. A possible optimization would then
look like the code of f2.
Finally, it's nothing really important, but I still do not yet completely see
why optimizing the jump away in f is an issue:)
More information about the Gcc-bugs
mailing list