Page MenuHomePhabricator

ellis (Ellis Hoag)
User

Projects

User does not belong to any projects.

User Details

User Since
Jun 14 2018, 5:51 PM (205 w, 6 d)

Recent Activity

Fri, May 20

ellis updated the diff for D124490: [InstrProf] Minimal Block Coverage.

Refactor BCI a bit and add a more interesting test case in compiler-rt.

Fri, May 20, 1:49 PM · Restricted Project, Restricted Project, Restricted Project

Thu, May 19

ellis added a comment to D124490: [InstrProf] Minimal Block Coverage.

CoverageMappingGen.cpp adds counters while traversing AST. For ex, this is how counters are added for an if statement.
https://github.com/llvm/llvm-project/blob/main/clang/lib/CodeGen/CoverageMappingGen.cpp#L1383
I'm currently building the prototype for using boolean counters in coverage, and I'm planning to upload a WIP review soon.
After that, we can discuss further whether BlockCoverageInference can be generalized.

I'm also wondering if we could use this PGO coverage to infer source-based code coverage by looking at debug info.

How are you planning to use block coverage for PGO?
In some of the tools that we show source-based coverage, we show whether a line is covered by the executed tests and do not show how many times each line is executed. For this specific purpose, we want to use single byte counters.
Although I'm not that familiar with PGO implementation, it seems like number counters might be more beneficial for making optimization decisions for PGO. Are there specific optimizations that you are planning to use block coverage?

Thu, May 19, 7:33 PM · Restricted Project, Restricted Project, Restricted Project
ellis updated the diff for D124490: [InstrProf] Minimal Block Coverage.

Remove isBlockRarelyExecuted() API.
For covered functions, set the entry count to 10000 so that BFI correctly gives non-zero profile counts to only covered blocks.

Thu, May 19, 3:17 PM · Restricted Project, Restricted Project, Restricted Project
ellis added a comment to D125743: [outliner] Use profile data to avoid outlining hot blocks.

I'm also wondering if I should use the isHotBlockNthPercentile() function and add an option to specify the percentile. Maybe something like -machine-outliner-cutoff-prof=99900.

Thu, May 19, 11:14 AM · Restricted Project, Restricted Project
ellis updated the diff for D125743: [outliner] Use profile data to avoid outlining hot blocks.

Remove dependency on isBlockRarelyExecuted() that I created in D124490 and replace with ProfileSummaryInfo API to determine if a block is hot.

Thu, May 19, 11:11 AM · Restricted Project, Restricted Project

Wed, May 18

ellis added a comment to D124490: [InstrProf] Minimal Block Coverage.

Hi @ellis,

This is exciting for us! We are interested in using single byte booleans for source-based code coverage, and I am currently working on the implementation.
We are trying to find a good solution to the problem that you described that missing counts cannot be inferred by doing arithmetic on other block counts when we use boolean counters.
For ex, in an if statement, else part is not instrumented, and its counter is inferred by subtracting parent and then counters.
When we use the boolean values for counters, this cannot be done anymore.
Simpler approach is to instrument more basic blocks, but we are exploring approaches that add counters to minimal blocks.
One of the biggest differences of coverage and PGO is that counters are emitted by traversing AST nodes in the front-end for coverage, whereas they are emitted by traversing CFG nodes for PGO.
The algorithm that you introduced is based on CFG traversal. I'm looking at that to see whether this can be repurposed for coverage.

A few questions:

  1. You mentioned that "we found that only ~60% of basic blocks need to be instrumented". With boolean counters, do you how much that has changed?
  2. Size reduction is great! Do you have any data on the impact of block coverage on compilation time and runtime performance? For coverage, we are also aiming runtime performance with boolean counters.
  3. Did you do any verification to compare the correctness of block coverage like comparing it against block counts?

It seems like we are trying to solve similar problems in different contexts, so we would be very interested in collaboration.

Wed, May 18, 9:12 AM · Restricted Project, Restricted Project, Restricted Project

Tue, May 17

ellis updated the summary of D125743: [outliner] Use profile data to avoid outlining hot blocks.
Tue, May 17, 3:35 PM · Restricted Project, Restricted Project
ellis updated the diff for D125743: [outliner] Use profile data to avoid outlining hot blocks.

Check if profile data is available before trying to use and add a test to make sure we enable outlining for minsize functions without profiles.

Tue, May 17, 3:35 PM · Restricted Project, Restricted Project
ellis added inline comments to D125743: [outliner] Use profile data to avoid outlining hot blocks.
Tue, May 17, 3:16 PM · Restricted Project, Restricted Project
ellis updated the diff for D125743: [outliner] Use profile data to avoid outlining hot blocks.

Add tests for hot/cold functions with optsize minsize.

Tue, May 17, 10:47 AM · Restricted Project, Restricted Project

Mon, May 16

ellis published D125743: [outliner] Use profile data to avoid outlining hot blocks for review.
Mon, May 16, 9:42 PM · Restricted Project, Restricted Project
ellis updated the summary of D124490: [InstrProf] Minimal Block Coverage.
Mon, May 16, 9:39 PM · Restricted Project, Restricted Project, Restricted Project
ellis updated the diff for D124490: [InstrProf] Minimal Block Coverage.

Rebase and separate out machine outliner code into https://reviews.llvm.org/D125743

Mon, May 16, 9:38 PM · Restricted Project, Restricted Project, Restricted Project
ellis added a reviewer for D124490: [InstrProf] Minimal Block Coverage: paquette.
Mon, May 16, 5:37 PM · Restricted Project, Restricted Project, Restricted Project
ellis committed rG9a90ea1fdcd2: [InstrProf] Fix promoter when using counter relocations (authored by ellis).
[InstrProf] Fix promoter when using counter relocations
Mon, May 16, 2:33 PM · Restricted Project, Restricted Project
ellis closed D125710: [InstrProf] Fix promoter when using counter relocations.
Mon, May 16, 2:32 PM · Restricted Project, Restricted Project
ellis added a comment to D124490: [InstrProf] Minimal Block Coverage.

Special thanks to Julian Mestre for creating this block coverage inference algorithm.

I haven't read the code yet but can you briefly describe it in the summary?

How is this compared with Kirchhoff circuit law optimization which requires integral execution counts?
Note: -fprofile-instr-generate is quite a bit slower because it does not have the optimization.

Mon, May 16, 12:03 PM · Restricted Project, Restricted Project, Restricted Project
ellis updated the summary of D124490: [InstrProf] Minimal Block Coverage.
Mon, May 16, 12:01 PM · Restricted Project, Restricted Project, Restricted Project
ellis published D124490: [InstrProf] Minimal Block Coverage for review.
Mon, May 16, 11:19 AM · Restricted Project, Restricted Project, Restricted Project
ellis published D125710: [InstrProf] Fix promoter when using counter relocations for review.
Mon, May 16, 10:40 AM · Restricted Project, Restricted Project
ellis added a comment to D114319: [InstrProf][NFC] Save profile bias to function map.

@phosek I've landed this, but it does not seem to fix https://github.com/llvm/llvm-project/issues/55125

Mon, May 16, 8:35 AM · Restricted Project, Restricted Project
ellis committed rG6e23cd2bf073: [InstrProf][NFC] Save profile bias to function map (authored by ellis).
[InstrProf][NFC] Save profile bias to function map
Mon, May 16, 8:33 AM · Restricted Project, Restricted Project
ellis closed D114319: [InstrProf][NFC] Save profile bias to function map.
Mon, May 16, 8:32 AM · Restricted Project, Restricted Project
ellis updated the diff for D114319: [InstrProf][NFC] Save profile bias to function map.

Rebase

Mon, May 16, 8:32 AM · Restricted Project, Restricted Project
ellis updated the diff for D114319: [InstrProf][NFC] Save profile bias to function map.

Rename function map and rebase

Mon, May 16, 8:06 AM · Restricted Project, Restricted Project
ellis added a comment to D114319: [InstrProf][NFC] Save profile bias to function map.

LGTM

@ellis do you have time to land this change? This change should address https://github.com/llvm/llvm-project/issues/55125 so I'd like to see it landed.

Mon, May 16, 7:03 AM · Restricted Project, Restricted Project

Apr 16 2022

ellis published D123900: [docs] Fix link in Code of Conduct for review.
Apr 16 2022, 10:46 AM · Restricted Project, Restricted Project

Mar 17 2022

ellis committed rGf6b5142ac2e4: [AlwaysInliner] Emit inline remark only when successful (authored by ellis).
[AlwaysInliner] Emit inline remark only when successful
Mar 17 2022, 3:41 PM · Restricted Project
ellis closed D121946: [AlwaysInliner] Emit inline remark only when successful.
Mar 17 2022, 3:40 PM · Restricted Project, Restricted Project
ellis updated the diff for D121946: [AlwaysInliner] Emit inline remark only when successful.

Extend the always-inline-remark.ll test case to match all the inlining remarks.

Mar 17 2022, 3:38 PM · Restricted Project, Restricted Project
ellis added inline comments to D121722: [AlwaysInliner] Check inliner errors even without assserts.
Mar 17 2022, 1:15 PM · Restricted Project, Restricted Project
ellis published D121946: [AlwaysInliner] Emit inline remark only when successful for review.
Mar 17 2022, 1:15 PM · Restricted Project, Restricted Project
ellis committed rG84c6689b1511: [AlwaysInliner] Check inliner errors even without assserts (authored by ellis).
[AlwaysInliner] Check inliner errors even without assserts
Mar 17 2022, 10:16 AM · Restricted Project
ellis closed D121722: [AlwaysInliner] Check inliner errors even without assserts.
Mar 17 2022, 10:16 AM · Restricted Project, Restricted Project

Mar 16 2022

ellis updated the diff for D121722: [AlwaysInliner] Check inliner errors even without assserts.

Add a test case for functions with the alwaysinline attribute that cannot be inlined and emit a remark instead of outputting directly to errs().

Mar 16 2022, 5:34 PM · Restricted Project, Restricted Project

Mar 15 2022

ellis added a comment to D121722: [AlwaysInliner] Check inliner errors even without assserts.

Essentially every unchecked assertion is followed by code that is effectively UB if the assertion should have failed but didn't run.
Why is this case so special that we should special-case it?

This is a pretty easy way to prevent unexpected behavior when inlining goes wrong with noasserts builds, i.e., production.

  1. Res gives a helpful error message that can be given to the user.
  2. The comment for InlineFunction() claims that the program will be fine if it failed to inline, so continuing is perfectly safe.

This returns false if it is not possible to inline this call. The program is still in a well defined state if this occurs though.

Mar 15 2022, 11:28 AM · Restricted Project, Restricted Project
ellis published D121722: [AlwaysInliner] Check inliner errors even without assserts for review.
Mar 15 2022, 11:17 AM · Restricted Project, Restricted Project

Mar 4 2022

ellis committed rG9c35303981ae: [InstrProf][NFC] Fix warning by removing typecast (authored by ellis).
[InstrProf][NFC] Fix warning by removing typecast
Mar 4 2022, 10:48 AM · Restricted Project
ellis closed D120945: [InstrProf][NFC] Fix warning by removing typecast.
Mar 4 2022, 10:48 AM · Restricted Project, Restricted Project

Mar 3 2022

ellis published D120945: [InstrProf][NFC] Fix warning by removing typecast for review.
Mar 3 2022, 4:30 PM · Restricted Project, Restricted Project

Mar 2 2022

Herald added a project to D96109: Refactor implementation of -funique-internal-linkage-names.: Restricted Project.

Hi @tmsriram. I found a clang crash when using the flag -funique-internal-linkage-names that only happens after this diff. Would you mind taking a look?

$ cat test.c
inline void foo() {}
extern void foo();
$ clang -funique-internal-linkage-names test.c -c

More details are in this bug report https://github.com/llvm/llvm-project/issues/54139

Mar 2 2022, 11:08 AM · Restricted Project, Restricted Project, Restricted Project

Feb 23 2022

ellis accepted D120092: [instrprof] Rename the profile kind types to be more descriptive..

Apologies for the late review, but thanks for the ping!
LGTM

Feb 23 2022, 10:14 AM · Restricted Project

Feb 2 2022

ellis committed rG7756b34ef26b: [InstrProf][NFC] Remove stray option in InstrProfWriter (authored by ellis).
[InstrProf][NFC] Remove stray option in InstrProfWriter
Feb 2 2022, 2:29 PM
ellis closed D118664: [InstrProf][NFC] Remove stray option in InstrProfWriter.
Feb 2 2022, 2:29 PM · Restricted Project

Jan 31 2022

ellis published D118664: [InstrProf][NFC] Remove stray option in InstrProfWriter for review.
Jan 31 2022, 3:59 PM · Restricted Project
ellis accepted D118656: [instrprof][NFC] Refactor out the common logic for getProfileKind..

LGTM

Jan 31 2022, 2:49 PM · Restricted Project

Jan 28 2022

ellis committed rGeea002a9c471: [InstrProf][NFC] Move function out of InstrProf.h (authored by ellis).
[InstrProf][NFC] Move function out of InstrProf.h
Jan 28 2022, 9:24 AM
ellis closed D118097: [InstrProf][NFC] Move function out of InstrProf.h.
Jan 28 2022, 9:24 AM · Restricted Project
ellis added a comment to D116225: Revert "[DwarfDebug] Support emitting function-local declaration for a lexical block" & dependent patches.

Hi @krisb. Are their plans to give this fix another go? Do we need to first wait for D113741 to land again?

Jan 28 2022, 9:21 AM · Restricted Project

Jan 27 2022

ellis added reviewers for D118097: [InstrProf][NFC] Move function out of InstrProf.h: kyulee, davidxl, phosek, xur.
Jan 27 2022, 5:46 PM · Restricted Project
ellis updated the diff for D118097: [InstrProf][NFC] Move function out of InstrProf.h.

Rebase

Jan 27 2022, 5:45 PM · Restricted Project
ellis committed rG11d307426732: [InstrProf] Add single byte coverage mode (authored by ellis).
[InstrProf] Add single byte coverage mode
Jan 27 2022, 5:39 PM
ellis closed D116180: [InstrProf] Add single byte coverage mode.
Jan 27 2022, 5:39 PM · Restricted Project, Restricted Project
ellis updated the diff for D116180: [InstrProf] Add single byte coverage mode.

Fix build error

Jan 27 2022, 5:30 PM · Restricted Project, Restricted Project
ellis updated the diff for D116180: [InstrProf] Add single byte coverage mode.

Make BB and FunctionEntryOnly incompatible.

Jan 27 2022, 5:22 PM · Restricted Project, Restricted Project
ellis added inline comments to D116180: [InstrProf] Add single byte coverage mode.
Jan 27 2022, 3:07 PM · Restricted Project, Restricted Project
ellis added a reviewer for D116180: [InstrProf] Add single byte coverage mode: snehasish.
Jan 27 2022, 2:15 PM · Restricted Project, Restricted Project
ellis added inline comments to D116180: [InstrProf] Add single byte coverage mode.
Jan 27 2022, 2:14 PM · Restricted Project, Restricted Project
ellis updated the diff for D116180: [InstrProf] Add single byte coverage mode.

Rebase ontop of D115393

Jan 27 2022, 2:14 PM · Restricted Project, Restricted Project
ellis added inline comments to D115393: [InstrProf][NFC] Refactor Profile kind into a bitset enum..
Jan 27 2022, 1:33 PM · Restricted Project, Restricted Project
ellis added inline comments to D115393: [InstrProf][NFC] Refactor Profile kind into a bitset enum..
Jan 27 2022, 10:36 AM · Restricted Project, Restricted Project
ellis committed rGc9baa5608bad: [InstrProf][Correlate] Verify debug info with llvm-profdata show (authored by ellis).
[InstrProf][Correlate] Verify debug info with llvm-profdata show
Jan 27 2022, 10:11 AM
ellis closed D118181: [InstrProf][Correlate] Verify debug info with llvm-profdata show.
Jan 27 2022, 10:11 AM · Restricted Project, Restricted Project
ellis updated the summary of D118181: [InstrProf][Correlate] Verify debug info with llvm-profdata show.
Jan 27 2022, 10:09 AM · Restricted Project, Restricted Project
ellis added a comment to D116180: [InstrProf] Add single byte coverage mode.

@davidxl @phosek @kyulee Can I get another look at this?

Jan 27 2022, 9:55 AM · Restricted Project, Restricted Project

Jan 26 2022

ellis committed rG6d5239113c14: [InstrProf][Correlate] Improve error messages (authored by ellis).
[InstrProf][Correlate] Improve error messages
Jan 26 2022, 11:34 AM
ellis closed D118166: [InstrProf][Correlate] Improve error messages.
Jan 26 2022, 11:34 AM · Restricted Project
ellis updated the diff for D118181: [InstrProf][Correlate] Verify debug info with llvm-profdata show.

Change option name and add another test file.

Jan 26 2022, 11:33 AM · Restricted Project, Restricted Project
ellis added inline comments to D118181: [InstrProf][Correlate] Verify debug info with llvm-profdata show.
Jan 26 2022, 10:47 AM · Restricted Project, Restricted Project

Jan 25 2022

ellis updated the diff for D118097: [InstrProf][NFC] Move function out of InstrProf.h.

Rebase

Jan 25 2022, 6:52 PM · Restricted Project
ellis updated the diff for D116180: [InstrProf] Add single byte coverage mode.

Use two flags for single byte coverage and function entry coverage.

Jan 25 2022, 6:30 PM · Restricted Project, Restricted Project
ellis added a comment to D116180: [InstrProf] Add single byte coverage mode.

This change appears to be implementing func-cov mode proposed in https://groups.google.com/g/llvm-dev/c/r03Z6JoN7d4. Do you plan on implementing the support for block-cov and func-cnt modes as well? I'm asking because we're interested in the block-cov mode, but also because I'm somewhat concerned about the orthogonality of these modes in the implementation.

For example, this change introduces the VARIANT_MASK_BYTE_ENTRY_COVERAGE flag to track whether the func-cov mode is used. This means that we're going to need two more bits for block-cov and func-cnt (three in total). Wouldn't it make more sense to instead have VARIANT_MASK_BYTE_COVERAGE and VARIANT_MASK_ENTRY_COVERAGE flags which could be combined to represent all four modes, requiring only two bits in total?

I was only planning on adding func-cov. A while back I did a small experiment and found very little binary size difference between block-cov and full block-counts. This is because block-counts can instrument a subset of blocks and infer counts from the rest. With block-cov we cannot do this in the same way so we need to instrument every block. There might be a smarter way to infer some block coverage, but I don't know it.

I decided to use just VARIANT_MASK_BYTE_ENTRY_COVERAGE for simplicity, but I'm open to using two flags like you suggested.

Can I ask why you are interested in block-cov rather than using full block counters? If binary size is a concern then I would suggest inferring coverage from 8 bit counters, assuming overflow isn't a problem. If speed is the main concern then maybe block-cov is the right way to go.

We're mostly concerned about performance so block-cov is still of interest to us, but this is a useful insight, thanks! If it's not too much of an overhead, I'd prefer using the two flags so we can introduce the block-cov mode later.

Jan 25 2022, 4:22 PM · Restricted Project, Restricted Project
ellis published D118181: [InstrProf][Correlate] Verify debug info with llvm-profdata show for review.
Jan 25 2022, 4:21 PM · Restricted Project, Restricted Project
ellis published D118166: [InstrProf][Correlate] Improve error messages for review.
Jan 25 2022, 4:19 PM · Restricted Project
ellis committed rGf17059524919: [InstrProf][Correlator] Do not compress names when reading debug info (authored by ellis).
[InstrProf][Correlator] Do not compress names when reading debug info
Jan 25 2022, 12:53 PM
ellis closed D118176: [InstrProf][Correlator] Do not compress names when reading debug info.
Jan 25 2022, 12:52 PM · Restricted Project, Restricted Project
ellis published D118176: [InstrProf][Correlator] Do not compress names when reading debug info for review.
Jan 25 2022, 12:32 PM · Restricted Project, Restricted Project
ellis committed rG9c2891a8eddb: [InstrProf][correlation] Read DWARFv5 `OP_addrx` location (authored by ellis).
[InstrProf][correlation] Read DWARFv5 `OP_addrx` location
Jan 25 2022, 11:03 AM
ellis closed D118098: [InstrProf][correlation] Read DWARFv5 `OP_addrx` location.
Jan 25 2022, 11:03 AM · Restricted Project, Restricted Project
ellis updated the summary of D118098: [InstrProf][correlation] Read DWARFv5 `OP_addrx` location.
Jan 25 2022, 10:36 AM · Restricted Project, Restricted Project
ellis added inline comments to D118098: [InstrProf][correlation] Read DWARFv5 `OP_addrx` location.
Jan 25 2022, 10:36 AM · Restricted Project, Restricted Project
ellis updated the diff for D118098: [InstrProf][correlation] Read DWARFv5 `OP_addrx` location.

Simplify code and add test

Jan 25 2022, 10:36 AM · Restricted Project, Restricted Project
ellis added a comment to D116180: [InstrProf] Add single byte coverage mode.

This change appears to be implementing func-cov mode proposed in https://groups.google.com/g/llvm-dev/c/r03Z6JoN7d4. Do you plan on implementing the support for block-cov and func-cnt modes as well? I'm asking because we're interested in the block-cov mode, but also because I'm somewhat concerned about the orthogonality of these modes in the implementation.

For example, this change introduces the VARIANT_MASK_BYTE_ENTRY_COVERAGE flag to track whether the func-cov mode is used. This means that we're going to need two more bits for block-cov and func-cnt (three in total). Wouldn't it make more sense to instead have VARIANT_MASK_BYTE_COVERAGE and VARIANT_MASK_ENTRY_COVERAGE flags which could be combined to represent all four modes, requiring only two bits in total?

Jan 25 2022, 9:49 AM · Restricted Project, Restricted Project

Jan 24 2022

ellis added a comment to D118098: [InstrProf][correlation] Read DWARFv5 `OP_addrx` location.

The original crash is here https://github.com/llvm/llvm-project/issues/53387

Jan 24 2022, 8:17 PM · Restricted Project, Restricted Project
ellis added a reviewer for D118098: [InstrProf][correlation] Read DWARFv5 `OP_addrx` location: dblaikie.
Jan 24 2022, 8:15 PM · Restricted Project, Restricted Project
ellis added inline comments to D116180: [InstrProf] Add single byte coverage mode.
Jan 24 2022, 8:13 PM · Restricted Project, Restricted Project
ellis requested review of D118098: [InstrProf][correlation] Read DWARFv5 `OP_addrx` location.
Jan 24 2022, 8:13 PM · Restricted Project, Restricted Project
ellis requested review of D118097: [InstrProf][NFC] Move function out of InstrProf.h.
Jan 24 2022, 8:12 PM · Restricted Project
ellis updated the diff for D116180: [InstrProf] Add single byte coverage mode.

Rebase

Jan 24 2022, 8:12 PM · Restricted Project, Restricted Project
ellis added inline comments to D117598: [llvm-profdata] Use SubCommands to simplify code.
Jan 24 2022, 3:08 PM · Restricted Project
ellis removed a watcher for debug-info: ellis.
Jan 24 2022, 11:29 AM

Jan 19 2022

ellis committed rGccb09a48891f: Fix broken comment in InstrProfData.inc (authored by ellis).
Fix broken comment in InstrProfData.inc
Jan 19 2022, 10:38 AM
ellis closed D117705: Fix broken comment in InstrProfData.inc.
Jan 19 2022, 10:38 AM · Restricted Project, Restricted Project
ellis requested review of D117705: Fix broken comment in InstrProfData.inc.
Jan 19 2022, 10:37 AM · Restricted Project, Restricted Project
ellis committed rG4f61749e16f6: [clang] support relative roots to vfs overlays (authored by rmaz).
[clang] support relative roots to vfs overlays
Jan 19 2022, 10:13 AM
ellis closed D116174: [clang] support relative roots to vfs overlays.
Jan 19 2022, 10:13 AM · Restricted Project, Restricted Project
ellis committed rG88d81770f110: [InstrProf] Restore InstrProfData.inc to fix Fuchsia builds (authored by ellis).
[InstrProf] Restore InstrProfData.inc to fix Fuchsia builds
Jan 19 2022, 10:11 AM
ellis closed D117631: [InstrProf] Restore InstrProfData.inc to fix Fuchsia builds.
Jan 19 2022, 10:11 AM · Restricted Project, Restricted Project

Jan 18 2022

ellis updated the diff for D117631: [InstrProf] Restore InstrProfData.inc to fix Fuchsia builds.

Add fixme

Jan 18 2022, 6:14 PM · Restricted Project, Restricted Project
ellis added a comment to D116179: [InstrProf][NFC] Do not assume size of counter type.

Is it really necessary to rename the fields in InstrProfData.inc? That header is shipped with Clang and may have other uses outside of compiler-rt. For example, in Fuchsia we use InstrProfData.inc in the kernel where we cannot use the existing runtime and the name change broke our build. The original names may not be perfect, but that shouldn't justify breaking source compatibility.

Jan 18 2022, 5:41 PM · Restricted Project, Restricted Project