[RISCV] Add basic scalar support for MERGE, MVM, and MVMN from P extension (#180677) These are 3 variations of the same operation with a different operand tied to the destination register. We need to pick the one that minimizes the number of mvs. To do this we take the approach used by AArch64 to select between BIT, BIF, and BSL which the same operations. We define a pseudo with no tied constraint and expand it after register allocation based on where the destination register ended up. If the destination register is none of the operands, we'll insert a mv. I've replaced RISCVISD::MVM with RISCVISD::MERGE and updated the operand order accordingly. I find the MERGE name easier to read so I've made it the canonical name. Ideally we could use commuteInstructionImpl and the TwoAddressInstructionPass to select the opcode before register allocation. That only works if you can commute exactly 2 operands and maybe change the opcode in the MI representation of any of the forms to get to the either of the other 2 forms. That is not possible. We'd need to define 3 more pseudoinstructions with different permutations. With the current approach it might be possible that we insert a mv not because all of the operand registers we needed by later instructions, but because the register allocator needed to put the result in a different register. It's possible a different allocation for other instructions might have avoided the mv. I wrote the patch based on the AArch64, but the tests were generated by AI.
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.