@@ -32,9 +32,10 @@ namespace {
3232template <typename SourceOp, typename TargetOp>
3333using ConvertFastMath = arith::AttrConvertFastMathToLLVM<SourceOp, TargetOp>;
3434
35- template <typename SourceOp, typename TargetOp>
35+ template <typename SourceOp, typename TargetOp, bool FailOnUnsupportedFP = true >
3636using ConvertFMFMathToLLVMPattern =
37- VectorConvertToLLVMPattern<SourceOp, TargetOp, ConvertFastMath>;
37+ VectorConvertToLLVMPattern<SourceOp, TargetOp, ConvertFastMath,
38+ FailOnUnsupportedFP>;
3839
3940using AbsFOpLowering = ConvertFMFMathToLLVMPattern<math::AbsFOp, LLVM::FAbsOp>;
4041using CeilOpLowering = ConvertFMFMathToLLVMPattern<math::CeilOp, LLVM::FCeilOp>;
@@ -44,7 +45,9 @@ using CosOpLowering = ConvertFMFMathToLLVMPattern<math::CosOp, LLVM::CosOp>;
4445using CoshOpLowering = ConvertFMFMathToLLVMPattern<math::CoshOp, LLVM::CoshOp>;
4546using AcosOpLowering = ConvertFMFMathToLLVMPattern<math::AcosOp, LLVM::ACosOp>;
4647using CtPopFOpLowering =
47- VectorConvertToLLVMPattern<math::CtPopOp, LLVM::CtPopOp>;
48+ VectorConvertToLLVMPattern<math::CtPopOp, LLVM::CtPopOp,
49+ AttrConvertPassThrough,
50+ /* FailOnUnsupportedFP=*/ true >;
4851using Exp2OpLowering = ConvertFMFMathToLLVMPattern<math::Exp2Op, LLVM::Exp2Op>;
4952using ExpOpLowering = ConvertFMFMathToLLVMPattern<math::ExpOp, LLVM::ExpOp>;
5053using FloorOpLowering =
@@ -76,8 +79,10 @@ using ATan2OpLowering =
7679// TODO: Result and operand types match for `absi` as opposed to `ct*z`, so it
7780// may be better to separate the patterns.
7881template <typename MathOp, typename LLVMOp>
79- struct IntOpWithFlagLowering : public ConvertOpToLLVMPattern <MathOp> {
80- using ConvertOpToLLVMPattern<MathOp>::ConvertOpToLLVMPattern;
82+ struct IntOpWithFlagLowering
83+ : public ConvertOpToLLVMPattern<MathOp, /* FailOnUnsupportedFP=*/ true > {
84+ using ConvertOpToLLVMPattern<
85+ MathOp, /* FailOnUnsupportedFP=*/ true >::ConvertOpToLLVMPattern;
8186 using Super = IntOpWithFlagLowering<MathOp, LLVMOp>;
8287
8388 LogicalResult
@@ -122,8 +127,11 @@ using CountTrailingZerosOpLowering =
122127using AbsIOpLowering = IntOpWithFlagLowering<math::AbsIOp, LLVM::AbsOp>;
123128
124129// A `sincos` is converted into `llvm.intr.sincos` followed by extractvalue ops.
125- struct SincosOpLowering : public ConvertOpToLLVMPattern <math::SincosOp> {
126- using ConvertOpToLLVMPattern<math::SincosOp>::ConvertOpToLLVMPattern;
130+ struct SincosOpLowering
131+ : public ConvertOpToLLVMPattern<math::SincosOp,
132+ /* FailOnUnsupportedFP=*/ true > {
133+ using ConvertOpToLLVMPattern<
134+ math::SincosOp, /* FailOnUnsupportedFP=*/ true >::ConvertOpToLLVMPattern;
127135
128136 LogicalResult
129137 matchAndRewrite (math::SincosOp op, OpAdaptor adaptor,
@@ -154,8 +162,11 @@ struct SincosOpLowering : public ConvertOpToLLVMPattern<math::SincosOp> {
154162};
155163
156164// A `expm1` is converted into `exp - 1`.
157- struct ExpM1OpLowering : public ConvertOpToLLVMPattern <math::ExpM1Op> {
158- using ConvertOpToLLVMPattern<math::ExpM1Op>::ConvertOpToLLVMPattern;
165+ struct ExpM1OpLowering
166+ : public ConvertOpToLLVMPattern<math::ExpM1Op,
167+ /* FailOnUnsupportedFP=*/ true > {
168+ using ConvertOpToLLVMPattern<
169+ math::ExpM1Op, /* FailOnUnsupportedFP=*/ true >::ConvertOpToLLVMPattern;
159170
160171 LogicalResult
161172 matchAndRewrite (math::ExpM1Op op, OpAdaptor adaptor,
@@ -216,8 +227,11 @@ struct ExpM1OpLowering : public ConvertOpToLLVMPattern<math::ExpM1Op> {
216227};
217228
218229// A `log1p` is converted into `log(1 + ...)`.
219- struct Log1pOpLowering : public ConvertOpToLLVMPattern <math::Log1pOp> {
220- using ConvertOpToLLVMPattern<math::Log1pOp>::ConvertOpToLLVMPattern;
230+ struct Log1pOpLowering
231+ : public ConvertOpToLLVMPattern<math::Log1pOp,
232+ /* FailOnUnsupportedFP=*/ true > {
233+ using ConvertOpToLLVMPattern<
234+ math::Log1pOp, /* FailOnUnsupportedFP=*/ true >::ConvertOpToLLVMPattern;
221235
222236 LogicalResult
223237 matchAndRewrite (math::Log1pOp op, OpAdaptor adaptor,
@@ -278,8 +292,11 @@ struct Log1pOpLowering : public ConvertOpToLLVMPattern<math::Log1pOp> {
278292};
279293
280294// A `rsqrt` is converted into `1 / sqrt`.
281- struct RsqrtOpLowering : public ConvertOpToLLVMPattern <math::RsqrtOp> {
282- using ConvertOpToLLVMPattern<math::RsqrtOp>::ConvertOpToLLVMPattern;
295+ struct RsqrtOpLowering
296+ : public ConvertOpToLLVMPattern<math::RsqrtOp,
297+ /* FailOnUnsupportedFP=*/ true > {
298+ using ConvertOpToLLVMPattern<
299+ math::RsqrtOp, /* FailOnUnsupportedFP=*/ true >::ConvertOpToLLVMPattern;
283300
284301 LogicalResult
285302 matchAndRewrite (math::RsqrtOp op, OpAdaptor adaptor,
@@ -339,8 +356,11 @@ struct RsqrtOpLowering : public ConvertOpToLLVMPattern<math::RsqrtOp> {
339356 }
340357};
341358
342- struct IsNaNOpLowering : public ConvertOpToLLVMPattern <math::IsNaNOp> {
343- using ConvertOpToLLVMPattern<math::IsNaNOp>::ConvertOpToLLVMPattern;
359+ struct IsNaNOpLowering
360+ : public ConvertOpToLLVMPattern<math::IsNaNOp,
361+ /* FailOnUnsupportedFP=*/ true > {
362+ using ConvertOpToLLVMPattern<
363+ math::IsNaNOp, /* FailOnUnsupportedFP=*/ true >::ConvertOpToLLVMPattern;
344364
345365 LogicalResult
346366 matchAndRewrite (math::IsNaNOp op, OpAdaptor adaptor,
@@ -358,8 +378,11 @@ struct IsNaNOpLowering : public ConvertOpToLLVMPattern<math::IsNaNOp> {
358378 }
359379};
360380
361- struct IsFiniteOpLowering : public ConvertOpToLLVMPattern <math::IsFiniteOp> {
362- using ConvertOpToLLVMPattern<math::IsFiniteOp>::ConvertOpToLLVMPattern;
381+ struct IsFiniteOpLowering
382+ : public ConvertOpToLLVMPattern<math::IsFiniteOp,
383+ /* FailOnUnsupportedFP=*/ true > {
384+ using ConvertOpToLLVMPattern<
385+ math::IsFiniteOp, /* FailOnUnsupportedFP=*/ true >::ConvertOpToLLVMPattern;
363386
364387 LogicalResult
365388 matchAndRewrite (math::IsFiniteOp op, OpAdaptor adaptor,
0 commit comments