cgen: better code generation for .noreturn
calls
#1288
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Improve C code generation for
.noreturn
calls, by omitting theunnecessary error flag check for them.
Details
If a procedure only returns due to exceptional unwinding, the
if(NIM_UNLIKELY(*nimErr_))
guard guarding the unwinding isunnecessary, since it's guaranteed that the error flag is set (all
exits of the procedure are due to exceptional unwinding).
Unconditionally jumping to the error handling target makes it clear
to the C compiler that control-flow doesn't continue normally after
the call
Other improvements
In addition, the
canRaiseConservative
usage is unnecessary too, sincea
cnkCheckedCall
already signals that the call can raise. Theprocedure has no more users and is thus removed.
Finally, for compilers that support it, a call to a
.noreturn
procedure that doesn't raise is now followed by an
__assume(0)
statement, communicating to the C compiler that control-flow never
returns to the caller.