# LLVM Code-Review Policy and Practices

LLVM’s code-review policy and practices help maintain high code quality across the project. Specifically, our code review process aims to:

> - Improve readability and maintainability.

> - Improve robustness and prevent the introduction of defects.

> - Best leverage the experience of other contributors for each proposed change.

> - Help grow and develop new contributors, through mentorship by community leaders.

It is important for all contributors to understand our code-review practices and participate in the code-review process.

## General Policies

### What Code Should Be Reviewed?

All developers are required to have significant changes reviewed before they are committed to the repository.

### Must Code Be Reviewed Prior to Being Committed?

Code can be reviewed either before it is committed or after. We expect significant patches to be reviewed before being committed. Smaller patches (or patches where the developer owns the component) that meet likely-community-consensus requirements (as apply to all patch approvals) can be committed prior to an explicit review. In situations where there is any uncertainty, a patch should be reviewed prior to being committed.

Please note that the developer responsible for a patch is also responsible for making all necessary review-related changes, including those requested during any post-commit review.

### Can Code Be Reviewed After It Is Committed?

Post-commit review is encouraged, and can be accomplished using any of the tools detailed below. There is a strong expectation that authors respond promptly to post-commit feedback and address it. Failure to do so is cause for the patch to be reverted.

If a community member expresses a concern about a recent commit, and this concern would have been significant enough to warrant a conversation during pre-commit review (including around the need for more design discussions), they may ask for a revert to the original author who is responsible to revert the patch promptly. Developers often disagree, and erring on the side of the developer asking for more review prevents any lingering disagreement over code in the tree. This does not indicate any fault from the patch author, this is inherent to our post-commit review practices. Reverting a patch ensures that design discussions can happen without blocking other development; it’s entirely possible the patch will end up being reapplied essentially as-is once concerns have been resolved.

Before being recommitted, the patch generally should undergo further review. The community member who identified the problem is expected to engage actively in the review. In cases where the problem is identified by a buildbot, a community member with access to hardware similar to that on the buildbot is expected to engage in the review.

Please note: The bar for post-commit feedback is not higher than for pre-commit feedback. Don’t delay unnecessarily in providing feedback. However, if you see something after code has been committed about which you would have commented pre-commit (had you noticed it earlier), please feel free to provide that feedback at any time.

That having been said, if a substantial period of time has passed since the original change was committed, it may be better to create a new patch to address the issues than comment on the original commit. The original patch author, for example, might no longer be an active contributor to the project.

### What Tools Are Used for Code Review?

Pre-commit code reviews are conducted on GitHub with Pull Requests. See GitHub documentation.

### When Is an RFC Required?

Some changes are too significant for just a code review. Changes that should change the LLVM Language Reference (e.g., adding new target-independent intrinsics), adding language extensions in Clang, and so on, require an RFC (Request for Comment) topic on the LLVM Discussion Forums first. For changes that promise significant impact on users and/or downstream code bases, reviewers can request an RFC achieving consensus before proceeding with code review. That having been said, posting initial patches can help with discussions on an RFC. See the RFC process documentation for more details.

## Code-Review Workflow

Code review can be an iterative process, which continues until the patch is ready to be committed. Specifically, once a patch is sent out for review, it needs an explicit approval before it is committed. Do not assume silent approval, or solicit objections to a patch with a deadline.

Note

If you are using a Pull Request for purposes other than review (eg: precommit CI results, convenient web-based reverts, etc) skip-precommit-approval label to the PR.

### Acknowledge All Reviewer Feedback

All comments by reviewers should be acknowledged by the patch author. It is generally expected that suggested changes will be incorporated into a future revision of the patch unless the author and/or other reviewers can articulate a good reason to do otherwise (and then the reviewers must agree). If a new patch does not address all outstanding feedback, the author should explicitly state that when providing the updated patch. When using the web-based code-review tool, such notes can be provided in the “Diff” description (which is different from the description of the “Differential Revision” as a whole used for the commit message).

If you suggest changes in a code review, but don’t wish the suggestion to be interpreted this strongly, please state so explicitly.

Note

After responding to reviewer comments, press Re-request review to bring the Pull Request to the reviewers’ attention.

### Aim to Make Efficient Use of Everyone’s Time

Aim to limit the number of iterations in the review process. For example, when suggesting a change, if you want the author to make a similar set of changes at other places in the code, please explain the requested set of changes so that the author can make all of the changes at once. If a patch will require multiple steps prior to approval (e.g., splitting, refactoring, posting data from specific performance tests), please explain as many of these up front as possible. This allows the patch author and reviewers to make the most efficient use of their time.

### LGTM - How a Patch Is Accepted

A patch is approved to be committed when a reviewer accepts it, and this is almost always associated with a message containing the text “LGTM” (which stands for Looks Good To Me).

Only approval from a single reviewer is required, unless the pull request has required reviewers. In which case, you must have approval from all of those reviewers.

When providing an unqualified LGTM (approval to commit), it is the responsibility of the reviewer to have reviewed all of the prior discussion and feedback from all reviewers ensuring that all feedback has been addressed and that all other reviewers will almost surely be satisfied with the patch being approved. If unsure, the reviewer should provide a qualified approval, (e.g., “LGTM, but please wait for @someone, @someone_else”). You may also do this if you are fairly certain that a particular community member will wish to review, even if that person hasn’t done so yet.

If additional feedback is provided after acceptance (by the same reviewer or another), the author should use their best judgement in deciding whether that feedback can be incorporated into the change without comment (say a typo) or requires further review discussion. More substantial comments (e.g., about the design) will usually require further discussion. If unsure, ask the reviewer.

Note that, if a reviewer has requested a particular community member to review, and after a week that community member has yet to respond, feel free to ping the patch (which literally means submitting a comment on the patch with the word, “Ping.”), or alternatively, ask the original reviewer for further suggestions.

If it is likely that others will want to review a recently-posted patch, especially if there might be objections, but no one else has done so yet, it is also polite to provide a qualified approval (e.g., “LGTM, but please wait for a couple of days in case others wish to review”). If approval is received very quickly, a patch author may also elect to wait before committing (and this is certainly considered polite for non-trivial patches). Especially given the global nature of our community, this waiting time should be at least 24 hours. Please also be mindful of weekends and major holidays.

Our goal is to ensure community consensus around design decisions and significant implementation choices, and one responsibility of a reviewer, when providing an overall approval for a patch, is to be reasonably sure that such consensus exists. If you’re not familiar enough with the community to know, then you shouldn’t be providing final approval to commit. A reviewer providing final approval should have commit access to the LLVM project.

Every patch should be reviewed by at least one technical expert in the areas of the project affected by the change.

### Splitting Requests and Conditional Acceptance

Reviewers may request certain aspects of a patch to be broken out into separate patches for independent review. Reviewers may also accept a patch conditioned on the author providing a follow-up patch addressing some particular issue or concern (although no committed patch should leave the project in a broken state). Moreover, reviewers can accept a patch conditioned on the author applying some set of minor updates prior to committing, and when applicable, it is polite for reviewers to do so.

### Don’t Unintentionally Block a Review

If you review a patch, but don’t intend for the review process to block on your approval, please state that explicitly. Out of courtesy, we generally wait on committing a patch until all reviewers are satisfied, and if you don’t intend to look at the patch again in a timely fashion, please communicate that fact in the review.

## Who Can/Should Review Code?

### Non-Experts Should Review Code

You do not need to be an expert in some area of the code base to review patches; it’s fine to ask questions about what some piece of code is doing. If it’s not clear to you what is going on, you’re unlikely to be the only one. Please remember that it is not in the long-term best interest of the community to have components that are only understood well by a small number of people. Extra comments and/or test cases can often help (and asking for comments in the test cases is fine as well).

Moreover, authors are encouraged to interpret questions as a reason to reexamine the readability of the code in question. Structural changes, or further comments, may be appropriate.

If you’re new to the LLVM community, you might also find this presentation helpful: .. _How to Contribute to LLVM, A 2019 LLVM Developers’ Meeting Presentation: https://youtu.be/C5Y977rLqpw

A good way for new contributors to increase their knowledge of the code base is to review code. It is perfectly acceptable to review code and explicitly defer to others for approval decisions.

### Experts Should Review Code

If you are an expert in an area of the compiler affected by a proposed patch, then you are highly encouraged to review the code. If you are a relevant maintainer, and no other experts are reviewing a patch, you must either help arrange for an expert to review the patch or review it yourself.

### Code Reviews, Speed, and Reciprocity

Sometimes code reviews will take longer than you might hope, especially for larger features. Common ways to speed up review times for your patches are:

- Review other people’s patches. If you help out, everybody will be more willing to do the same for you; goodwill is our currency.

- Ping the patch. If it is urgent, provide reasons why it is important to you to get this patch landed and ping it every couple of days. If it is not urgent, the common courtesy ping rate is one week. Remember that you’re asking for valuable time from other professional developers.

- Ask for help on Discord. Developers on Discord will be able to either help you directly, or tell you who might be a good reviewer.

- Split your patch into multiple smaller patches that build on each other. The smaller your patch is, the higher the probability that somebody will take a quick look at it. When doing this, it is helpful to add “[N/M]” (for 1 <= N <= M) to the title of each patch in the series, so it is clear that there is an order and what that order is.

Developers should participate in code reviews as both reviewers and authors. If someone is kind enough to review your code, you should return the favor for someone else. Note that anyone is welcome to review and give feedback on a patch, but approval of patches should be consistent with the policy above.

## Upstreaming Changes to LLVM

When upstreaming your own changes from a downstream project to LLVM, simply follow the process outlined above.

When upstreaming changes originally written by someone else:

- Ensure that there are no obstacles to upstreaming the code. In some cases, this simply means checking with the original author(s) to ensure they are aware of and approve the upstreaming. In other cases, licensing considerations may be more complex.

- Properly attribute the original changes, e.g., by creating a commit with multiple authors (GitHub guide).

- Invite the original author(s) to review the changes, and also include additional reviewers. Specifically, an LGTM from a (co-)author should not be taken as approval to land a change.