-
Notifications
You must be signed in to change notification settings - Fork 786
[NFC] Refactor code annotations to make using them easier #7599
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
// add constant memory overhead. | ||
struct CodeAnnotation { | ||
// Branch Hinting proposal: Whether the branch is likely, or unlikely. | ||
using BranchLikely = std::optional<bool>; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think these type aliases are beneficial. Users of BranchLikely
still need to know that it is actually a std::optional<bool>
, so hiding that fact from them just introduces more friction. If we do want to introduce a new type name here, using a three-state enum is probably the way to go. Same for Inline
below.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I agree users need to know likely is a bool and inline is an int. But I am trying to help in this way:
// ugly "true" - what is it?
makeIf(condition, arm, true);
// comment... slightly better, but easy to forget
makeIf(condition, arm, true /* likely */);
// type - much nicer
makeIf(condition, arm, BranchLikely(true));
(Maybe an enforced type would be even better?)
If we do want to introduce a new type name here, using a three-state enum is probably the way to go. Same for Inline below
For Inline, a 129-state enum..? 😉
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How about using enum BranchLikeliness { Unlikely, Likely };
and a wrapper type with an explicit constructor:
struct InlineHint {
uint8_t value;
explicit Inline(uint8_t value) : value(value) {}
);
Then for the parameters in IRBuilder use std::optional<BranchLikeliness>
and std::optional<InlineHint>
. That puts the optionality where it belongs and makes call sites more readable.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The optionality is also needed in CodeAnnotation itself, not just as call params, since each hint is optional when stored (as appearing in the code before this PR). So we could have BranchLikeliness and InlineHint as you suggested - those look good - but we should also have a nice name for the optional of each of those, given the multiple uses in multiple places... and I don't have a good name idea for them?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would just continue using std::optional
explicitly wherever they need to be stored optionally. I generally don't think introducing a new name to avoid writing std::optional
is a good trade off.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair enough. In that case, I'm not sure this PR is needed. I'll close it for now - maybe when we start using annotations in more places in the code, we'll have further thoughts on how to improve.
Define aliases for their types, allowing users to do things like
Also move this outside of Function. Annotations can, in principle,
appear on things outside of functions (e.g. code in globals, though
no use exists yet), and also this avoids extra typing of
Function::
edit: diff without whitespace is smaller