Skip to content

[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

Closed
wants to merge 4 commits into from

Conversation

kripken
Copy link
Member

@kripken kripken commented May 15, 2025

Define aliases for their types, allowing users to do things like

makeIf(.., .., CodeAnnotation::BranchLikely(true))

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

@kripken kripken requested a review from tlively May 15, 2025 20:28
// add constant memory overhead.
struct CodeAnnotation {
// Branch Hinting proposal: Whether the branch is likely, or unlikely.
using BranchLikely = std::optional<bool>;
Copy link
Member

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.

Copy link
Member Author

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..? 😉

Copy link
Member

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.

Copy link
Member Author

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?

Copy link
Member

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.

Copy link
Member Author

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.

@kripken kripken closed this May 15, 2025
@kripken kripken deleted the nfc branch May 15, 2025 23:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants