[llvm-dev] [cfe-dev] RFC: End-to-end testing

Mehdi AMINI via llvm-dev llvm-dev at lists.llvm.org
Wed Oct 9 12:38:43 PDT 2019

On Wed, Oct 9, 2019 at 8:12 AM David Greene <dag at cray.com> wrote:

> Mehdi AMINI via cfe-dev <cfe-dev at lists.llvm.org> writes:
> >> I have a bit of concern about this sort of thing - worrying it'll lead
> to
> >> people being less cautious about writing the more isolated tests.
> >>
> >
> > I have the same concern. I really believe we need to be careful about
> > testing at the right granularity to keep things both modular and the
> > testing maintainable (for instance checking vectorized ASM from a C++
> > source through clang has always been considered a bad FileCheck
> practice).
> > (Not saying that there is no space for better integration testing in some
> > areas).
> I absolutely disagree about vectorization tests.  We have seen
> vectorization loss in clang even though related LLVM lit tests pass,
> because something else in the clang pipeline changed that caused the
> vectorizer to not do its job.

Of course, and as I mentioned I tried to add these tests (probably 4 or 5
years ago), but someone (I think Chandler?) was asking me at the time: does
it affect a benchmark performance? If so why isn't it tracked there? And if
not does it matter?
The benchmark was presented as the actual way to check this invariant
(because you're only vectoring to get performance, not for the sake of it).
So I never pursued, even if I'm a bit puzzled that we don't have such tests.

> We need both kinds of tests.  There are
> many asm tests of value beyond vectorization and they should include
> component and well as end-to-end tests.
> > For instance I remember asking about implementing test based on checking
> if
> > some loops written in C source file were properly vectorized by the -O2 /
> > -O3 pipeline and it was deemed like the kind of test that we don't want
> to
> > maintain: instead I was pointed at the test-suite to add better
> benchmarks
> > there for the end-to-end story. What is interesting is that the
> test-suite
> > is not gonna be part of the monorepo!
> And it shouldn't be.  It's much too big.  But there is a place for small
> end-to-end tests that live alongside the code.
> >>> We could, for example, create
> >>> a top-level "test" directory and put end-to-end tests there.  Some of
> >>> the things that could be tested include:
> >>>
> >>> - Pipeline execution (debug-pass=Executions)
> >>>
> >>> - Optimization warnings/messages
> >>> - Specific asm code sequences out of clang (e.g. ensure certain loops
> >>>   are vectorized)
> >>> - Pragma effects (e.g. ensure loop optimizations are honored)
> >>> - Complete end-to-end PGO (generate a profile and re-compile)
> >>> - GPU/accelerator offloading
> >>> - Debuggability of clang-generated code
> >>>
> >>> Each of these things is tested to some degree within their own
> >>> subprojects, but AFAIK there are currently no dedicated tests ensuring
> >>> such things work through the entire clang pipeline flow and with other
> >>> tools that make use of the results (debuggers, etc.).  It is relatively
> >>> easy to break the pipeline while the individual subproject tests
> >>> continue to pass.
> >>>
> >>
> >
> > I'm not sure I really see much in your list that isn't purely about
> testing
> > clang itself here?
> Debugging and PGO involve other components, no?

I don't think that you need anything else than LLVM core (which is a
dependency of clang) itself?

Things like PGO (unless you're using frontend instrumentation) don't even
have anything to do with clang, so we may get into the situation David
mentioned where we would rely on clang to test LLVM features, which I find

>   If we want to put clang
> end-to-end tests in the clang subdirectory, that's fine with me.  But we
> need a place for tests that cut across components.
> I could also imagine llvm-mca end-to-end tests through clang.
> > Actually the first one seems more of a pure LLVM test.
> Definitely not.  It would test the pipeline as constructed by clang,
> which is very different from the default pipeline constructed by
> opt/llc.

I am not convinced it is "very" difference (they are using the
PassManagerBuilder AFAIK), I am only aware of very subtle difference.
But more fundamentally: *should* they be different? I would want `opt -O3`
to be able to reproduce 1-1 the clang pipeline.
Isn't it the role of LLVM PassManagerBuilder to expose what is the "-O3"
If we see the PassManagerBuilder as the abstraction for the pipeline, then
I don't see what testing belongs to clang here, this seems like a layering
violation (and maintaining the PassManagerBuilder in LLVM I wouldn't want
to have to update the tests of all the subproject using it because they
retest the same feature).

> The old and new pass managers also construct different
> pipelines.  As we have seen with various mailing list messages, this is
> surprising to users.  Best to document and check it with testing.

Yes: both old and new pass managers are LLVM components, so hopefully that
are documented and tested in LLVM :)

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20191009/cf333ca6/attachment.html>

More information about the llvm-dev mailing list