[RFC] Lanai backend

The ISA & encoding is documented in the comments and diagrams of
lib/Target/Lanai/LanaiInstrFormats.td. If that makes sense I'll add a
link to this tablegen in docs/CompilerWriterInfo.rst.

Generally CompilerWriterInfo is reserved for "official" documents from
hardware vendors.

One of the main uses of CompilerWriterInfo is to have authoritative specs
that can be used to make decisions about whether our backends are correct
or not, so it is somewhat tautological to link to our backends :slight_smile:

-- Sean Silva

From: "Chris Lattner via llvm-dev" <llvm-dev@lists.llvm.org>
To: "Jacques Pienaar" <jpienaar@google.com>
Cc: llvm-dev@lists.llvm.org
Sent: Tuesday, February 9, 2016 4:37:18 PM
Subject: Re: [llvm-dev] [RFC] Lanai backend

>
> Hi all,
>
> We would like to contribute a new backend for the Lanai processor
> (derived from the processor described in [1]).

Hi Jacques,

We generally have a low bar for accepting new “experimental”
backends, but I think that this is the first proposal to add a
target for a hardware that general LLVM contributors can’t have
access to. As such, we’ll have to figure out as a community whether
this makes sense.

Here are the tradeoffs I see of accepting the backend:

1) I imagine that there is a big win for you, not having to merge
with mainline. Maintaining an out of tree backend is a pain :slight_smile:

2) For the community, this is probably a net loss since changes to
common codegen could would be required to update your backend, but
no one else in the community would benefit from the target being in
mainline.

In my experience, updating backend code to deal with API changes, etc. is a much smaller problem than trying to update updating regression tests to account for changes in common code. As a result, making sure that the regression tests are well written (use regular expressions instead of hard-coded register numbers, CHECK-DAG, etc. where appropriate), and documented to make clear what is being tested is very important.

That having been said, the regression tests are, in a sense, the most valuable contribution a backend like this makes. They'll test the common codegen code in configurations not hit by the other backends (yet!), and the more of that the better. Plus, the more regression tests we have, the better self hosting becomes as a test on all targets :wink:

3) There is probably a small but non-zero benefit to keeping your
team working directly on mainline, since you’re more likely to do
ancillary work in ToT. If your development is in mainline, this
work is most likely to go into llvm.org instead of into your local
branch.

This really depends on the development philosophy adopted by the backend maintainers. If code that *should* be common code is put up for review and properly integrated into the common infrastructure, then it can be a big win. I've not yet met a backend for real hardware that did not require at least some common codegen enhancement to function well, and these enhancements often end up helping at least some other targets. If, on the other hand, deficiencies in the common codegen are just hacked around in the backend, or enhancements otherwise live only there, the value to the community will be much smaller.

At this point, I trust Google to do the right thing here.

-Hal

From: "C Bergström via llvm-dev" <llvm-dev@lists.llvm.org>
To: "Jacques Pienaar" <jpienaar@google.com>
Cc: "llvm-dev" <llvm-dev@lists.llvm.org>
Sent: Tuesday, February 9, 2016 4:53:14 PM
Subject: Re: [llvm-dev] [RFC] Lanai backend

> The ISA & encoding is documented in the comments and diagrams of
> lib/Target/Lanai/LanaiInstrFormats.td. If that makes sense I'll add
> a link
> to this tablegen in docs/CompilerWriterInfo.rst.

Some driveby comments -

If the processor isn't encumbered and by this I mean any company
could
in theory make a "Lanai compatible" processor, then I personally
would
be supportive or middle path. If on the other hand the processor is
highly proprietary or encumbered (patents?) then I'd more in the
middle or slightly against.

This is an important point.

Whether or not the ISA is encumbered in the sense you mentioned does not affect my view on whether it should be accepted upstream or not, however, given the potential for such a backend to serve educational purposes, I think it is important that Google make the relevant legal status of the ISA clear.

-Hal

>
> Hi all,
>
> We would like to contribute a new backend for the Lanai processor
(derived from the processor described in [1]).

Hi Jacques,

We generally have a low bar for accepting new “experimental” backends, but
I think that this is the first proposal to add a target for a hardware that
general LLVM contributors can’t have access to. As such, we’ll have to
figure out as a community whether this makes sense.

Here are the tradeoffs I see of accepting the backend:

1) I imagine that there is a big win for you, not having to merge with
mainline. Maintaining an out of tree backend is a pain :slight_smile:

2) For the community, this is probably a net loss since changes to common
codegen could would be required to update your backend, but no one else in
the community would benefit from the target being in mainline.

3) There is probably a small but non-zero benefit to keeping your team
working directly on mainline, since you’re more likely to do ancillary work
in ToT. If your development is in mainline, this work is most likely to go
into llvm.org instead of into your local branch.

4) There could be an educational benefit of having the backend,
particularly if it has unique challenges to overcome.

What do others think about this? I know that several organizations have
not even bothered proposing internal-only targets for inclusion in
llvm.org, since they would effectively be contributing dead code that the
community would have to maintain.

One data point (IIRC) is that the NVPTX backend sat in tree for a long time
without a way to actually use them. But lately this has been opening up
(e.g. Compiling CUDA with clang — LLVM 18.0.0git documentation). However, the obstacle
for NVPTX was mostly a software proprietary-ness (no way to plug it into
the driver stack really, except via nvidia's own proprietary software),
whereas the actual hardware was available. For the Lanai stuff, it seems
like the hardware is fundamentally not available for purchase.

The reverse situation is with e.g. Apple's GPU backends, where the devices
are readily available, but (AFAIK) even if the backend were open-source you
couldn't run the code produced by the open-source compiler.

Or to put it in matrix form (this is all heavily prefixed by "AFAIK";
corrections welcome):

AMDGPU: InTree:Yes DevicesAvailable:Yes CanIRunTheCode:Yes
NVPTX: InTree:Yes DevicesAvailable:Yes CanIRunTheCode:Yes
Lanai: InTree:? DevicesAvailable:No CanIRunTheCode:No
Apple GPU's: InTree:No DevicesAvailable:Yes CanIRunTheCode:No

I couldn't come up with a good name for "Can I Run The Code" column.
Basically it means: "assuming the backend were in open source, could I
actually run the code produced by the open source backend somehow?".

I had a quick look at lib/Target and it seems like every backend we have
has "CanIRunTheCode:Yes" in theory.
IIRC, the NVPTX stuff used to actually be "No" though?

Anyway, just a random thought. Not sure what the conclusion is.

-- Sean Silva

>
> Hi all,
>
> We would like to contribute a new backend for the Lanai processor
(derived from the processor described in [1]).

Hi Jacques,

We generally have a low bar for accepting new “experimental” backends,
but I think that this is the first proposal to add a target for a hardware
that general LLVM contributors can’t have access to. As such, we’ll have
to figure out as a community whether this makes sense.

Here are the tradeoffs I see of accepting the backend:

1) I imagine that there is a big win for you, not having to merge with
mainline. Maintaining an out of tree backend is a pain :slight_smile:

2) For the community, this is probably a net loss since changes to common
codegen could would be required to update your backend, but no one else in
the community would benefit from the target being in mainline.

3) There is probably a small but non-zero benefit to keeping your team
working directly on mainline, since you’re more likely to do ancillary work
in ToT. If your development is in mainline, this work is most likely to go
into llvm.org instead of into your local branch.

4) There could be an educational benefit of having the backend,
particularly if it has unique challenges to overcome.

What do others think about this? I know that several organizations have
not even bothered proposing internal-only targets for inclusion in
llvm.org, since they would effectively be contributing dead code that
the community would have to maintain.

One data point (IIRC) is that the NVPTX backend sat in tree for a long
time without a way to actually use them. But lately this has been opening
up (e.g. Compiling CUDA with clang — LLVM 18.0.0git documentation). However, the
obstacle for NVPTX was mostly a software proprietary-ness (no way to plug
it into the driver stack really, except via nvidia's own proprietary
software

To clarify: I mean that only the proprietary software could use the backend
in a useful way. Not that at some point in the driver stack proprietary
software was needed.

-- Sean Silva

From: "Hal Finkel via llvm-dev" <llvm-dev@lists.llvm.org>
To: "C Bergström" <cbergstrom@pathscale.com>
Cc: "llvm-dev" <llvm-dev@lists.llvm.org>
Sent: Tuesday, February 9, 2016 6:11:14 PM
Subject: Re: [llvm-dev] [RFC] Lanai backend

> From: "C Bergström via llvm-dev" <llvm-dev@lists.llvm.org>
> To: "Jacques Pienaar" <jpienaar@google.com>
> Cc: "llvm-dev" <llvm-dev@lists.llvm.org>
> Sent: Tuesday, February 9, 2016 4:53:14 PM
> Subject: Re: [llvm-dev] [RFC] Lanai backend
>
> > The ISA & encoding is documented in the comments and diagrams of
> > lib/Target/Lanai/LanaiInstrFormats.td. If that makes sense I'll
> > add
> > a link
> > to this tablegen in docs/CompilerWriterInfo.rst.
>
> Some driveby comments -
>
> If the processor isn't encumbered and by this I mean any company
> could
> in theory make a "Lanai compatible" processor, then I personally
> would
> be supportive or middle path. If on the other hand the processor is
> highly proprietary or encumbered (patents?) then I'd more in the
> middle or slightly against.

This is an important point.

Whether or not the ISA is encumbered in the sense you mentioned does
not affect my view on whether it should be accepted upstream or not,
however, given the potential for such a backend to serve educational
purposes, I think it is important that Google make the relevant
legal status of the ISA clear.

To be clear, I don't think that clarifying their feelings on independent ISA implementations should be a prerequisite to upstreaming their backend. However, such a clarification certainly affects the educational value of the backend. Given that the ISA seems simple enough to be valuable in a classroom setting, such a clarification would seem practically useful.

-Hal

Hi Sean

I think you’ve summed it up really well here.

Personally I don’t think we should accept backends for which there is no way to run the code. The burden (however small) on the community to having an in-tree backend they can’t use is too high IMO.

As you point out ‘no way to run the code’ may mean not having access to HW, or having HW but no API.

NVPTX is a good example. Now you can take the output from LLVM and run it on HW. It may or may not be how Nvidia do it in their code, but that doesn’t matter, you can do it. Same for AMDGPU.

So -1 from me to having backends we can’t make use of.

Finally, one option is to have perpetually experimental backends. Then all the code is in tree but no-one in tree should ever be expected to update it. That does have the big advantage that all of the code is there to discuss and the maintainers can make contributions to common code and gain/provide help in the community. They can also be involved in discussions which impact them such as changes to common code.

Cheers,
Pete

From: "Pete Cooper via llvm-dev" <llvm-dev@lists.llvm.org>
To: "Sean Silva" <chisophugis@gmail.com>
Cc: "llvm-dev" <llvm-dev@lists.llvm.org>
Sent: Tuesday, February 9, 2016 10:59:58 PM
Subject: Re: [llvm-dev] [RFC] Lanai backend

Hi Sean

I think you’ve summed it up really well here.

Personally I don’t think we should accept backends for which there is
no way to run the code. The burden (however small) on the community
to having an in-tree backend they can’t use is too high IMO.

As you point out ‘no way to run the code’ may mean not having access
to HW, or having HW but no API.

Out of curiosity, would the existence of some kind of open-source emulator affect your opinion on this? Or does it need to be actual hardware?

-Hal

I dunno.
We consistently tell pretty much everyone we’d love for them to work upstream. We see orgs work on general optimizations, etc, out of tree, and tell them “you really should try to upstream it”. I can’t count the number of times people say this to others at the dev conference, no matter what they are doing.

It’s one thing when the developers in question just want a backend and contribute nothing else and want everyone else to deal with it and keep it running. I’d agree that provides burden and nothing else. That seems pretty unlikely here.

It’s not like the optimizations/general infrastructure we are writing/people improve gets used in a vacuum. It’s meant to speed up code on various platforms. IMHO, given what we try to encourage as best practices, it seems fundamentally wrong deliberately tell others (who seem to want to work with the community, and are otherwise likely to be good contributors): “yeah, we really don’t want you to contribute to LLVM upstream” or “Yeah, well, we’ll take your general contributions, but we don’t want the rest of your stuff, no matter how well designed/architected”. Attracting contributors is a two way street that requires a show of good faith and understanding on both sides.

The one problem you identify, the burden of running code on backends for proprietary hardware, seems pretty tractable to solve. For example, one possible option:
We don’t let people revert patches for runtime failures in backends that nobody can run.

(IE you update the API, try to do the right thing, and if it passes the regression tests, that’s that. Even for code gen tests, if it’s not obvious what the right code to generate is, that’s the maintainers problem).

So they get the benefit of the API updates people can perform, etc. We don’t end up with the burden of trying to work to fix stuff at runtime without hardware that can be used, and we get the benefit of what those contributors are willing to contribute.

(At the very least, IMHO, it seems worth experimenting to see whether the burdens do outweigh the benefits over time. I don’t think we actually have good data on this, we are all just kind of guessing based on personal experiences).

From: “Pete Cooper via llvm-dev” <llvm-dev@lists.llvm.org>
To: “Sean Silva” <chisophugis@gmail.com>
Cc: “llvm-dev” <llvm-dev@lists.llvm.org>
Sent: Tuesday, February 9, 2016 10:59:58 PM
Subject: Re: [llvm-dev] [RFC] Lanai backend

Hi Sean

I think you’ve summed it up really well here.

Personally I don’t think we should accept backends for which there is
no way to run the code. The burden (however small) on the community
to having an in-tree backend they can’t use is too high IMO.

As you point out ‘no way to run the code’ may mean not having access
to HW, or having HW but no API.

Out of curiosity, would the existence of some kind of open-source emulator affect your opinion on this? Or does it need to be actual hardware?

I guess hardware isn’t even the correct term given we have BPF which I think is a virtual ISA of some kind.

I’d be ok with targeting an emulator, but with the caveat that people are actually using the emulator. An emulator which exists purely to get this backend in to LLVM isn’t useful, but one which people do use for education or otherwise is useful. But it really should have users outside of just the people who have access to the real HW.

Perhaps this can be an experimental backend to give time for an emulator and community to grow around it, and then we can decide later whether to promote to a first class backend? Then we still have options, including just continuing as an experimental backend for longer if thats best.

As a small digression, I would say that this has raised a very valid discussion about the code that ends up in LLVM and is built as standard. I don’t know, nor am I going to look, but I think the same could (should?) be applied to other code like passes. If a pass isn’t used by anyone in tree then should it be in tree?

Pete

I'm rarely the warm fuzzy person, but I really like this view.

In reply to Hal's reply:

Even for educational use I hope Google or the "owner" would clarify
what's permitted or any related patents. I'm not trying to create
obstacles, but it's good to have as many facts as possible.
(Personally I do think such clarification is a blocker, but being
encumbered wouldn't necessarily be a blocker)

You’ve raised an important point here Pete, and while I disagree pretty strongly with it (regardless of whether Lanai makes sense or not), I’m glad that you’ve surfaced it where we can clearly look at the issue.

The idea of “it really should have users outside of just the people who have access to the HW” I think is deeply problematic for the project as a whole. Where does it stop?

While I may have the theoretical ability to get access to an AVR, Hexagon, MSP430, SystemZ, or XCore processor… It is a practical impossibility. There is no way that I, or I suspect 95% of LLVM contributors, will be able to run code for all these platforms. And for some of them, I suspect it is already the case that their only users have access to specialized, quite hard to acquire hardware (both Hexagon[1] and SystemZ come to mind).

But I really don’t think we want to kick any of these backends out of LLVM, or that they were a mistake to include in the first place. So the question really is whether the lack of theoretical access matters substantially more than lack of practical access.

This policy would also set an extremely alarming precedent to me at least, maybe one that you’re not even intending: what’s the difference between hardware and an operating system? I don’t think we want to limit the operating system support of Clang to those which are readily accessible. Lots of folks don’t have a practical ability to use Apple’s operating system because they don’t own any of Apple’s hardware. And the reverse is of course true – I think if you work at Apple and only own Apple hardware, you probably shoudn’t be expected to boot Windows or Linux and debug something.

We have a growing history of support diverse platforms, both hardware and software. And when we do this, we rely on the community contributors who care deeply about those platforms to bridge the gap and support those developers who don’t have ready access to the platform. I don’t want to see this change, as I think it has been absolutely critical to the community growing and thriving over the past few years. My best memory of this is with AMDGPU (which is why I brought it up, I agree with others that MSP430 or XCore are perhaps better examples here). I was making a change to a DAG combine of some form and it ended up regressing the AMDGPU (R600 at the time) regression tests. I was completely lost. While in theory, I could go pick up such a GPU and install it in a machine to test things out, in practice I’m never going to do that. If that were the requirement, I would just have to abandon such changes. But instead, Tom and Matt bent over backwards to help me out, looked at all the test case updates I sent them and helped verify that indeed, the changes were harmless or even helpful. I didn’t need hardware, an emulator, or even an ISA spec. And I think this is awesome.

So regardless of what we do with Lanai, I feel really strongly that we don’t want to use “have other users” or “can run the code” as the bar for supporting platforms.

But all that really doesn’t mean we should necessarily adopt Lanai. I think this is probably the nearest tradeoff the community has looked at (that’s actually one reason I worked internally to see if we could contribute the backend). And it is definitely is a tradeoff.

IMO, it is worth the tradeoff, just like it was for BPF, AMDGPU, and others. Our goal should be to get more upstream contributors and LLVM developers, and to the extent that we can do that by encouraging people working on new (to the community) platforms, whether software or hardware, to work on them upstream and in-tree, I think we should.

Personally, I’m not concerned about how encumbered in any sense SystemZ is or isn’t (I have no idea about such things). I don’t care that I’m completely unlikely to be able to get a SystemZ system, or even an emulator. I’m probably not going to spend a whole lot of time trying to read the entire ISA spec. To me, while those things would help motivate the issue, they’re not the operative factor in my decision. Instead, the fact that IBM contributed SystemZ, maintained it, and was able to do more work in-tree was justification enough.

My 2 cents, sorry I took so many words to express them. =]
-Chandler

[1] Yes, I know Hexagon chips are present all over Android devices, but I have no idea how one would go about actually programming most of them. Maybe it’s actually much easier than I imagine, if so, apologize. My impression has just been that Qualcomm (the producer of the Hexagon chips) is by far the largest user of the backend if not the exclusive user. None of this is a criticism of course! =]

Yes, I think this is a reasonable point. The cheapest SystemZ system is somewhere around $75K, so widespread availability isn’t really a relevant criteria for accepting that.

Given that, I personally have no objection to accepting the port as an experimental backend. For it to be a non-experiemental backend, I think it needs to have a buildbot running execution tests for the target. This can either be a simulator or google could host a buildbot on the hardware they presumably have and make the results public.

-Chris

Hi Sean

I think you’ve summed it up really well here.

Personally I don’t think we should accept backends for which there is no
way to run the code. The burden (however small) on the community to having
an in-tree backend they can’t use is too high IMO.

As you point out ‘no way to run the code’ may mean not having access to
HW, or having HW but no API.

NVPTX is a good example. Now you can take the output from LLVM and run it
on HW. It may or may not be how Nvidia do it in their code, but that
doesn’t matter, you can do it. Same for AMDGPU.

One thing to note is that all the leg work for getting CUDA working with
the open source toolchain (e.g.
Compiling CUDA with clang — LLVM 18.0.0git documentation) was done by Googlers
(Jingyue Wu, Artem Belevich, and probably others I don't remember off the
top of my head). In my experience with LLVM, the Google folks have been
first-rate open source citizens. Unless Jacques' team contributing here is
from a drastically different organization/culture within google (idk, are
they?), I have full faith that this is meant with the best intentions and
won't go the way of a "code drop".

So -1 from me to having backends we can’t make use of.

I'm not sure I agree on that. Assume for a second that we are in a
hypothetical world where the reasons for keeping the Apple GPU backends
private vanished (but the actual driver stack was still locked down; i.e.
CanIRunTheCode is still "No"). I would personally say that it would be
beneficial for LLVM to have those backends developed upstream if only so
that we can have Owen's team participating upstream more, as their
expertise is a huge asset to the community.

-- Sean Silva

So, while I’m personally happy with this answer, I’m curious: why do you think this important to have?

I can imagine several reasons myself, in the order they floated to mind:

  1. Makes sure it isn’t vaporware and actually works, etc.
  2. Ensures a fairly easy way to tell if the maintainers have gone out to lunch - no build bot stays working without some attention.
  3. Make it more clear whether a change to LLVM breaks that target

Are there other issues you’re thinking about?

Looking just at these three, they all seem reasonable goals. I can see other ways of accomplishing #1 and #2 (there are lots of ways to establish community trust), but cannot see any other way of accomplishing #3.

But I also see another option, which someone else mentioned up-thread: simply make only the regression tests be supported. Without a regression test case that exhibits a bug, no reverts or other complaints. It would be entirely up to the maintainer to find and reduce such test cases from any failure of execution tests out-of-tree.

I prefer this option for perhaps a strange reason: as an LLVM developer I would find it more appealing to only ever have to care about once the maintainer produced a reduced test case for me. Having a buildbot check the execution and fail is actually not terribly helpful to me in most cases. Sometimes I was already suspicious of a patch and it helpfully confirms my suspicions, but most of the time I’m going to need a test case to do anything useful with the failure and I won’t have the tools necessary to produce that test case merely because there is a build bot.

Anyways, as I said, I think this is somewhat theoretical at this point, but it seems useful to kind of pin down both what our expectations are and why.

-Chandler

You’ve raised an important point here Pete, and while I disagree pretty strongly with it (regardless of whether Lanai makes sense or not), I’m glad that you’ve surfaced it where we can clearly look at the issue.

The idea of “it really should have users outside of just the people who have access to the HW” I think is deeply problematic for the project as a whole. Where does it stop?

While I may have the theoretical ability to get access to an AVR, Hexagon, MSP430, SystemZ, or XCore processor… It is a practical impossibility. There is no way that I, or I suspect 95% of LLVM contributors, will be able to run code for all these platforms. And for some of them, I suspect it is already the case that their only users have access to specialized, quite hard to acquire hardware (both Hexagon[1] and SystemZ come to mind).

You’re right. I don’t even have access to a 486 which we probably support.

My point was just that I thought this would be our first backend for which it is impossible for anyone to use. It may be hard for me to get an MSP430, but I can. I can’t get a Lanai, possibly ever.

Now maybe you’re right, and Hexagon, or one of the other backends you mention, is unable to be useful in practice to the community. If that is the case then the precedent has already been set that we as a community are happy to work with (great) contributors who also provide some code we may not get a direct benefit from and occasionally have to help maintain with changes to common code.

I just didn’t want Lanai (or any other backend) to set that precedent without a discussion. And it sure looks like we have got that discussion. I definitely never wanted to imply anything negative about Lanai or the folks who work on it.

But I really don’t think we want to kick any of these backends out of LLVM, or that they were a mistake to include in the first place.

Nor do I.

So the question really is whether the lack of theoretical access matters substantially more than lack of practical access.

Again, depends if this point is what matters, but maybe its already been answered by other backends.

This policy would also set an extremely alarming precedent to me at least, maybe one that you’re not even intending: what’s the difference between hardware and an operating system? I don’t think we want to limit the operating system support of Clang to those which are readily accessible. Lots of folks don’t have a practical ability to use Apple’s operating system because they don’t own any of Apple’s hardware. And the reverse is of course true – I think if you work at Apple and only own Apple hardware, you probably shoudn’t be expected to boot Windows or Linux and debug something.

I’m not really sure how this applies to the OS. Do you mean not accepting patches which allow clang to run on an OS outside of the common ones? If so, yeah, that would be a problem, and not something I want to see. But there’s also a difference. Much of the OS code is #defined, whereas any backend which isn’t experimental is something of a burden. I’m not saying the burden isn’t worth it, but it is one nonetheless as your DAG combine example below is a great example of.

We have a growing history of support diverse platforms, both hardware and software. And when we do this, we rely on the community contributors who care deeply about those platforms to bridge the gap and support those developers who don’t have ready access to the platform. I don’t want to see this change, as I think it has been absolutely critical to the community growing and thriving over the past few years. My best memory of this is with AMDGPU (which is why I brought it up, I agree with others that MSP430 or XCore are perhaps better examples here). I was making a change to a DAG combine of some form and it ended up regressing the AMDGPU (R600 at the time) regression tests. I was completely lost. While in theory, I could go pick up such a GPU and install it in a machine to test things out, in practice I’m never going to do that. If that were the requirement, I would just have to abandon such changes. But instead, Tom and Matt bent over backwards to help me out, looked at all the test case updates I sent them and helped verify that indeed, the changes were harmless or even helpful. I didn’t need hardware, an emulator, or even an ISA spec. And I think this is awesome.

I’ve had a similar experience just a couple of weeks ago with someone (who i’d never had any interaction with before) who took my reverted patches and debugged and fixed the reason they broke on Windows with MSVC. Its awesome to be part of this. I’m not expecting anyone to have access to even a tiny fraction of the platforms we target, but personally I would prefer that they can have access to those platforms.

So regardless of what we do with Lanai, I feel really strongly that we don’t want to use “have other users” or “can run the code” as the bar for supporting platforms.

Personally I do want to set the bar there, but it seems I might be the only one, so i’m not going to keep forcing people to follow along with an ever increasing email chain.

Cheers,
Pete

You've raised an important point here Pete, and while I disagree pretty
strongly with it (regardless of whether Lanai makes sense or not), I'm glad
that you've surfaced it where we can clearly look at the issue.

The idea of "it really should have users outside of just the people who
have access to the HW" I think is deeply problematic for the project as a
whole. Where does it stop?

While I may have the theoretical ability to get access to an AVR, Hexagon,
MSP430, SystemZ, or XCore processor... It is a practical impossibility.
There is no way that I, or I suspect 95% of LLVM contributors, will be able
to run code for all these platforms. And for some of them, I suspect it is
already the case that their only users have access to specialized, quite
hard to acquire hardware (both Hexagon[1] and SystemZ come to mind).

But I really don't think we want to kick any of these backends out of
LLVM, or that they were a mistake to include in the first place. So the
question really is whether the lack of *theoretical* access matters
substantially more than lack of *practical* access.

This policy would also set an extremely alarming precedent to me at least,
maybe one that you're not even intending: what's the difference between
hardware and an operating system? I don't think we want to limit the
operating system support of Clang to those which are readily accessible.
Lots of folks don't have a practical ability to use Apple's operating
system because they don't own any of Apple's hardware. And the reverse is
of course true -- I think if you work at Apple and only own Apple hardware,
you probably shoudn't be expected to boot Windows or Linux and debug
something.

We have a growing history of support diverse platforms, both hardware and
software. And when we do this, we rely on the community contributors who
care deeply about those platforms to bridge the gap and support those
developers who don't have ready access to the platform. I don't want to see
this change, as I think it has been absolutely critical to the community
growing and thriving over the past few years. My best memory of this is
with AMDGPU (which is why I brought it up, I agree with others that MSP430
or XCore are perhaps better examples here). I was making a change to a DAG
combine of some form and it ended up regressing the AMDGPU (R600 at the
time) regression tests. I was completely lost. While in theory, I could go
pick up such a GPU and install it in a machine to test things out, in
practice I'm never going to do that. If that were the requirement, I would
just have to abandon such changes. But instead, Tom and Matt bent over
backwards to help me out, looked at all the test case updates I sent them
and helped verify that indeed, the changes were harmless or even helpful. I
didn't need hardware, an emulator, or even an ISA spec. And I think this is
*awesome*.

So regardless of what we do with Lanai, I feel really strongly that we
don't want to use "have other users" or "can run the code" as the bar for
supporting platforms.

I fully agree with your analysis here. As far as maintenance of the LLVM
project is concerned, leaning on active maintainers is the way that issues
get solved in practice, so the "can I run the code" quality isn't relevant
for maintenance.

I guess the "can I run the code" is more about enabling interesting/new use
cases for *users* of LLVM, for which the ability to generate code with LLVM
*and* run the code in their application is essential. But that is per se
outside the LLVM community and e.g. Hexagon and SystemZ are a precedent for
us not worrying too much about it.

-- Sean Silva

Are the existing non-experimental backends passing this bar: NVPTX, AMDGPU, Hexagon (?) , XCore, BPF, MSP430, Sparc ?
If not why make it a condition for Lanai?

While I'm here, FWIW it's a +1 for me to include it.
As much as I share Pete's point on the fact that it would be the first backend without an actual possible usage (outside of Google?), and the question I would ask would be about the added value compared to having it as a separate repo on GitHub.
I believe (as many others in this thread) that the potential added value (new contributors, image we give of the project, educational purpose, + others that we don't know about yet) makes it a clear net win for the project, and the policy on removing the backend if the maintainers disappear makes it low risk as well. (I still hope the code will be well documented (tablegen file included...), following LLVM coding standards, and will come with nice reduced and documented lit tests, so that maintaining this new backend will be a pleasure for everyone ;-))

You've raised an important point here Pete, and while I disagree pretty
strongly with it (regardless of whether Lanai makes sense or not), I'm glad
that you've surfaced it where we can clearly look at the issue.

The idea of "it really should have users outside of just the people who
have access to the HW" I think is deeply problematic for the project as a
whole. Where does it stop?

While I may have the theoretical ability to get access to an AVR, Hexagon,
MSP430, SystemZ, or XCore processor... It is a practical impossibility.
There is no way that I, or I suspect 95% of LLVM contributors, will be able
to run code for all these platforms. And for some of them, I suspect it is
already the case that their only users have access to specialized, quite
hard to acquire hardware (both Hexagon[1] and SystemZ come to mind).

You’re right. I don’t even have access to a 486 which we probably support.

My point was just that I thought this would be our first backend for which
it is impossible for anyone to use. It may be hard for me to get an
MSP430, but I *can*.

This actually got me curious really how difficult it is for each of LLVM's
backends, so I did an `ls` in lib/Target and here is what I know of as far
as getting a machine that you can run your own code on:

AArch64/ - obvious
AMDGPU/ - obvious
ARM/ - obvious
AVR/ - just get an arduino (e.g.
http://store-usa.arduino.cc/products/a000066)
BPF/ - run linux on most any hardware I think?
CppBackend/ - can we delete this :slight_smile:
Hexagon/ - e.g. Page No Longer Supported - Qualcomm Developer Network
($500)
MSP430/ - e.g. MSP-EXP430FR5969 | Buy TI Parts | TI.com (< $20)
Mips/ - e.g. https://www.arduino.cc/en/Main/ArduinoBoardYun or even your
friendly WRT54GL router.
NVPTX/ - obvious
PowerPC/ - lots of stuff in the embedded space for relatively cheap (e.g.
100's of $). If you have deep enough pockets you can buy servers.
Sparc/ - If you have deep enough pockets Oracle will sell you servers. You
can probably find something workstation-y on ebay (talk to netbsd folks
apparently NetBSD/sparc
NetBSD/sparc64). You can also probably synthesize
OpenSPARC for an FPGA setup in the <$10,000 range.
SystemZ/ - If you have deep enough pockets IBM will sell you one.
WebAssembly/ - You can probably pull some sort of bleeding edge V8 or
Mozilla repo. (being developed in the open, so "obvious" I guess)
X86/ - obvious
XCore/ - There are dev boards for <$200
http://www.xmos.com/support/boards?product=18230

This ignores all the issues of ISA subsets that we support. E.g. right now
I don't think it's possible to buy an x86 with AVX512 (but Skylake server
is coming soon), and some of the more esoteric ISA subsets for e.g. the
supercomputer PPC stuff or the high-end MIPS stuff (e.g. the chips used in
cellular base stations) are probably in SystemZ territory to get ahold of.

-- Sean Silva

Don’t forget the cost in time and effort. In some cases, those may outstrip the physical hardware costs.