@@ -53,22 +53,49 @@ struct ConstrainedVectorConvertToLLVMPattern
5353 }
5454};
5555
56+ template <typename SourceOp, typename TargetOp,
57+ template <typename , typename > typename AttrConvert =
58+ AttrConvertPassThrough>
59+ struct DenormalOpConversionToLLVMPattern
60+ : public VectorConvertToLLVMPattern<SourceOp, TargetOp, AttrConvert> {
61+ using VectorConvertToLLVMPattern<SourceOp, TargetOp,
62+ AttrConvert>::VectorConvertToLLVMPattern;
63+
64+ LogicalResult
65+ matchAndRewrite (SourceOp op, typename SourceOp::Adaptor adaptor,
66+ ConversionPatternRewriter &rewriter) const override {
67+ // TODO: Here, we need a legalization step. LLVM provides a function-level
68+ // attribute for denormal; here, we need to move this information from the
69+ // operation to the function, making sure all the operations in the same
70+ // function are consistent.
71+ if (op.getDenormalModeAttr ().getValue () != arith::DenormalMode::ieee)
72+ return rewriter.notifyMatchFailure (
73+ op, " only ieee denormal mode is supported at the moment" );
74+
75+ StringRef arithDenormalAttrName = SourceOp::getDenormalModeAttrName ();
76+ op->removeAttr (arithDenormalAttrName);
77+ return VectorConvertToLLVMPattern<SourceOp, TargetOp,
78+ AttrConvert>::matchAndRewrite (op, adaptor,
79+ rewriter);
80+ }
81+ };
82+
5683// ===----------------------------------------------------------------------===//
5784// Straightforward Op Lowerings
5885// ===----------------------------------------------------------------------===//
5986
6087using AddFOpLowering =
61- VectorConvertToLLVMPattern <arith::AddFOp, LLVM::FAddOp,
62- arith::AttrConvertFastMathToLLVM>;
88+ DenormalOpConversionToLLVMPattern <arith::AddFOp, LLVM::FAddOp,
89+ arith::AttrConvertFastMathToLLVM>;
6390using AddIOpLowering =
6491 VectorConvertToLLVMPattern<arith::AddIOp, LLVM::AddOp,
6592 arith::AttrConvertOverflowToLLVM>;
6693using AndIOpLowering = VectorConvertToLLVMPattern<arith::AndIOp, LLVM::AndOp>;
6794using BitcastOpLowering =
6895 VectorConvertToLLVMPattern<arith::BitcastOp, LLVM::BitcastOp>;
6996using DivFOpLowering =
70- VectorConvertToLLVMPattern <arith::DivFOp, LLVM::FDivOp,
71- arith::AttrConvertFastMathToLLVM>;
97+ DenormalOpConversionToLLVMPattern <arith::DivFOp, LLVM::FDivOp,
98+ arith::AttrConvertFastMathToLLVM>;
7299using DivSIOpLowering =
73100 VectorConvertToLLVMPattern<arith::DivSIOp, LLVM::SDivOp>;
74101using DivUIOpLowering =
@@ -83,38 +110,38 @@ using FPToSIOpLowering =
83110using FPToUIOpLowering =
84111 VectorConvertToLLVMPattern<arith::FPToUIOp, LLVM::FPToUIOp>;
85112using MaximumFOpLowering =
86- VectorConvertToLLVMPattern <arith::MaximumFOp, LLVM::MaximumOp,
87- arith::AttrConvertFastMathToLLVM>;
113+ DenormalOpConversionToLLVMPattern <arith::MaximumFOp, LLVM::MaximumOp,
114+ arith::AttrConvertFastMathToLLVM>;
88115using MaxNumFOpLowering =
89- VectorConvertToLLVMPattern <arith::MaxNumFOp, LLVM::MaxNumOp,
90- arith::AttrConvertFastMathToLLVM>;
116+ DenormalOpConversionToLLVMPattern <arith::MaxNumFOp, LLVM::MaxNumOp,
117+ arith::AttrConvertFastMathToLLVM>;
91118using MaxSIOpLowering =
92119 VectorConvertToLLVMPattern<arith::MaxSIOp, LLVM::SMaxOp>;
93120using MaxUIOpLowering =
94121 VectorConvertToLLVMPattern<arith::MaxUIOp, LLVM::UMaxOp>;
95122using MinimumFOpLowering =
96- VectorConvertToLLVMPattern <arith::MinimumFOp, LLVM::MinimumOp,
97- arith::AttrConvertFastMathToLLVM>;
123+ DenormalOpConversionToLLVMPattern <arith::MinimumFOp, LLVM::MinimumOp,
124+ arith::AttrConvertFastMathToLLVM>;
98125using MinNumFOpLowering =
99- VectorConvertToLLVMPattern <arith::MinNumFOp, LLVM::MinNumOp,
100- arith::AttrConvertFastMathToLLVM>;
126+ DenormalOpConversionToLLVMPattern <arith::MinNumFOp, LLVM::MinNumOp,
127+ arith::AttrConvertFastMathToLLVM>;
101128using MinSIOpLowering =
102129 VectorConvertToLLVMPattern<arith::MinSIOp, LLVM::SMinOp>;
103130using MinUIOpLowering =
104131 VectorConvertToLLVMPattern<arith::MinUIOp, LLVM::UMinOp>;
105132using MulFOpLowering =
106- VectorConvertToLLVMPattern <arith::MulFOp, LLVM::FMulOp,
107- arith::AttrConvertFastMathToLLVM>;
133+ DenormalOpConversionToLLVMPattern <arith::MulFOp, LLVM::FMulOp,
134+ arith::AttrConvertFastMathToLLVM>;
108135using MulIOpLowering =
109136 VectorConvertToLLVMPattern<arith::MulIOp, LLVM::MulOp,
110137 arith::AttrConvertOverflowToLLVM>;
111138using NegFOpLowering =
112- VectorConvertToLLVMPattern <arith::NegFOp, LLVM::FNegOp,
113- arith::AttrConvertFastMathToLLVM>;
139+ DenormalOpConversionToLLVMPattern <arith::NegFOp, LLVM::FNegOp,
140+ arith::AttrConvertFastMathToLLVM>;
114141using OrIOpLowering = VectorConvertToLLVMPattern<arith::OrIOp, LLVM::OrOp>;
115142using RemFOpLowering =
116- VectorConvertToLLVMPattern <arith::RemFOp, LLVM::FRemOp,
117- arith::AttrConvertFastMathToLLVM>;
143+ DenormalOpConversionToLLVMPattern <arith::RemFOp, LLVM::FRemOp,
144+ arith::AttrConvertFastMathToLLVM>;
118145using RemSIOpLowering =
119146 VectorConvertToLLVMPattern<arith::RemSIOp, LLVM::SRemOp>;
120147using RemUIOpLowering =
@@ -131,8 +158,8 @@ using ShRUIOpLowering =
131158using SIToFPOpLowering =
132159 VectorConvertToLLVMPattern<arith::SIToFPOp, LLVM::SIToFPOp>;
133160using SubFOpLowering =
134- VectorConvertToLLVMPattern <arith::SubFOp, LLVM::FSubOp,
135- arith::AttrConvertFastMathToLLVM>;
161+ DenormalOpConversionToLLVMPattern <arith::SubFOp, LLVM::FSubOp,
162+ arith::AttrConvertFastMathToLLVM>;
136163using SubIOpLowering =
137164 VectorConvertToLLVMPattern<arith::SubIOp, LLVM::SubOp,
138165 arith::AttrConvertOverflowToLLVM>;
0 commit comments