-qipa

适用的调用

表 1. 接受给定选项的调用
选项 xlc (编译 C) xlC (编译 C++) xlclang(编译 C) xlclang++(编译 C++)
-qipa
注: 此表中仅列出典型调用。 对于所有基本调用及其等效特殊调用,您可以参阅 编译器调用的完整列表

类别

优化和调整

等效编译指示

无。

用途

启用或定制“过程间分析”(IPA) 优化类型。

IPA 是一个两步过程: 第一步是在编译期间进行的,包括执行初始分析和在对象文件中存储过程间分析信息。 第二步,在链接期间进行,并导致整个应用程序的完全重新编译,将优化应用于整个程序。

您可以在编译步骤和/或链接步骤期间使用 -qipa 。 如果在单个编译器调用中编译和链接,那么仅链接时间子选项相关。 如果在单独的编译器调用中编译和链接,那么只有编译时子选项在编译步骤期间相关,只有链接时子选项在链接步骤期间相关。

在保存 IPA 信息的同时可通过指定 -r -qipa=relink 来生成可重新链接的对象。 这将生成一个包含所有对象文件的不可执行软件包。 通过使用此子选项,可以将链接推迟到最后一个阶段。

如果要使用自己的归档文件,可以使用 ar 工具并设置 XL_AR 环境变量以指向其位置。 如果未指定位置,那么编译器将根据配置文件中包含的信息来设置环境变量。

注意:
  • 此子选项不会链接对象; 相反,它只会聚集这些对象。 因此,编译器不会报告任何错误或警告消息; 此外,当您使用此子选项时,编译器将忽略链接程序或绑定程序选项。
  • 必须将 -r 子选项与 -qipa=relink配合使用。 如果没有 -r,那么将忽略 -qipa=relink
  • -Wm 选项不能与 -qipa配合使用。

语法

表 2。 -qipa 针对两个类别的调用的语法
xlc/xlC 和其他遗留调用 xlclang/xlclang + +

-qipa 编译时语法

读取语法图跳过可视语法图  -q noipaipa=objectnoobject

-qipa 链接时语法

读取语法图跳过可视语法图  -q noipaipa=:exits=,function名称infrequentlabel=,LABEL_NAMElevel=102list=file_namelong shortlowfreq=,function名称malloc16nomalloc16missing=unknownsafeisolatedpurepartition=mediumsmalllargerelinkthreads=autonoautonothreadsisolatedpuresafeunknown=,function名称file_name

-qipa 编译时语法

读取语法图跳过可视语法图  -q noipaipa=objectnoobject

-qipa 链接时语法

读取语法图跳过可视语法图  -q noipaipa=:exits=,function名称infrequentlabel=,LABEL_NAMElevel=102list=file_namelong shortlowfreq=,function名称malloc16nomalloc16missing=unknownsafeisolatedpurepartition=mediumsmalllargerelinkisolatedpuresafeunknown=,function名称file_name

缺省值

  • -qnoipa

参数

只能在单独的编译步骤期间指定以下参数 :

object | noobject
指定是否在输出对象文件中包含标准对象代码。

指定 noobject 可以通过在第一个 IPA 阶段不生成对象代码来大幅缩短总体编译时间。 请注意,如果将 -Snoobject一起指定,那么将忽略 noobject

如果在同一步骤中执行编译和链接,并且未指定 -S 或任何列表选项,那么将隐含 -qipa=noobject

在编译步骤上指定不带子选项的 -qipa 等同于 -qipa=object

您可以 在同一编译器调用中的组合 编译 和链接步骤期间,或者仅在单独的链接步骤期间指定以下参数:
clonearch | noclonearch
不再支持此子选项。 考虑使用 -qtune=balanced
cloneproc | nocloneproc
不再支持此子选项。 考虑使用 -qtune=balanced
出口
指定表示程序出口的 函数 的名称。 程序出口是永远无法返回且永远无法调用已使用 IPA pass 1 编译的任何 function 的调用。 编译器可以优化对这些 函数 的调用 (例如,通过消除保存/恢复序列) ,因为这些调用从不返回到程序。 这些 函数 不得调用使用 -qipa编译的程序的任何其他部分。
不常见标签
指定在程序运行期间可能不经常调用的用户定义的标签。
LABEL_NAME
标签的名称或以逗号分隔的标签列表。
已隔离
指定未使用 -qipa编译的 函数 的逗号分隔列表。 在其调用链中指定为 隔离函数函数 不能直接引用任何全局变量。
级别
指定过程间分析的优化级别。 有效子选项为 如下所示:
0
仅执行最小的过程间分析和优化。
1
支持直接插入,有限别名分析和有限呼叫站点定制。
2
执行完整的过程间数据流和别名分析。
如果未指定级别,那么缺省值为 1。

要生成数据重组信息,请指定优化级别 -qipa=level=2-O5 以及 -qreport。 在 IPA 链接阶段,在列表文件的数据重组部分中生成程序变量数据的数据重组消息。 重组包括数组拆分,数组转换,内存分配合并,数组交错和数组合并。

list
指定在链接阶段生成列表文件。 列表文件包含有关 IPA 执行的变换和分析的信息,以及每个分区的可选对象列表。

如果未指定 list_file_name,那么列表文件名缺省为 a.lst。 如果将 -qipa=list 与生成列表文件的任何其他选项一起指定,那么 IPA 将生成一个覆盖任何现有 a.lst 文件的 a.lst 文件。 如果您有一个名为 a.c的源文件,那么 IPA 列表将覆盖常规编译器列表 a.lst。 可以使用 -qipa=list=list_file_name 子选项来指定备用列表文件名。

其他子选项是下列其中一个 子选项:
简短
请求列表文件中的更少信息。 生成列表的 "对象文件映射" , "源文件映射" 和 "全局符号映射" 部分。
长整型
请求列表文件中的更多信息。 生成由 short 子选项生成的所有部分,以及 "对象解析警告" , "对象引用映射" , "内联报告" 和 "分区映射" 部分。
洛弗雷克
指定可能不常被调用的 函数 。 这些通常是错误处理,跟踪或初始化 函数。 通过对这些 函数的调用进行较少的优化,编译器可能能够使程序的其他部分更快地运行。
malloc16 | nomalloc16
通知编译器动态内存分配例程将返回 16 字节对齐的内存地址。 然后,该编译器可以根 据该断言来优化代码。

在 64 位方式下, AIX® 始终返回 16 字节对齐的地址,因此缺省情况下 -qipa=malloc16 生效。 您可以使用 -qipa=nomalloc16 来覆盖缺省设置。

注: 必须确保使用 -qipa=malloc16 生成的可执行文件在动态内存分配返回 16 字节对齐地址的环境中运行,否则可能会生成错误结果。 例如,在 32 位方式下,地址不是 16 字节对齐的。 在这种情况下,必须设置 MALLOCALIGN=16 运行时环境变量。
缺少
指定未使用 -qipa 编译且未在 未知安全隔离 子选项中显式命名的 函数 的过程间行为。
有效的子选项是下列其中一个 子选项:
安全
指定缺失的 函数 不会通过直接调用或通过 函数 指针间接调用可视 (非缺失) 函数
已隔离
指定缺少的 函数 不直接引用可视 函数可访问的全局变量。 假定从共享库绑定的函数隔离的
pure
指定缺少的 函数安全的隔离的 ,并且不会间接改变可视 函数可访问的存储器。 函数 也没有可观察的内部状态。
未知
指定缺少的 函数 未知为 safe相隔离pure。 此子选项极大地限制了对缺少 函数的调用的过程间优化量。
缺省情况是假定 未知
partition
指定 IPA 在传递 2 期间创建的每个程序分区的大小。 有效的子选项是下列其中一个 子选项:
  • small
  • 介质
  • 大型
较大的分区包含更多的 函数,这将导致更好的过程间分析,但需要更多的存储空间来进行优化。 如果编译由于页面调度而耗时过长,请减小分区大小。
pure
指定未使用 -qipa编译的 函数 。 指定为 pure 的任何 函数 都必须 隔离安全,并且不得改变内部状态,也不得产生副作用 (定义为可能改变对调用者可见的任何数据)。
重新链接
通过将可重新链接的对象打包成不可执行文件来创建这些对象。 使用此子选项时,还必须同时使用 -r 选项。 否则,编译器将忽略 -qipa=relink
注意:
  • 如果使用-qipa=noobject (直接或间接) 并使用 relink 子选项,那么必须将生成的对象文件与 -qipa链接。 否则,可能会发生对对象文件的未解析引用。
  • 如果在一个步骤中链接和编译对象文件,那么可以间接使用 -qipa=noobject 。 此外,不能将共享对象与 -qipa=relink配合使用,它们必须在最后一个链接步骤与预链接输出一起使用。
安全
指定未使用 -qipa 编译且不调用程序的任何其他部分的 安全 函数 。 安全 函数 可以修改全局变量,但不能调用使用 -qipa编译的 函数
基于 XL 的前端开始线程 | 无线程
在并行线程中传递 2 期间运行部分 IPA 优化过程,这可以加快多处理器系统上的编译过程。 threads 子选项的有效子选项是下列其中一个 子选项:
基于 XL 的前端开始自动档/非自动档
auto 生效时,编译器会根据机器负载以启发式方式选择多个线程。 当 noauto 生效时,编译器 创建 每个机器处理器一个线程。
基于 XL 的前端开始号码
指示编译器使用特定数目的线程。 number 可以是 1 到 32 767 范围内的任何整数值。 但是, number 实际上仅限于系统上可用的处理器数。
指定不带子选项的 线程 意味着 -qipa=threads=auto
未知
指定未使用 -qipa编译的 未知 函数 。 指定为 unknown 的任何 函数 都可以调用使用 -qipa编译的程序的其他部分,并修改全局变量。
file_name
提供包含特殊格式的子选项信息的文件的名称。
文件格式为 ,如下所示:
# ... comment 
attribute{, attribute} = name{, name}
missing = attribute{, attribute} 
exits = name{, name} 
lowfreq = name{, name} 
list [ = file-name | short | long ]
level = 0 | 1 | 2 
partition = small | medium | large  
其中 attribute 是下列其中一项:
  • 出口
  • 洛弗雷克
  • 未知
  • 安全
  • 已隔离
  • pure
注意:
  • 不推荐使用 -qipa=inline 及其所有关联子选项。 -qinline 将全部替换这些值。 有关详细信息,请参阅 -qinline (-finline-functions)不推荐的选项
  • 从编译器的 V9.0 发行版开始,不推荐使用 pdfname 子选项; 您应该在新应用程序中使用 -qpdf1 =pdfname-qpdf2 =pdfname 。 请参阅 -qpdf1, -qpdf2 以获取详细信息。

使用量

指定 -qipa 会自动将优化级别设置为 -O2。 对于其他性能优势,您还可以指定 -qinline 选项。 -qipa 选项将优化期间检查的区域从单个 函数 扩展到多个 函数 (可能在不同的源文件中) 以及它们之间的链接。

如果使用 -qipa=noobject 选项创建了用于与 -qipa 链接的任何对象文件,那么必须使用 -qipa编译包含入口点 (可执行程序的主程序或库的导出 函数 ) 的任何文件。

您可以链接使用编译器的不同发行版创建的对象,但必须确保使用的链接程序至少与用于创建要链接的对象的较新编译器的发行版级别相同。

您可以使用 -r -qipa=relink 来创建包含所有对象文件的可重新链接包,而不生成可执行程序。 如果要使用归档文件,请使用 XL_AR 环境变量设置 ar 工具的路径。

在源代码中明确引用或设置的一些符号可能会被 IPA 优化掉,并且可能会丢失 debugdumpnm 输出。 将 IPA 与 -g 编译器一起使用通常会产生不可窃用的输出。

请注意,如果使用 -#指定 -qipa ,那么编译器不会在 IPA 链接步骤之后显示链接程序信息。

有关使用 -qipa的建议过程,请参阅 优化应用程序

预定义的宏

无。

示例

以下示例显示如何使用过程间分析来编译一组文件:
xlc -c *.c -qipa
xlc -o product *.o -qipa 
以下是您可能如何编译同一组文件,改进第二个编译的优化以及第一个编译步骤的速度。 假定存在一组很少执行的例程 user_trace1user_trace2user_trace3以及退出程序的例程 user_abort :
xlc -c *.c -qipa=noobject
xlc -c *.o -qipa=lowfreq=user_trace[123]:exit=user_abort 
以下示例演示如何创建包含对象文件的可重新链接包:
xlc -O5 -o -r -qipa=relink result obj1.o obj2.o obj3.o

ls -l result

-rw-r--r-- result

xlc -O5 -o res result obj4.o obj5.o
以下是如何使用您自己的归档文件生成可重新链接的包:
ar -X64 -r arch1.a object11.o object12.o

ar -X64 -r arch2.a object21.o object22.o

xlc -O5 -o -r -qipa=relink -q64 result obj1.o obj2.o obj3.o arch1.a arch2.a
xlc -O5 -o res result obj4.o obj5.o

相关信息