[cfe-dev] [llvm-dev] difference between --target, -mcpu, -march

Krzysztof Parzyszek via cfe-dev cfe-dev at lists.llvm.org
Sat Mar 19 09:08:11 PDT 2016

On 3/19/2016 5:54 AM, Bruce Hoult via llvm-dev wrote:
> Would it be fair to say that an -march chooses an instruction set, while
> -mcpu will affect scheduling things such as how many instructions can be
> run in parallel and their latency etc?

 From what I remember, the meaning of march/mcpu differs between clang 
and LLVM's utilities (llc, etc.)  In clang, mcpu and march have a lot of 
overlap in terms of usage, and it seems to differ from one target to the 
next.  What you say would make sense, but, for example, we have legacy 
code that used -march=hexagonv5, where "hexagonv5" is actually a CPU 
version, something that intuitively should belong in "mcpu".  Hexagon 
doesn't seem to be the only one where "march" and "mcpu" are treated 
almost identically, I saw what looked like CPU names in the march string 
in other toolchains as well.

The clang documentation states:

   Target Selection Options
     .. option:: -arch <architecture>

     Specify the architecture to build for.

   .. option:: -march=<cpu>

     Specify that Clang should generate code for a specific processor 
     member and later.  For example, if you specify -march=i486, the 
compiler is
     allowed to generate instructions that are valid on i486 and later 
     but which may not exist on earlier ones.

mcpu is not mentioned at all.

For better or worse, clang is trying to emulate GCC's options, which 
have a long history behind them.  There is some general idea there, but 
I think the target/processor selection scheme has evolved beyond the 
point where it makes sense on all levels.


Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, 
hosted by The Linux Foundation

More information about the cfe-dev mailing list