LLVM 11.0

2020-10-13 20:00:55

增加了调用点属性Vector-Function-ABI-Variant来描述标量函数和向量函数之间的映射,以实现调用点的矢量化。属性提供的信息通过VFDatabase类提供的API进行接口。当扫描与标量调用相关联的向量函数集时,循环向量器现在依赖于VFDatabase,而不是TargetLibraryInfo。

指针上的可解除引用的属性和元数据不再隐含任何有关有问题的指针对齐的内容。以前,一些优化会根据指针的类型进行假设。这种行为没有记录在案。为了保持优化,可能需要更新前端以生成适当的对齐属性和元数据。

扩展DIModule元数据以包含文件和行号信息。此信息用于表示IR级的Fortran模块调试信息。

LLVM IR现在支持两种截然不同的llvm::FixedVectorType和llvm::ScalableVectorType向量类型,两者都派生自基类llvm::VectorType。许多处理IR矢量类型的算法已经更新,以确保它们既适用于可缩放矢量类型,也适用于固定矢量类型。在可能的情况下,使用基类使代码泛型以涵盖这两种情况。具体地说,以前使用类型UNSIGNED来计算向量翼数的位置现在使用llvm::ElementCount。在使用uint64_t表示IR类型的位数的地方,我们已经将代码库部分迁移到使用llvm::TypeSize。

在undef/毒性上进行分支是未定义的行为。它是根据分支条件正确分析取值范围所必需的。这也与MSAN的行为一致。

将undef/posis传递给标准I/O库函数调用(printf/fputc/…)。是未定义的行为。新的noundef属性附加到函数的参数中。完整列表位于llvm::inherLibFuncAttributes。

LLVM项目已经开始向Python3迁移,而buildsystem现在更喜欢Python3。如果找不到Python 3解释器(或库),构建系统将暂时回退到Python 2。建议下游项目迁移到Python 3,因为Python 2已被Python Software Foundation淘汰。

当以COFF为目标时,对于不支持的位置调整显然是错误的,而不是默默接受一些(无法执行所请求的操作)。

为SVE(00bet5版)的ARM C语言扩展(ACLE)中记录的SVE C语言内部实现了代码生成支持。有关更多信息,请参阅clang 11发行说明。

支持ARMv8.2-BF16BFloat16扩展。这包括一个新的仅支持C级存储的__bf16类型、一个BFloat IR类型、一个bf16 MVT,以及对汇编和内部的支持。

为完整的ARM v8.1-M MVE指令集实现了C语言内部功能。<;arm_mve.h>;现在支持ARM CLanguage扩展中定义的完整API。

在启用优化的情况下,当针对ARM和Thumb的非AndroidLinux时,clang现在默认为-fomit-frame-Pointer。以前没有指定值并依赖隐式编译器缺省值的用户可能希望指定-fno-omit-frame-pointer来获取旧行为。这提高了与GCC的兼容性。

支持ARMv8.2-AA32BF16 BFloat16扩展。这包括新的纯存储__bf16类型、BFloat IR类型、bf16 MVT以及汇编和内部支持。

现在,ARM和Thumb2支持机器大纲视图,默认情况下未启用,可以使用-mOutline clang标志启用。

改进的循环展开和阻塞合法性检查,允许它处理两个以上级别的循环嵌套。

实现了允许循环融合在具有不同恒定跳闸计数的循环上工作的选项

启用编译和链接,以便简单的<;stdio.h>;“Hello World”程序使用标准标头。

在llvm-objdump中,添加了对重新定位的支持,改进了符号标签的选择,并添加了-Symbol-Description选项。

通过RFC协商后,RISC-V后端现在接受尚未批准的建议指令集扩展的补丁。对于这些实验性扩展,不会期望持续的支持-编译器支持将继续更改,直到规范最终确定。根据这一政策,为建议的位操作扩展的0.92版添加了MC层和代码生成支持,为建议的RISC-V矢量指令集扩展的0.8版添加了MC层支持。由于这些扩展尚未获得批准,编译器支持将继续更改以与规范相匹配,直到最终确定为止。

如果可以使用一对ADDI指令生成立即数,则将选择该对,而不是将立即数具体化到具有LUI和ADDI对的独立寄存器中。

ADDI指令现在被折叠到加载/存储指令的偏移量中,即使加载/存储本身具有非零偏移量,当可以安全地执行DOSO时也是如此。

RISC-V后端的加载/存储窥孔优化通道现在支持浮点常量池,从而改进了浮点常量的代码生成。

除传统数据暂存寄存器名称外,现在还可以识别调试暂存寄存器名称dscrch0和dscrch1。

现在,程序集中支持.option pic和.option ntop.relocWAS扩展为支持任意重定位类型。

计算出的原子伪操作展开大小是固定的,避免了某些输入在分支松弛时出现“修正值超出范围”的错误。

现在发出正确的库调用,以便在没有F或D扩展名的RV64目标上将浮点/双精度数转换为32位有符号或无符号整数。

增强了汇编器解析器,即使在地址寄存器上下文中也允许使用%r0,并允许使用纯整数来指定寄存器,而不是到处使用寄存器名称。

修复了在传递仅具有单个成员离散点类型的C++类(非结构)类型时违反平台ABI的错误代码生成。

修复了使用具有16或更大立即长度参数的vec_store_len_r或vec_load_len_r内部函数时错误的代码生成。

探测堆栈属性设置为“inline-asm”的函数现在受到保护,不会发生堆栈冲突,不需要第三方探测函数,并且对性能的影响有限。

-x86-enable-old-knl-abi命令行开关已删除。当avx512f使能而avx512bwis禁用时,v32i16/v64i8矢量始终传递到ZMM寄存器中。

启用avx512f时,i16或i8元素的大于512位的向量将在多个ZMM寄存器中传递。以前,这需要davx512bw,否则它们将被分成多个YMM寄存器。这意味着将vxi16/vxi8矢量一致地视为总宽度相同的vxi32/vxi64/vxf64/vxf32矢量。

添加了推测性执行副作用抑制通道,可将其用作与推测性执行相关的CPU漏洞的最后手段缓解。

扩展了旋转模式识别以处理漏斗移动,允许我们删除现有的特定于x86的SHLD/SHRD组合。

对于所有计算函数类型的所有目标,后端默认非正规处理模式已切换为ON。希望保留旧行为的前端应明确请求F32反正常刷新。

从实验后端转移到官方后端。AVR支持现在默认包含在所有LLVM构建和发布中,并且在“AVR-UNKNOWN-UNKNOWN”目标三元组下可用。

没有“主”函数(称为“反应器”)的程序现在可以正确支持,并带有一个新的-mexec-model=反应器标志。以前使用-wl,-no-entry来避免主函数的程序应该切换到这个新标志,以便正确地执行静态初始化。

__ATTRIBUTE__((Visibility(“Protected”)现在会发出警告,因为WebAssembly不支持“Protected”可见性。

为没有COMDAT的IR级弱符号生成COFF弱外部符号(例如,对于C中的__ATTRIBUTE__((弱)。

SelDag级冻结指令已落地。它被简单地降低为对MachineIR的复制操作,但是要使其完全正确,要么应该修复IMPLICIT_DEF,要么应该将等效的冻结操作添加到MachineIR。

--plugin-opt=Whole-Program-Visibility用于指定类在使用-fall-program-vtables编译的源文件的LTO和ThinLTO链接中具有隐藏的LTO可见性。有关详细信息,请参阅LTOVisibility。(D71913)。

向llvm-dwarfdump添加了一个选项(-show-Section-size),以显示文件中所有调试节的大小。

Llvm-nm现在实现了标志--Special-syms,默认情况下将过滤掉特殊符号,即映射ARM和AArch64上的符号。这与GNU nm的行为相匹配。

Llvm-rc现在允许-1作为菜单项ID,支持语言ID选项,并允许将字符串表值拆分为多个字符串文字