diff options
author | James Y Knight <jyknight@google.com> | 2024-07-25 09:19:22 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-25 09:19:22 -0400 |
commit | dfeb3991fb489a703f631ab0c34b58f80568038d (patch) | |
tree | 7117ce620e5bf49aef8810d5651c4aba2b31499e /llvm/lib/IR/Function.cpp | |
parent | 0fedfd83d75415837eb91f56ec24f4b392bf6c57 (diff) | |
download | llvm-dfeb3991fb489a703f631ab0c34b58f80568038d.zip llvm-dfeb3991fb489a703f631ab0c34b58f80568038d.tar.gz llvm-dfeb3991fb489a703f631ab0c34b58f80568038d.tar.bz2 |
Remove the `x86_mmx` IR type. (#98505)
It is now translated to `<1 x i64>`, which allows the removal of a bunch
of special casing.
This _incompatibly_ changes the ABI of any LLVM IR function with
`x86_mmx` arguments or returns: instead of passing in mmx registers,
they will now be passed via integer registers. However, the real-world
incompatibility caused by this is expected to be minimal, because Clang
never uses the x86_mmx type -- it lowers `__m64` to either `<1 x i64>`
or `double`, depending on ABI.
This change does _not_ eliminate the SelectionDAG `MVT::x86mmx` type.
That type simply no longer corresponds to an IR type, and is used only
by MMX intrinsics and inline-asm operands.
Because SelectionDAGBuilder only knows how to generate the
operands/results of intrinsics based on the IR type, it thus now
generates the intrinsics with the type MVT::v1i64, instead of
MVT::x86mmx. We need to fix this before the DAG LegalizeTypes, and thus
have the X86 backend fix them up in DAGCombine. (This may be a
short-lived hack, if all the MMX intrinsics can be removed in upcoming
changes.)
Works towards issue #98272.
Diffstat (limited to 'llvm/lib/IR/Function.cpp')
-rw-r--r-- | llvm/lib/IR/Function.cpp | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index 2087198..9b0dd5f 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -1052,8 +1052,9 @@ static std::string getMangledTypeStr(Type *Ty, bool &HasUnnamedType) { case Type::DoubleTyID: Result += "f64"; break; case Type::X86_FP80TyID: Result += "f80"; break; case Type::FP128TyID: Result += "f128"; break; - case Type::PPC_FP128TyID: Result += "ppcf128"; break; - case Type::X86_MMXTyID: Result += "x86mmx"; break; + case Type::PPC_FP128TyID: + Result += "ppcf128"; + break; case Type::X86_AMXTyID: Result += "x86amx"; break; case Type::IntegerTyID: Result += "i" + utostr(cast<IntegerType>(Ty)->getBitWidth()); @@ -1397,7 +1398,8 @@ static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos, switch (D.Kind) { case IITDescriptor::Void: return Type::getVoidTy(Context); case IITDescriptor::VarArg: return Type::getVoidTy(Context); - case IITDescriptor::MMX: return Type::getX86_MMXTy(Context); + case IITDescriptor::MMX: + return llvm::FixedVectorType::get(llvm::IntegerType::get(Context, 64), 1); case IITDescriptor::AMX: return Type::getX86_AMXTy(Context); case IITDescriptor::Token: return Type::getTokenTy(Context); case IITDescriptor::Metadata: return Type::getMetadataTy(Context); @@ -1580,7 +1582,11 @@ static bool matchIntrinsicType( switch (D.Kind) { case IITDescriptor::Void: return !Ty->isVoidTy(); case IITDescriptor::VarArg: return true; - case IITDescriptor::MMX: return !Ty->isX86_MMXTy(); + case IITDescriptor::MMX: { + FixedVectorType *VT = dyn_cast<FixedVectorType>(Ty); + return !VT || VT->getNumElements() != 1 || + !VT->getElementType()->isIntegerTy(64); + } case IITDescriptor::AMX: return !Ty->isX86_AMXTy(); case IITDescriptor::Token: return !Ty->isTokenTy(); case IITDescriptor::Metadata: return !Ty->isMetadataTy(); |