如何知道每个mcpu和march选项的clang和gcc启用了哪些优化?

时间:2014-01-12 04:33:41

标签: gcc optimization clang

Clang和GCC有两个开关-mcpu-march,以启用某些特定于所选CPU的优化。即-march=i686在内部启用-mmmx-msse等等。

我想知道是否有一些命令显示每个CPU的marchmcpu启用了哪些开关。我更喜欢一个命令,但我也接受带有信息的代码位置的答案。

2 个答案:

答案 0 :(得分:4)

对于gcc,请尝试

gcc -mcpu=native -Q --help=target

它打印的第一行:

  

gcc:警告:'-mcpu ='已弃用;使用'-mtune ='或'-march ='   代替

接着是

The following options are target specific:
  -m128bit-long-double                  [disabled]
  -m32                                  [disabled]
  -m3dnow                               [disabled]
  -m3dnowa                              [disabled]
  -m64                                  [enabled]
  -m80387                               [enabled]
  -m8bit-idiv                           [disabled]
   [...]

这回答了gcc的部分。


不幸的是,我对clang并不熟悉。到目前为止我能想到的最好的是:

clang --target=i386 -### myfile.c

-###使选项显示。手臂显示不同的东西。我不确定你是否足够。

设置选项的文件似乎是Targets.cpp,虽然它没有太多帮助,因为它是一个5.8k行长文件。

在查看llvm代码生成后,我的印象是clang / LLVM没有像gcc那么多的目标特定选项。请参阅示例the target-specific feature matrix或暴露(记录)options of llc

还有一件事:clang暴露了更少的编译器优化选项。例如,有no -finline-limit analogue exposed in clang.

可能-###打印出所有曝光的内容。

答案 1 :(得分:1)

如上所述,gcc -Q --help=target以易于阅读的形式打印有关优化的信息。

clang似乎没有特定的选择。但是,如果您将简单程序编译为LLVM IR,则可以检索到一些信息。

示例命令:

echo 'int main(){}' | clang -S -emit-llvm -x c - -o - | grep attributes

示例输出:

attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="all" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }

在clang-10上测试。