<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Apr 3, 2020 at 2:58 PM Robinson, Paul via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div lang="EN-US">
<div>
<p class="MsoNormal">(Repost, remembering to cc llvm-dev this time)</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">Thanks Jon!</p></div></div></blockquote><div><br></div><div>+1<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div lang="EN-US"><div>
<p class="MsoNormal"> </p>
<p class="MsoNormal">I’ve done some grepping for a few of these gotchas in llvm/test and clang/test.  Of course this isn’t looking for the check prefixes that are actually used, but CHECK would be by far the most common, so I think we can take it as a non-definitive
 proxy for other cases.</p>
<p class="MsoNormal"> </p>
<p class="MsoNormal">Gotcha A (missing colon):  This has a fair number of examples in the wild.  Usually the colon is just missing, although I’ve seen a few examples that had a semicolon instead of colon, which is an easy typo to make.  The real problem here
 is coming up with a heuristic that will distinguish “things that are likely a mistake” from “things that are likely just a comment” so that the diagnostic has a reasonably low false-positive rate.</p>
<p class="MsoNormal">For example, in the wild I’ve seen `// TEMPORARY CHECK: X` which FileCheck will treat as a real directive.  On the other hand we *<b>don’t</b>* want it to look at `// These CHECK lines are here on purpose` and diagnose that as a missing
 colon.</p>
<p class="MsoNormal">I’ve been poking at this over the past day or so and I now think the most reasonable heuristic is: If the directive is preceded by an alphanumeric (+ whitespace) or an `=` or ‘,’ then it’s likely a comment or a RUN: line that we don’t want
 to diagnose.  This means we would not diagnose a missing colon in `// TEMPORARY CHECK; X` but that sort of case is extremely rare.  We *<b>would</b>* diagnose `// (TEMPORARY) CHECK; X` however.</p></div></div></blockquote><br></div><div class="gmail_quote">The previous heuristic we discussed was that the diagnostic is reported only if, other than whitespace, the directive is at the beginning of a line or at the beginning of a comment (for some definition of comment).  It appears that your new heuristic strictly expands the cases that would be diagnosed.  Is that right?  Is there a specific case you saw in the test suites that is covered by your new heuristic but not by the previous heuristic?<br><br>Your new heuristic does have additional false positives in the test suites, like the following:</div><div class="gmail_quote"><br></div><div class="gmail_quote">  // NOTE: CHECK lines have been autogenerated by gen_ast_dump_json_test.py</div><div class="gmail_quote">  // FIXME: CHECK-NOT is broken somehow, it doesn't work here. Check adjacency instead.</div><div class="gmail_quote"><br></div><div class="gmail_quote">This makes me wonder if such heuristics are going to create a frustrating FileCheck user experience when trying to write comments.<br></div><div><br></div><div>Consider what happens if we implement your heuristic in a parameterized way using new environment variables with the following defaults:<br></div><div><br></div>  FILECHECK_COMMENT_REGEX='([a-zA-Z0-9]\s*|[=,])$'<br><div><div class="gmail_quote">  FILECHECK_COMMENT_APPLY=diagnostics</div><div class="gmail_quote"><br></div><div>So far, this is exactly your proposed heuristic except:<br></div><div><br></div><div>1. It's slightly more to implement: just a couple of environment variables to read.  Not that hard.</div><div><br></div><div>2. We can easily tweak the regex per test suite as we discover how this heuristic fares with the rest of check-all and with the rest of the prefixes (beyond CHECK).</div><div><br></div><div class="gmail_quote">3. Specific test suites that want total freedom in writing comments and are ready to protect them with something like 'COM:' could specify something like:<br><br>  FILECHECK_COMMENT_REGEX='\bRUN:|\bCOM:'</div><div class="gmail_quote">  FILECHECK_COMMENT_APPLY=diagnostics,directives<br></div><div class="gmail_quote"><br></div><div class="gmail_quote">At some point in the future, when all test suites are compatible with 3, it could become the default (and we might then drop FILECHECK_COMMENT_APPLY).  At that point:<br></div><div class="gmail_quote"><br></div><div class="gmail_quote">A. Diagnostics would no longer be limited by heuristics' shaky assumptions about intentions within comments.  They know precisely what are just comments.<br></div><div class="gmail_quote"><br></div><div class="gmail_quote">B. Users would know precisely where they can and cannot write the names of directives (both with and without the colon).</div><div class="gmail_quote"><br></div><div class="gmail_quote">C. Users would have a way to comment out directives while making their intention very obvious (no more mangling).<br></div><div class="gmail_quote"><br></div><div class="gmail_quote">This seems like both a short-term and long-term win for very little extra upfront effort.<br></div><div class="gmail_quote"><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div lang="EN-US"><div><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"></p>
<p class="MsoNormal">Another question was whether we should *<b>require</b>* FileCheck directives to be preceded by a punctuation mark of some kind.  I think that ought to be its own separate discussion.</p></div></div></blockquote><div><br></div><div>Well, if we eventually require directive-like text to be FileCheck-commented, as described above, this question goes away.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div lang="EN-US"><div><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal">Gotcha B (space between the directive and the colon):  Some tests have this bug, so it would be worth catching.</p>
<p class="MsoNormal">James Henderson observed that legalizing it could help prettify some cases where we’re matching whitespace or the entire line.  I don’t think it’s that valuable personally.<u></u><u></u></p>
<p class="MsoNormal">If we implement a reasonable diagnostic heuristic for the missing-colon case (Gotcha A), then we’ll catch this mistake in the same net.</p></div></div></blockquote><div><br></div><div>Agreed.<br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div lang="EN-US"><div><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"></p>
<p class="MsoNormal">Gotchas C,D (missing hyphen):  I found exactly one case in the wild.  I’d say the value is debatable.<u></u><u></u></p>
<p class="MsoNormal">(It’s a CHECKNEXT in llvm/test/CodeGen/PowerPC/testCompareslleqsi.ll if someone wants to fix it.)<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Gotcha E (underscore instead of hyphen):  I found 40 examples across clang/test and llvm/test.  I am certain I have caught a few cases in review and pretty sure I’ve had to fix some of these that I typo’d myself.  I’d say this is worth
 doing.</p></div></div></blockquote><div><br></div><div>No arguments here.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div lang="EN-US"><div><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"></p>
<p class="MsoNormal">Multiple suffixes:  I believe there are NO multiple-suffix combinations that FileCheck currently supports.  The tool should detect any multiple suffix combinations and report them as errors.  Currently it looks for a limited set (basically,
 -NOT in combination with almost anything else), but it’s easy for someone to infer that if FileCheck doesn’t complain, then it will Do The Right Thing™ with other combinations.  We should not be that user-unfriendly; we should complain about all multiple-suffix
 combinations.<u></u><u></u></p></div></div></blockquote><div><br></div><div>Agreed.</div><div><br></div><div>Thanks.<br></div><div><br></div><div>Joel<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div lang="EN-US"><div><p class="MsoNormal"></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">--paulr<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<div style="border-color:currentcolor currentcolor currentcolor blue;border-style:none none none solid;border-width:medium medium medium 1.5pt;padding:0in 0in 0in 4pt">
<div>
<div style="border-color:rgb(225,225,225) currentcolor currentcolor;border-style:solid none none;border-width:1pt medium medium;padding:3pt 0in 0in">
<p class="MsoNormal"><b>From:</b> llvm-dev <<a href="mailto:llvm-dev-bounces@lists.llvm.org" target="_blank">llvm-dev-bounces@lists.llvm.org</a>> <b>On Behalf Of
</b>Jon Roelofs via llvm-dev<br>
<b>Sent:</b> Friday, April 3, 2020 12:58 PM<br>
<b>To:</b> <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<b>Subject:</b> [llvm-dev] [RFC] Improving FileCheck<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">I'd like to (re)start a discussion on a few gotchas in FileCheck that I've noticed working on various tests in llvm's suites. This begain in a review [1], but I'll try to summarize here so it gets the right audience before decisions are
 made on it (so to speak).<br>
<br>
1: <a href="https://reviews.llvm.org/D77227" target="_blank">https://reviews.llvm.org/D77227</a><br>
<br>
The main sticking point is the abundance of checks in FileCheck tests that appear to be checking something, but are in fact silently hiding failures. The biggest class of this bug appears to be CHECK lines that omit the trailing colon, though there are a few
 others.<br>
<br>
CHECK:            legitimate test<br>
CHECK             gotcha A<br>
CHECK :           gotcha B<br>
CHECKNEXT:        gotcha C<br>
CHECKDAG:         gotcha D<br>
CHECK_NOT:        gotcha E<br>
CHECK-LABEL-NOT:  ??? F<br>
CHECK-SAME-DAG:   ??? G<br>
<br>
<br>
Gotcha A<br>
--------<br>
<br>
CHECK  gotcha A<br>
<br>
A lot of cases of (A) are benign, but buried in there are cases where we have tests that don't check what they intend to, which are broken when the missing colons are added [2]. Some grep analysis from paulr in [3] found some 178 tests across 72 test files
 that seem like likely mistakes, suggesting that having some automated tooling to catch this is probably not a bad idea.<br>
<br>
In the review thread, a couple of issues surfaced with simply matching on `${CHECKNAME}\b`, making that less attractive as a remedy:<br>
<br>
A1) There are quite a lot of RUN: lines that have CHECK names on them from their --check-prefix/--check-prefixes arguments, and we don't want tooling to match on those. This could be addressed with a script that quotes them all, but that would mean touching
 pretty much every test file, which is less than ideal.<br>
<br>
A2) There are a few RUN lines with missing colons, though those seem infrequent enough to not worry about [5].<br>
<br>
A3) There are quite a lot of mentions of CHECK names in comments that are clearly not meant to be tests [6]. Any solution to this, as far as I can tell, will likely need to reword many of those.<br>
<br>
A4) We need some way to comment out CHECK lines that conveys intent better than removing the colon. This appears to be intentional in some testcases, but unintentional in the vast majority of them.<br>
<br>
To address (A1), a number of rules were proposed in [1], the best of which seems to be that we look for lines matching `[#/;*!]\s*CHECK[ \t]`, and emit a diagnostic of some form to help correct it. This gave a pretty good false positive rate of 25% on the 186
 tests it "broke" [7].<br>
<br>
An open question here from jdenny is whether it makes sense to require all checks to follow that pattern (with the colon, of course) to make things less user-hostile [8]:
<br>
<br>
> Consider this example that has a well formed directive that doesn't follow the rule:<br>
> <br>
> // FIXME(201806L) CHECK: assert: 0<br>
> Approach A (from a previous comment): FileCheck executes the directive. If the user later accidentally removes the :, FileCheck won't execute the directive and won't diagnose the error unless the user is wiling to endure false positives by opting into the
 more verbose mode Paul suggested.<br>
> <br>
> Approach B (from that some comment): FileCheck ignores the directive. That just makes things worse because the above otherwise well formed directive is then an undiagnosed malformed directive (unless the user opts into a more verbose mode).<br>
> <br>
> Approach C (new proposal): FileCheck reports the directive as an error (in any mode). The more verbose mode is still needed to catch the case that the : is missing here, but at least users are guaranteed to get a slap when they write them with :<br>
2: llvm/test/Transforms/InstCombine/phi-preserve-ir-flags.ll<br>
3: <a href="https://reviews.llvm.org/D77227#1955596" target="_blank">https://reviews.llvm.org/D77227#1955596</a><br>
4: <a href="https://github.com/llvm/llvm-project/blob/56decd982dc03a74d1796d9d4dbd7d9e0cea98dc/llvm/lib/Support/FileCheck.cpp#L1141" target="_blank">
https://github.com/llvm/llvm-project/blob/56decd982dc03a74d1796d9d4dbd7d9e0cea98dc/llvm/lib/Support/FileCheck.cpp#L1141</a><br>
5: llvm/test/CodeGen/AArch64/speculation-hardening.ll<br>
6: llvm/test/MC/ARM/dwarf-asm-multiple-sections.s:88<br>
7: <a href="https://reviews.llvm.org/differential/diff/254562" target="_blank">https://reviews.llvm.org/differential/diff/254562</a><br>
8: <a href="https://reviews.llvm.org/D77227#1958228" target="_blank">https://reviews.llvm.org/D77227#1958228</a><br>
<br>
<br>
Gotcha B<br>
--------<br>
<br>
CHECK :  gotcha B<br>
<br>
This pattern is a variant of (A) that also disables perfectly good tests, but in a way that isn't obvious that it doesn't work. jhenderson brings up some good points [9] in favor of extending FileCheck to make FileCheck do what the user intended here. Luckily,
 that doesn't seem to conflict with the rules proposed in (A).<br>
<br>
9: <a href="https://reviews.llvm.org/D77227#1959041" target="_blank">https://reviews.llvm.org/D77227#1959041</a><br>
<br>
<br>
Gotchas C, D, E<br>
---------------<br>
<br>
I believe these can be handled pretty simply in FileCheck itself, but I have not spent much time trying to estimate how many tests are affected by this class of bug.<br>
<br>
<br>
??? F, G<br>
--------<br>
<br>
There are a number of check suffix combinations that are not explicitly supported (in the docs), but appear (maybe) useful. For these, there is some precedent on mitigating them within FileCheck itself [4], though the combinatorial explosion warrants being
 careful about how we go about detecting them (if at all).<br>
<br>
<br>
-- <br>
Jon Roelofs<br>
<a href="mailto:jroelofs@jroelofs.com" target="_blank">jroelofs@jroelofs.com</a><u></u><u></u></p>
</div>
</div>
</div>
</div>

_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div></div></div>