[llvm-dev] [RFC] Improving FileCheck

James Henderson via llvm-dev llvm-dev at lists.llvm.org
Mon Apr 6 01:12:43 PDT 2020

On Fri, 3 Apr 2020 at 19:59, Robinson, Paul via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> Gotcha B (space between the directive and the colon):  Some tests have
> this bug, so it would be worth catching.
> 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.
> If we implement a reasonable diagnostic heuristic for the missing-colon
> case (Gotcha A), then we’ll catch this mistake in the same net.
Fine by me, as long as "#       CHECK:" continues to be acceptable instead
to allow the colons to line up with other check directives on other lines.

> Gotchas C,D (missing hyphen):  I found exactly one case in the wild.  I’d
> say the value is debatable.
> (It’s a CHECKNEXT in llvm/test/CodeGen/PowerPC/testCompareslleqsi.ll if
> someone wants to fix it.)

I'm not keen on this becoming something that is forbidden, since I could
imagine myself running into this on occasion, particularly when using
custom check prefixes shared between cases - it's not unusual for me to
name such prefixes as something like "FOO", "BAR" and "FOOBAR", where FOO
is for case 1, BAR is for case2 and FOOBAR is used by both. If BAR happened
to be a different name that clashes with a known suffix (e.g. LABEL), then
I'd get an unwanted false positive.

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

I agree that checking for them all seems reasonable, though perhaps it
might be nice for this to be user-configurable somehow (I'm thinking
FileCheck tests themselves might run into things confusingly). It seems to
me that it would be easy to auto-generate the combinatorial list in code
and then do a simple check for the prefix being in the list.

> --paulr
> *From:* llvm-dev <llvm-dev-bounces at lists.llvm.org> *On Behalf Of *Jon
> Roelofs via llvm-dev
> *Sent:* Friday, April 3, 2020 12:58 PM
> *To:* llvm-dev at lists.llvm.org
> *Subject:* [llvm-dev] [RFC] Improving FileCheck
> 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).
> 1: https://reviews.llvm.org/D77227
> 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.
> CHECK:            legitimate test
> CHECK             gotcha A
> CHECK :           gotcha B
> CHECKNEXT:        gotcha C
> CHECKDAG:         gotcha D
> CHECK_NOT:        gotcha E
> Gotcha A
> --------
> CHECK  gotcha A
> 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.
> In the review thread, a couple of issues surfaced with simply matching on
> `${CHECKNAME}\b`, making that less attractive as a remedy:
> 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.
> A2) There are a few RUN lines with missing colons, though those seem
> infrequent enough to not worry about [5].
> 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.
> 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.
> 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].
> 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]:
> > Consider this example that has a well formed directive that doesn't
> follow the rule:
> >
> > // FIXME(201806L) CHECK: assert: 0
> > 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.
> >
> > 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).
> >
> > 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 :
> 2: llvm/test/Transforms/InstCombine/phi-preserve-ir-flags.ll
> 3: https://reviews.llvm.org/D77227#1955596
> 4:
> https://github.com/llvm/llvm-project/blob/56decd982dc03a74d1796d9d4dbd7d9e0cea98dc/llvm/lib/Support/FileCheck.cpp#L1141
> 5: llvm/test/CodeGen/AArch64/speculation-hardening.ll
> 6: llvm/test/MC/ARM/dwarf-asm-multiple-sections.s:88
> 7: https://reviews.llvm.org/differential/diff/254562
> 8: https://reviews.llvm.org/D77227#1958228
> Gotcha B
> --------
> CHECK :  gotcha B
> 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).
> 9: https://reviews.llvm.org/D77227#1959041
> Gotchas C, D, E
> ---------------
> 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.
> ??? F, G
> --------
> 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).
> --
> Jon Roelofs
> jroelofs at jroelofs.com
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200406/8437be67/attachment.html>

More information about the llvm-dev mailing list