Earlier quoted context omitted.
>It seems that the most efficient thing with %eax is not to mention it in an instruction. I think what you're missing is that UB is a property of the execution of the program , and not just of the code that was compiled. If in practice the if branch is always taken, then there is NO undefined behavior (surprisingly, perhaps)! That means GCC has to be prepared to handle that case, and has to set eax to 0 when the if b…
No, I mean the behavior is undefined in that case when the function returns the indeterminate value, which was initialized anyway. Look, GCC (what I have here: 7.3.0) is doing this even for the following trivial function: int undef(void) { int ret; return ret; } With -O2 this turns out: xorl %eax, %eax ret do we still know until run-time that this has UB?
You're absolutely right that in this case, it's wasteful. In fact, if you try Clang you will see that it only emits a ret.
Maybe GCC is doing you a courtesy (or maybe nobody taught it to completely omit an Undef return value, so it just picks zero!). Either way, it's unconditionally UB, GCC can do whatever it likes.
>do we still know until run-time that this has UB?
Well, there is no branch here, is there? I'm clearly not going to disagree with you on this one =]
To be clear: UB is still a property of the execution of the program, but here it's not hard to statically determine that all executions of this program are Undefined Behavior.