From 3625529ce5184edbe86470cb7d8f57de63554693 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 16 Oct 2025 15:55:53 +0200 Subject: [PATCH] [Clang][MVE] Use IRBuilder methods to emit masked load/store In preparation for an upcoming change which will convert the alignment argument to an alignment attribute, switch MVE builtin codegen to use the IRBuilder methods (which will handle this transparently) instead of explicitly emitting the intrinsic. --- clang/include/clang/Basic/arm_mve.td | 24 ++++++++--------------- clang/include/clang/Basic/arm_mve_defs.td | 7 +++++++ clang/utils/TableGen/MveEmitter.cpp | 3 ++- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/clang/include/clang/Basic/arm_mve.td b/clang/include/clang/Basic/arm_mve.td index 412ef9abac1bc..2e5e1d93be096 100644 --- a/clang/include/clang/Basic/arm_mve.td +++ b/clang/include/clang/Basic/arm_mve.td @@ -831,9 +831,8 @@ multiclass contiguous_load; def: Intrinsic>:$addr, Predicate:$pred), - (IRIntBase<"masked_load", [Vector, CPtr]> - (CPtr $addr), !srl(memtype.size,3), - $pred, (zeroinit Vector))>, + (masked_load Vector, (CPtr $addr), + !srl(memtype.size,3), $pred, (zeroinit Vector))>, NameOverride; } @@ -846,9 +845,8 @@ multiclass contiguous_load; def: Intrinsic>:$addr, Predicate:$pred), - (IRIntBase<"masked_load", [Vector, CPtr]> - (CPtr $addr), !srl(memtype.size,3), - $pred, (zeroinit Vector))>, + (masked_load Vector, (CPtr $addr), + !srl(memtype.size,3), $pred, (zeroinit Vector))>, NameOverride<"vld1q_z">; } @@ -863,9 +861,7 @@ multiclass contiguous_load; def: Intrinsic>:$addr, Predicate:$pred), - (extend (IRIntBase<"masked_load", - [NarrowedVecOf, - CPtr>]> + (extend (masked_load NarrowedVecOf, (CPtr> $addr), !srl(memtype.size,3), $pred, (zeroinit NarrowedVecOf)), @@ -890,8 +886,7 @@ multiclass contiguous_store; def: Intrinsic>:$addr, Vector:$value, Predicate:$pred), - (IRIntBase<"masked_store", [Vector, Ptr]> - $value, (Ptr $addr), + (masked_store $value, (Ptr $addr), !srl(memtype.size,3), $pred)>, NameOverride; } @@ -907,8 +902,7 @@ multiclass contiguous_store; def: Intrinsic>:$addr, Vector:$value, Predicate:$pred), - (IRIntBase<"masked_store", [Vector, Ptr]> - $value, (Ptr $addr), + (masked_store $value, (Ptr $addr), !srl(memtype.size,3), $pred)>, NameOverride<"vst1q_p">; } @@ -925,9 +919,7 @@ multiclass contiguous_store; def: Intrinsic>:$addr, Vector:$value, Predicate:$pred), - (IRIntBase<"masked_store", - [NarrowedVecOf, - Ptr>]> + (masked_store (trunc $value, NarrowedVecOf), (Ptr> $addr), !srl(memtype.size,3), $pred)>, diff --git a/clang/include/clang/Basic/arm_mve_defs.td b/clang/include/clang/Basic/arm_mve_defs.td index 083d03a396ba3..c1562a0c1f04c 100644 --- a/clang/include/clang/Basic/arm_mve_defs.td +++ b/clang/include/clang/Basic/arm_mve_defs.td @@ -134,6 +134,13 @@ def unzip: CGHelperFn<"VectorUnzip"> { } def zip: CGHelperFn<"VectorZip">; +def masked_load: IRBuilder<"CreateMaskedLoad"> { + let special_params = [IRBuilderIntParam<2, "Align">]; +} +def masked_store: IRBuilder<"CreateMaskedStore"> { + let special_params = [IRBuilderIntParam<2, "Align">]; +} + // Trivial 'codegen' function that just returns its argument. Useful // for wrapping up a variable name like $foo into a thing you can pass // around as type 'dag'. diff --git a/clang/utils/TableGen/MveEmitter.cpp b/clang/utils/TableGen/MveEmitter.cpp index a003b5e632d58..f55a5f54bd158 100644 --- a/clang/utils/TableGen/MveEmitter.cpp +++ b/clang/utils/TableGen/MveEmitter.cpp @@ -1684,7 +1684,8 @@ void EmitterBase::EmitBuiltinCG(raw_ostream &OS) { OS << " case ARM::BI__builtin_arm_" << OI.Int->builtinExtension() << "_" << OI.Name << ":\n"; for (size_t i = 0, e = MG.ParamTypes.size(); i < e; ++i) - OS << " Param" << utostr(i) << " = " << OI.ParamValues[i] << ";\n"; + OS << " Param" << utostr(i) << " = static_cast<" + << MG.ParamTypes[i] << ">(" << OI.ParamValues[i] << ");\n"; OS << " break;\n"; } OS << " }\n";