commit | 54732a3e0b0ff7d8cc722887a85abdf599aa41c5 | [log] [tgz] |
---|---|---|
author | Cullen Rhodes <cullen.rhodes@arm.com> | Mon Oct 30 08:47:39 2023 +0000 |
committer | Cullen Rhodes <cullen.rhodes@arm.com> | Mon Oct 30 08:47:39 2023 +0000 |
tree | 3fd88173aa849c5665d75b6cfc7767446ada1b77 | |
parent | b72732c37fd8d193cfa64e693b879dabdec813a5 [diff] |
[AArch64] Use TargetRegisterClass::hasSubClassEq in tryToFindRegisterToRename When renaming store operands for pairing in the load/store optimizer it tries to find an available register from the minimal physical register class of the original register. For each register it compares the equality of minimal physical register class of all sub/super registers with the minimal physical register class of the original register. Simply checking for register class equality can break once additional register classes are added, as was the case when adding: def foo : RegisterClass<"AArch64", [i32], 32, (sequence "W%u", 12, 15)> which broke: CodeGen/AArch64/stp-opt-with-renaming-reserved-regs.mir CodeGen/AArch64/stp-opt-with-renaming.mir Since the introduction of the register class above, the rename register in test1 of the reserved regs test changed from x12 to x18. The reason for this is the minimal physical register class of x12 (as well as x13-x15) and its sub/super registers no longer matches that of x9 (GPR64noip_and_tcGPR64). Rather than selecting a matching register based on a comparison of the minimal physical register classes of the original and rename registers, this patch selects based on `MachineInstr::getRegClassConstraint` for the original register. It's worth mentioning the parameter passing registers (r0-r7) could be now be used as rename registers since the GPR32arg and GPR64arg register classes are subclasses of the minimal physical register class for x8 for example. I'm not entirely sure if we want to exclude those registers, if so maybe we could explicitly exclude those register classes. Reviewed By: efriedma, paulwalker-arm Differential Revision: https://reviews.llvm.org/D88663
Welcome to the LLVM project!
This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.
The LLVM project has multiple components. The core of the project is itself called “LLVM”. This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.
C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.
Other components include: the libc++ C++ standard library, the LLD linker, and more.
Consult the Getting Started with LLVM page for information on building and running LLVM.
For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.
Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.
The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.