-qstrict

适用的调用

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

类别

优化和调整

等效编译指示

表 2。 两个类别的调用的编译指示等效项
xlc/xlC 和其他遗留的调用命令 xlclang/xlclang + + 调用命令
#pragma options [no] strict , #pragma option_override (function_name, "opt (suboption_list)") #pragma option_override (function_name, "opt (suboption_list)")

用途

确保缺省情况下在 -O3 和更高优化级别以及 (可选) 在 -O2上执行的优化不会更改 程序的语义

此选项适用于优化程序中程序执行中的更改从未优化程序产生不同结果的情况。

语法

读取语法图跳过可视语法图  -q nostrictstrict= :allnoneprecisionnoprecisionexceptionsnoexceptionsieeefpnoieeefpnansnonansinfinitiesnoinfinitiessubnormalsnosubnormalszerosignsnozerosignsoperationprecisionnooperationprecisionvectorprecisionnovectorprecisionordernoorderassociationnoassociationreductionordernoreductionorderguardsnoguardslibrarynolibrary

缺省值

  • -qnoopt-O0 优化级别生效时, -qstrict-qstrict=all 始终生效
  • -O2-O 优化级别生效时,缺省值为 -qstrict-qstrict=all
  • -O3 或更高 优化级别生效时,缺省值为 -qnostrict-qstrict=none

参数

-qstrict 子选项包括以下几个:

all | none
all 将禁用所有语义更改变换,包括由 ieeefporderlibraryprecision异常 子选项控制的变换。 none 启用这些变换。
precision | noprecision
precision 将禁用所有可能影响浮点精度的变换,包括由 subnormalsoperationprecisionvectorprecisionassociationreductionorderlibrary 子选项控制的变换。 noprecision 启用这些变换。
exceptions | noexceptions
异常 将禁用可能影响异常或受其影响的所有变换,包括由 nansinfinitiessubnormals警戒 library 子选项控制的变换。 noexceptions 启用这些变换。
ieeefp | noieeefp
ieeefp 禁用影响 IEEE 浮点合规性的变换,包括由 nansinfinitiessubnormalszero战vectorprecisionoperationprecision 子选项控制的变换。 noieeefp 启用这些变换。
nans | nonans
nans 禁用可能在存在或可能错误地生成 IEEE 浮点 NaN (not-a-number) 值时产生不正确结果的变换。 nonans 启用这些变换。
infinities | noinfinities
infinities 禁用可能在存在时产生不正确的结果或可能错误地产生浮点无穷大的变换。 noinfinities 启用这些变换。
subnormals | nosubnormals
subnormals 禁用可能在存在时产生不正确结果或可能错误地产生 IEEE 浮点子正态 (以前称为 denorms) 的变换。 nosubnormals 启用这些变换。
zerosigns | nozerosigns
zerosign 禁用可能影响或受浮点零符号是否正确影响的变换。 nozero连号 启用这些变换。
operationprecision | nooperationprecision
operationprecision 禁用为单个浮点运算生成近似结果的变换。 nooperationprecision 启用这些变换。
vectorprecision | novectorprecision
vectorprecision 在循环中禁用矢量化,在这些循环中,它可能会在矢量化迭代中产生与非矢量化残差迭代中不同的结果。 vectorprecision 确保对相同数据执行相同的浮点运算的每个循环迭代都产生相同的结果。

即使不同的迭代可能从相同的输入产生不同的结果,novectorprecision 也能启用矢量化。

order | noorder
order 禁用可能影响结果或异常的多个操作 (包括由 关联reductionorder警戒 子选项控制的操作) 之间的所有代码重新排序。 noorder 启用代码重新排序。
association | noassociation
association 禁用表达式中的重新排序操作。 noassociation 启用重新排序操作。
reductionorder | noreductionorder
reductionorder 禁用并行化浮点缩减。 noreductionorder 支持将这些缩减并行化。
guards | noguards
指定 -qstrict=guards 具有以下效果:
  • 编译器不会将操作移动过去,这将控制是否执行操作。 即,编译器不会将操作从可能结束程序或抛出异常的 if 语句的警戒,循环外或函数调用的过往警戒中移开。
  • 当编译器迂到包含可在编译时解析的指针回绕检查的 if 表达式时,编译器不会除去这些检查或包含的操作。 指针环绕检查将对两个具有相同基准但应用了常量偏置的 指针进行比较。

指定 -qstrict=noguards 具有以下效果:

  • 编译器会使操作经过保护。
  • 编译器根据未定义指针回绕的语言标准对 if 表达式进行求值。 当 if 表达式的求值结果为 false 时,编译器将除去 if 语句的带括号操作。
library | nolibrary
library 禁用影响浮点库函数的变换; 例如,将浮点库函数替换为其他库函数或常量的变换。 诺利伯里 启用这些变换。

使用量

allprecisionexceptionsieeefporder 子选项及其否定形式是影响多个单独子选项的组子选项。 在很多情况下,组子选项将对变换提供足够的粒度控制。 组子选项的行 为就像指定了组的每个正数形式或无格式的 子选项。 如有必要,组中的各个子选项(如精度组中的 subnormalsoperationprecision)提供对该组内特定变换的控制。

-qnostrict-qstrict=none 生效后,将开启以下优化:
  • 可能导致异常的代码可能会重新排列。 相应的异常可能在执行中的不同时间点发生,也可能根本不会发生。 ( 编译器仍尝试将最大限度减少此类情况。)
  • 浮点运算可能不会保留零值的符号。 (要确保保留此符号,您还需要指定 -qfloat=rrm-qfloat=nomaf。)
  • 浮点表达式可能会重新关联。 例如,如果速度更快,那么 (2.0*3.1)*4.2 可能会变为 2.0*(3.1*4.2) ,即使结果可能不相同也是如此。
  • 基于 XL 的前端开始 -qfloat=fltint:rsqrt 启用的优化功能。 可以使用 -qstrict 选项或 -qfloat=nofltint:norsqrt 关闭优化功能。 如果指定了更低级别的优化或未指定优化,那么缺省情况下会关闭这些优化功能。
指定 -qstrict[=suboptions]-qnostrict 的各种子选项组合将设置以下子选项:
  • 基于 XL 的前端开始-qstrict 或 设置 -qstrict=all -qfloat=nofltint:norsqrt:rng chk。 -qnostrict-qstrict=none set -qfloat=fltint:rsqrt: norngchk
  • 基于 XL 的前端开始-qstrict=operationprecision 或 设置。 -qstrict=exceptions -qfloat=nofltint 如果同时指定 -qstrict=nooperationprecision-qstrict=noexceptions,那么将设置 -qfloat=fltint
  • -qstrict=infinities-qstrict=operationprecision-qstrict=exceptions 将设置 -qfloat=norsqrt
  • -qstrict=noinfinities:nooperationprecision:noexceptions 将设置 -qfloat=rsqrt
  • -qstrict=nans-qstrict=infinities-qstrict=zerosigns-qstrict=exceptions 将设置 -qfloat=rngchk。 如果指定所有的 -qstrict=nonans:nozerosigns:noexceptions-qstrict=noinfinities:nozerosigns:noexceptions 或者暗指所有这些选项的任何子选项组,那么将会设置 -qfloat=norngchk
注: 有关 -qstrict 子选项与其 -qfloat 对应项之间的关系的详细信息,请参阅 -qfloat

要覆盖其中任何设置,请在命令行上的 -qstrict 选项之后指定相应的 -qfloat 子选项。

预定义的宏

无。

示例

基于 XL 的前端开始
要编译 myprogram.c 以便关闭 -O3 的主动优化,关闭 范围检查 (-qfloat=fltint) , 并将平方根结果的除法替换为倒数 (-qfloat=rsqrt) ,请输入:
xlc myprogram.c -O3 -qstrict -qfloat=fltint:rsqrt
要启用除影响精度之外的所有变换,请指定:
xlc myprogram.c -qstrict=none:precision
要禁用除涉及 NaN 和无穷大以外的所有变换,请指定:
xlc myprogram.c -qstrict=all:nonans:noinfinities
在以下代码示例中, if 表达式包含指针回绕检查。 如果使用有效的 -qstrict=guards 选项编译代码,那么编译器将保留包含的 foo() 函数; 否则,编译器将除去包含的 foo() 函数。
void foo()
{
                // You can add some operations here.
}

int main()
{
  char *p = "a";
  int k = 100;
  if(p + k < p) // This if expression contains a pointer wraparound check.
  {
    foo();      // foo() is the enclosed operation of the if statement.
  }
  return 0;
}
基于 XL 的前端端

相关信息