[Mlir-commits] [mlir] [MLIR][LLVM] Add `llvm.experimental.constrained.fptrunc` operation (PR #86260)
Tobias Gysi
llvmlistbot at llvm.org
Mon Mar 25 10:37:12 PDT 2024
================
@@ -311,6 +311,93 @@ def LLVM_InvariantEndOp : LLVM_ZeroResultIntrOp<"invariant.end", [2],
"qualified(type($ptr))";
}
+// Constrained Floating-Point Intrinsics
+
+class LLVM_ConstrainedIntr<string mnem, int numArgs,
+ bit overloadedResult, list<int> overloadedOperands,
+ bit hasRoundingMode>
+ : LLVM_OneResultIntrOp<"experimental.constrained." # mnem,
+ /*overloadedResults=*/
+ !cond(!gt(overloadedResult, 0) : [0],
+ true : []),
+ overloadedOperands,
+ /*traits=*/[Pure, DeclareOpInterfaceMethods<FPExceptionBehaviorOpInterface>]
+ # !cond(
+ !gt(hasRoundingMode, 0) : [DeclareOpInterfaceMethods<RoundingModeOpInterface>],
+ true : []),
+ /*requiresFastmath=*/0,
+ /*immArgPositions=*/[],
+ /*immArgAttrNames=*/[]> {
+ dag regularArgs = !dag(ins, !listsplat(LLVM_Type, numArgs), !foreach(i, !range(numArgs), "arg_" #i));
+ dag attrArgs = !con(!cond(!gt(hasRoundingMode, 0) : (ins ValidRoundingModeAttr:$roundingmode),
+ true : (ins)),
+ (ins FPExceptionBehaviorAttr:$fpExceptionBehavior));
+ let arguments = !con(regularArgs, attrArgs);
+ let llvmBuilder = [{
+ SmallVector<llvm::Value *> args =
+ moduleTranslation.lookupValues(opInst.getOperands());
+ SmallVector<llvm::Type *> overloadedTypes; }] #
+ !cond(!gt(overloadedResult, 0) : [{
+ // Take into account overloaded result type
+ overloadedTypes.push_back($_resultType); }],
+ // No overloaded result type
+ true : "") # [{
+ llvm::transform(ArrayRef<unsigned>}] # overloadedOperandsCpp # [{,
+ std::back_inserter(overloadedTypes),
+ [&args](unsigned index) { return args[index]->getType(); });
+ llvm::Module *module = builder.GetInsertBlock()->getModule();
+ llvm::Function *callee =
+ llvm::Intrinsic::getDeclaration(module,
+ llvm::Intrinsic::experimental_constrained_}] #
+ mnem # [{, overloadedTypes); }] #
+ !cond(!gt(hasRoundingMode, 0) : [{
+ // Get rounding mode using interface
+ llvm::RoundingMode rounding =
+ moduleTranslation.translateRoundingMode($roundingmode); }],
+ true : [{
+ // No rounding mode
+ std::optional<llvm::RoundingMode> rounding; }]) # [{
+ llvm::fp::ExceptionBehavior except =
+ moduleTranslation.translateFPExceptionBehavior($fpExceptionBehavior);
+ $res = builder.CreateConstrainedFPCall(callee, args, "", rounding, except);
+ }];
+ let mlirBuilder = [{
+ SmallVector<Value> mlirOperands;
+ SmallVector<NamedAttribute> mlirAttrs;
+ if (failed(moduleImport.convertIntrinsicArguments(
+ llvmOperands.take_front( }] # numArgs # [{),
+ {}, {}, mlirOperands, mlirAttrs))) {
+ return failure();
+ }
+
+ FPExceptionBehaviorAttr fpExceptionBehaviorAttr =
+ $_fpExceptionBehavior_attr($fpExceptionBehavior);
+ assert(fpExceptionBehaviorAttr && "Expecting FP exception behavior");
----------------
gysit wrote:
nit: I would move the two asserts (for the exception and rounding attribute) into the ModuleImport.cpp similar to `matchFloatAttr` etc.
https://github.com/llvm/llvm-project/pull/86260
More information about the Mlir-commits
mailing list