[llvm-dev] [cfe-dev] When to use '-mcpu' versus '-march'

Eric Christopher via llvm-dev llvm-dev at lists.llvm.org
Tue Mar 20 13:37:37 PDT 2018


Hi Martin,

On Tue, Mar 20, 2018 at 1:18 PM Martin J. O'Riordan <MartinO at theheart.ie>
wrote:

> Thanks Eric,
>
>
>
> After the original reply to my query I had a good look at the GCC
> documentation for these options, and what I discovered is that “there is no
> consensus” in GCC.  Basically, saying do what GCC does was a non-answer as
> it clarified nothing.
>
>
>

That's why I made the comments I did on a generic new target which is the
suggested consensus.


> X86 has deprecated ‘-mcpu’ in favour of ‘-mtune’, and it uses ‘-mtune’ to
> mean that the scheduling, etc. should be biased in favour of more
> performant code for the processor identified by ‘-mtune’, but that the
> code is still 100% functional on all other processors in the family
> identified by ‘-march’.
>
>
>

This is correct.


> MIPS and ARM seem to have a very different notion of what they mean, and
> at the end of my examination of these options, I came to the conclusion
> that there is no common convention for usage and it all seems very
> haphazard.
>
>
>

MIPS is very specific to using -march and -mtune. -mcpu is an alias to
(-march/-mtune).

This is what I suggest to people wanting to have new ports.


> With the processor that I am targeting, the notion of tuning schedules for
> a particular variant is meaningless, because the schedule is critical in
> the absence of interlocked instruction execution (and VLIW).  This
> effectively means that ‘-mtune’ is not appropriate to my platform and
> leaves me with the toss-up of ‘-mcpu’ versus ‘-march’, and to tell you
> the truth, I can see little reason to choose one over the other.
>
>
>

-mtune is used for more than scheduling.


> Most of the time, I want to differentiate based on ISA versions.  That is,
> the code should be generated for one version of the ISA or another, though
> for the same basic architecture (ISA can vary a lot from version to
> version).  ARM seems to use ‘-march’ and ‘-mcpu’ more or less
> interchangeably, and uses ‘+’ to add features to the value specified.
>
>
>

That's not quite true either and is subtle behavior. Overall I think the
ARM strategy is the worst compiler argument method to copy.


> The majority of GCC target only use ‘-mcpu’, so I think that in the
> absence of any real and meaningful best practice, that I will just stick
> with the triples and ‘-mcpu’.
>
>
>

I'd really suggest you not do this, but since it's going to be an out of
tree target you, may, of course do what you want.

-eric

All the best,
>
>
>
>             MartinO
>
>
>
> *From:* cfe-dev [mailto:cfe-dev-bounces at lists.llvm.org] *On Behalf Of *Eric
> Christopher via cfe-dev
> *Sent:* 20 March 2018 17:50
> *To:* Richard Hadsell <hadsell at blueskystudios.com>
> *Cc:* Clang Dev <cfe-dev at lists.llvm.org>
> *Subject:* Re: [cfe-dev] When to use '-mcpu' versus '-march'
>
>
>
> Hi Richard,
>
> On Tue, Mar 20, 2018 at 9:33 AM Richard Hadsell <
> hadsell at blueskystudios.com> wrote:
>
> Does clang differ from g++ in this respect?
>
>
>
> It shouldn't, we strive for compatibility here.
>
>
>
> This is from the man page for g++ 4.8.5 for Intel x86 and x86-64
> processors:
>
>
>
> This is because this is for the in-tree x86 target. ARM is different. Mips
> is more like what I said. mn10300 is more like what I said. Power is
> different again, and in a different way.
>
>
>
> However, Martin was asking about a non-specific out of tree target and the
> advice there should still hold.
>
>
>
> -eric
>
>
>
>         -march=cpu-type
>             Generate instructions for the machine type cpu-type.  In
> contrast to -mtune=cpu-type, which merely tunes the generated code
>             for the specified cpu-type, -march=cpu-type allows GCC to
> generate code that may not run at all on processors other than the
>             one indicated.  Specifying -march=cpu-type implies
> -mtune=cpu-type.
> ...
>         -mtune=cpu-type
>             Tune to cpu-type everything applicable about the generated
> code, except for the ABI and the set of available instructions.
>             While picking a specific cpu-type schedules things
> appropriately for that particular chip, the compiler does not generate any
>             code that cannot run on the default machine type unless you
> use a -march=cpu-type option.  ...
> ...
>         -mcpu=cpu-type
>             A deprecated synonym for -mtune.
>
>
>
> On 03/20/2018 12:40 AM, Eric Christopher via cfe-dev wrote:
> > Hi Martin,
> >
> > Sorry about the delay here, but I've got some advice even though a lot
> of things aren't solid anywhere.
> >
> > a) Does this match an out of tree target for gcc? If so, I'd match that.
> > b) Typically -march/-mtune (though the latter isn't supported in llvm at
> the moment, see an earlier post from me to llvm-dev on how to support that)
> are what I'd use for new ports. We used it in a number of new/out of tree
> ports in gcc as well.
> > c) -mcpu is occastionally used for "-march+-mtune" when -march by itself
> is generally "this architecture, but generic tuning".
> >
>
> --
>
> Dick Hadsell                    203-992-6320 <(203)%20992-6320>  Fax:
> 203-992-6001 <(203)%20992-6001>
> Reply-to:                       hadsell at blueskystudios.com
> Blue Sky Studioshttp://www.blueskystudios.com
> 1 American Lane, Greenwich, CT 06831
> <https://maps.google.com/?q=1+American+Lane,+Greenwich,+CT+06831&entry=gmail&source=g>
> -2560
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180320/577f62b6/attachment.html>


More information about the llvm-dev mailing list