[Mips] Fix argument lowering for illegal vector types (PR63608)
authorNikita Popov <npopov@redhat.com>
Tue, 4 Jul 2023 11:06:20 +0000 (13:06 +0200)
committerNikita Popov <npopov@redhat.com>
Mon, 24 Jul 2023 10:07:09 +0000 (12:07 +0200)
commite49103b2790f346b436b280a2da7a1c6a9f2ab3d
tree0b4066537e976a218e73066ff5cb00594c0c2d92
parent0f10850e51fa9c82bb44a9d9009b5cf7b3022ac1
[Mips] Fix argument lowering for illegal vector types (PR63608)

The Mips MSA ABI requires that legal vector types are passed in
scalar registers in packed representation. E.g. a type like v16i8
would be passed as two i64 registers.

The implementation attempts to do the same for illegal vectors with
non-power-of-two element counts or non-power-of-two element types.
However, the SDAG argument lowering code doesn't support this, and
it is not easy to extend it to support this (we would have to deal
with situations like passing v7i18 as two i64 values).

This patch instead opts to restrict the special argument lowering
to only vectors with power-of-two elements and round element types.
Everything else is lowered naively, that is by passing each element
in promoted registers.

Fixes https://github.com/llvm/llvm-project/issues/63608.

Differential Revision: https://reviews.llvm.org/D154445
llvm/lib/Target/Mips/MipsISelLowering.cpp
llvm/test/CodeGen/Mips/cconv/illegal-vectors.ll [new file with mode: 0644]
llvm/test/CodeGen/Mips/cconv/vector.ll