使用clang优化编译选项/标志进行编译

3

我正在尝试使用clang3.4编译程序,但是我使用的优化选项被忽略了。

例如,我正在尝试编译并传递以下选项:-O1 -instcombine

但是我得到的结果是:

clang34: warning: argument unused during compilation: '-instcombine'

您可以在此处找到LLVM的所有可用优化传递列表,这个链接问题中也有。是否还有其他需要补充的?
谢谢。

我发现唯一没有被忽略的选项是-fstrict-aliasing,这个选项在我提供的两个链接中都没有列出。 - Paschalis
2个回答

6
这些是 LLVM 优化 Pass,并非 Clang 的。您无法直接调用 LLVM 优化 Pass。但是,您可以通过 -emit-llvm 选项发出 LLVM IR 并使用 opt 工具调用任何 LLVM 优化 Pass。

我有几个问题: 我在哪里可以找到clang优化标志? 我应该使用什么?clang的标志还是LLVM的传递? clang的标志是通过使用LLVM的传递实现的吗? - Paschalis
1
@Paschalis,请看我的回答 :) - Amir
只是提醒一下:实际上你可以使用类似 clang -cc1 -backend-option -instcombine 这样的命令来从 clang 中设置 LLVM 传递,但使用 opt 可能会更好。 - Max

2
如@Anton所述,这些编译器传递(passes)是用于llvm-opt而不是clang的,clang仅支持标准优化级别-O[X]。但是,如果您想使用编译器标志,例如"-instcombine",则必须在使用clang时添加选项-emit-llvm。
以下是一些注释和示例:
1. LLVM-opt的列表可以在这里找到。 2. 这是一个使用LLVM-opt的简短示例:
``` clang -S -emit-llvm foo.c -lm opt ${<MY_DESIRED_COMPILER_FLAGS>} -S -o foo_OPTIMIZED.ll foo.ll ```
``` clang foo_OPTIMIZED.ll -lm ```
现在,如果您对比两个版本的LLVM-IR或.ll文件,您就可以看到它们之间的差异。
3. 对整个项目进行OPT。
就此而言,您应该将这些命令放入循环中,并对您需要的每个文件都应用 opt。
或者,
编写一个 Makefile 为您完成这项工作。
或者,
创建您自己的传递,包括您所需的传递,并将它们作为 .so 文件包含。更多信息请点击这里! 希望能帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接