Is -disable-llvm-passes and -disable-llvm-optzns different?

Hi guys,

According to this patch review:
Title: Remove the ‘-disable-llvm-passes’ flag (which I didn’t even know existed, and I suspect many others aren’t aware of either) and strength ‘-disable-llvm-optzns’ to do the same thing
Link: https://reviews.llvm.org/D28047

-disable-llvm-optzns and -disable-llvm-passes are aliasing each other.

1. Both can be passed to cc1 w/ -Xclang when compilation is run to finish.
E.g

[twang15@c89 temp]$ clang++ -O2 -Xclang -disable-llvm-optzns -save-temps LULESH.cc
[twang15@c89 temp]$ cp a.out a.out.1
[twang15@c89 temp]$ clang++ -O2 -Xclang -disable-llvm-passes -save-temps LULESH.cc

[twang15@c89 temp]$ diff a.out a.out.1
[twang15@c89 temp]$

2. Both cannot be passed w/ -mllvm without -emit-llvm -c

[twang15@c89 temp]$ clang++ -O2 -mllvm -disable-llvm-optzns -save-temps LULESH.cc
clang (LLVM option parsing): Unknown command line argument ‘-disable-llvm-optzns’. Try: ‘clang (LLVM option parsing) -help’
clang (LLVM option parsing): Did you mean ‘-disable-cgp-gc-opts’?

[twang15@c89 temp]$ clang++ -O2 -mllvm -disable-llvm-passes -save-temps LULESH.cc
clang (LLVM option parsing): Unknown command line argument ‘-disable-llvm-passes’. Try: ‘clang (LLVM option parsing) -help’
clang (LLVM option parsing): Did you mean ‘-disable-cleanups’?

3. However, -disable-llvm-optzns can be passed w/ -mllvm when -emit-llvm is also passed, but -disable-llvm-passes cannot

[twang15@c89 temp]$ clang++ -O2 -mllvm -disable-llvm-optzns -save-temps -emit-llvm -c LULESH.cc

[twang15@c89 temp]$ clang++ -O2 -mllvm -disable-llvm-passes -save-temps -emit-llvm -c LULESH.cc
clang (LLVM option parsing): Unknown command line argument ‘-disable-llvm-passes’. Try: ‘clang (LLVM option parsing) -help’
clang (LLVM option parsing): Did you mean ‘-disable-cleanups’?

My questions:

  1. Is there a bug?

  2. Lastly, try as clang instructs me: Try: ‘clang (LLVM option parsing) -help’

[twang15@c89 temp]$ clang (LLVM option parsing) -help
-bash: syntax error near unexpected token `LLVM’

Can clang give me more helpful information on which flags can be passed with mllvm and which can be passed with -Xclang?

  1. It seems to me clang cc1 has at least two major stages to handle *bc file.
    The first stage is to transform c/c++ to bc without any or w/ little optimizations, and -disable-llvm-passes is enabled by default.

The second stage is to optimize bc files and output .s assembly. And by default, -disable-llvm-passes is disabled for this stage. -Xclang -disable-llvm-passes or -Xclang disable-llvm-optzns will affect this stage.

Is this a correct understanding? or Partially correct? Where -mllvm options come into play?

Thanks a lot!

There’s a hack in lib/Driver/ToolChains/Clang.cpp to accept “-mllvm -disable-llvm-optzns” as a hack for legacy compatibility. It’s deprecated and the -Xclang spelling should be used.

There does appear to be a bug with “-mllvm -disable-llvm-optzns” and -save-temps. -save-temps causes clang to be invoked separately to text assembly into binary code, and it looks like that call to clang gets -mllvm -disable-llvm-optzns passed to it but it isn’t capable of handling it. You can see this if you add “-v” to your command line so you can see all the subprocesses that get invoked.

For the -help question, when clang printed “Try: ‘clang (LLVM option parsing) -help’” it was trying and failing to tell you to type “clang -mllvm -help” or “clang -mllvm -help-hidden”. This will print the help from the llvm components.

Quick results:

[twang15@c89 temp]$ clang -mllvm -help
clang-5.0: error: no input files
[twang15@c89 temp]$ clang -mllvm -help-hidden
clang-5.0: error: no input files
[twang15@c89 temp]$ clang -mllvm --help-hidden
clang-5.0: error: no input files
[twang15@c89 temp]$ clang -mllvm --help
clang-5.0: error: no input files

Anything wrong?

For some stupid reason you need to give clang a .c or .cc file to get it to print the help.

clang -O3 -mllvm -help -c LULESH.cc succeeds.

Thanks for pointing this out.

The following is a more extensive test.

//succeed means dumping help info without Error message.

clang -help #succeed

‘clang -help-hidden’ #Fail

‘clang --help-hidden’ #Succeed

clang -mllvm -v -help #Succeed

clang -mllvm -v -help-hidden #Fail
clang -mllvm -v --help-hidden #Succeed

‘clang -mllvm -help -c LULESH.cc’ #Succeed

‘clang -mllvm -help LULESH.cc’ # Fail

clang -cc1 -help #Succeed

clang -cc1 -help-hidden #Fail . (may be no hidden option)

clang -cc1 --help-hidden #Fail

opt -help #Succeed
opt --help #Succeed
opt -help-hidden #Succeed
opt --help-hidden #Succeed

llc -help #Succeed
llc --help #Succeed
llc -help-hidden #Succeed
llc --help-hidden #Succeed

lld -help #Succeed
lld --help #Succeed
lld -help-hidden #Fail (may be no hidden option)
lld --help-hidden # Fail

clang -cc1as -help #Succeed

clang -cc1as --help #Succeed
clang -cc1as -help #Fail (may be no hidden option)
clang -cc1as --help #Fail

Also, options dumped by ‘clang -help’ is a subset of ‘clang -cc1 -help’.