[AMDGPU] Verify VGPR tuple alignment from the operand register class The machine verifier decided VGPR tuple alignment with isProperlyAlignedRC(), which inspects only the register's own class. Alignment is not really a property of the register in isolation: whether a 64-bit tuple must be even-aligned depends on the operand it feeds, and on mixed-alignment targets the same register class can be required to be aligned in one operand and exempt in another. Inspecting only the register also conflates alignment with unrelated problems - a register that is simply the wrong bank or size for the operand came out as "requires even aligned vector registers" as well. Make the operand's register class the source of truth instead: a register is misaligned only when it does not satisfy the operand's class but its even-aligned same-bank/width equivalent (SIRegisterInfo::getAlignedEquivalentRC) would. A register that fits neither is a genuine class or bank mismatch and is left to the illegal-register and sub-register checks. So an AGPR in a VGPR|SGPR (VS_64) operand is now reported as an illegal register, and a wrong-size register (e.g. a 64-bit VGPR in a 128-bit MFMA source) or an invalid sub-register index is reported by those checks alone, no longer doubled up as an "even aligned" error. This drops the redundant diagnostics in tests. Deriving the requirement from the operand class also lets several special cases go away. The RegClass == -1 early-out is hoisted so the operand class is always valid, and the V_MOV_B64_PSEUDO / AV_MOV_B64_IMM_PSEUDO / spill exemptions are dropped: those operands use unaligned register classes (VReg_64, AV_64, and the spill classes), which every register already satisfies, so the comparison never flags them. Inline-asm operands (RegClass == -1) are no longer alignment-checked, matching the prior FIXME that they were never meaningfully verified. The same reasoning removes the DS_GWS-specific alignment check: on subtargets that require aligned VGPRs the DS_GWS data0 operand has the AV_64_Align2 register class, so the operand-class check above already diagnoses its alignment and the separate check is redundant. The image vaddr operand is a plain VGPR_32 whose class cannot encode even-alignment, so its dedicated position check is kept. Co-Authored-By: Claude <noreply@anthropic.com>
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.