Lines Matching refs:mlir
48 static inline mlir::Type getVoidPtrType(mlir::MLIRContext *context) { in getVoidPtrType()
49 return mlir::LLVM::LLVMPointerType::get(mlir::IntegerType::get(context, 8)); in getVoidPtrType()
52 static mlir::LLVM::ConstantOp
53 genConstantIndex(mlir::Location loc, mlir::Type ity, in genConstantIndex()
54 mlir::ConversionPatternRewriter &rewriter, in genConstantIndex()
57 return rewriter.create<mlir::LLVM::ConstantOp>(loc, ity, cattr); in genConstantIndex()
60 static mlir::Block *createBlock(mlir::ConversionPatternRewriter &rewriter, in createBlock()
61 mlir::Block *insertBefore) { in createBlock()
64 mlir::Region::iterator(insertBefore)); in createBlock()
69 static int64_t getConstantIntValue(mlir::Value val) { in getConstantIntValue()
70 assert(val && val.dyn_cast<mlir::OpResult>() && "must not be null value"); in getConstantIntValue()
71 mlir::Operation *defop = val.getDefiningOp(); in getConstantIntValue()
73 if (auto constOp = mlir::dyn_cast<mlir::arith::ConstantIntOp>(defop)) in getConstantIntValue()
75 if (auto llConstOp = mlir::dyn_cast<mlir::LLVM::ConstantOp>(defop)) in getConstantIntValue()
76 if (auto attr = llConstOp.getValue().dyn_cast<mlir::IntegerAttr>()) in getConstantIntValue()
84 class FIROpConversion : public mlir::ConvertOpToLLVMPattern<FromOp> {
88 : mlir::ConvertOpToLLVMPattern<FromOp>(lowering), options(options) {} in FIROpConversion()
91 mlir::Type convertType(mlir::Type ty) const { in convertType()
94 mlir::Type voidPtrTy() const { return getVoidPtrType(); } in voidPtrTy()
96 mlir::Type getVoidPtrType() const { in getVoidPtrType()
97 return mlir::LLVM::LLVMPointerType::get( in getVoidPtrType()
98 mlir::IntegerType::get(&lowerTy().getContext(), 8)); in getVoidPtrType()
101 mlir::LLVM::ConstantOp
102 genI32Constant(mlir::Location loc, mlir::ConversionPatternRewriter &rewriter, in genI32Constant()
104 mlir::Type i32Ty = rewriter.getI32Type(); in genI32Constant()
105 mlir::IntegerAttr attr = rewriter.getI32IntegerAttr(value); in genI32Constant()
106 return rewriter.create<mlir::LLVM::ConstantOp>(loc, i32Ty, attr); in genI32Constant()
109 mlir::LLVM::ConstantOp
110 genConstantOffset(mlir::Location loc, in genConstantOffset()
111 mlir::ConversionPatternRewriter &rewriter, in genConstantOffset()
113 mlir::Type ity = lowerTy().offsetType(); in genConstantOffset()
114 mlir::IntegerAttr cattr = rewriter.getI32IntegerAttr(offset); in genConstantOffset()
115 return rewriter.create<mlir::LLVM::ConstantOp>(loc, ity, cattr); in genConstantOffset()
122 mlir::Value integerCast(mlir::Location loc, in integerCast()
123 mlir::ConversionPatternRewriter &rewriter, in integerCast()
124 mlir::Type ty, mlir::Value val) const { in integerCast()
128 if (!valTy.isa<mlir::IntegerType>()) in integerCast()
130 auto toSize = mlir::LLVM::getPrimitiveTypeSizeInBits(ty); in integerCast()
131 auto fromSize = mlir::LLVM::getPrimitiveTypeSizeInBits(valTy); in integerCast()
133 return rewriter.create<mlir::LLVM::TruncOp>(loc, ty, val); in integerCast()
135 return rewriter.create<mlir::LLVM::SExtOp>(loc, ty, val); in integerCast()
140 mlir::Value getValueFromBox(mlir::Location loc, mlir::Value box, in getValueFromBox()
141 mlir::Type resultTy, in getValueFromBox()
142 mlir::ConversionPatternRewriter &rewriter, in getValueFromBox()
144 mlir::LLVM::ConstantOp c0 = genConstantOffset(loc, rewriter, 0); in getValueFromBox()
145 mlir::LLVM::ConstantOp cValuePos = in getValueFromBox()
147 auto pty = mlir::LLVM::LLVMPointerType::get(resultTy); in getValueFromBox()
148 auto p = rewriter.create<mlir::LLVM::GEPOp>( in getValueFromBox()
149 loc, pty, box, mlir::ValueRange{c0, cValuePos}); in getValueFromBox()
150 return rewriter.create<mlir::LLVM::LoadOp>(loc, resultTy, p); in getValueFromBox()
155 llvm::SmallVector<mlir::Value, 3>
156 getDimsFromBox(mlir::Location loc, llvm::ArrayRef<mlir::Type> retTys, in getDimsFromBox()
157 mlir::Value box, mlir::Value dim, in getDimsFromBox()
158 mlir::ConversionPatternRewriter &rewriter) const { in getDimsFromBox()
159 mlir::LLVM::ConstantOp c0 = genConstantOffset(loc, rewriter, 0); in getDimsFromBox()
160 mlir::LLVM::ConstantOp cDims = in getDimsFromBox()
162 mlir::LLVM::LoadOp l0 = in getDimsFromBox()
164 mlir::LLVM::LoadOp l1 = in getDimsFromBox()
166 mlir::LLVM::LoadOp l2 = in getDimsFromBox()
171 mlir::LLVM::LoadOp
172 loadFromOffset(mlir::Location loc, mlir::Value a, mlir::LLVM::ConstantOp c0, in loadFromOffset()
173 mlir::LLVM::ConstantOp cDims, mlir::Value dim, int off, in loadFromOffset()
174 mlir::Type ty, in loadFromOffset()
175 mlir::ConversionPatternRewriter &rewriter) const { in loadFromOffset()
176 auto pty = mlir::LLVM::LLVMPointerType::get(ty); in loadFromOffset()
177 mlir::LLVM::ConstantOp c = genConstantOffset(loc, rewriter, off); in loadFromOffset()
178 mlir::LLVM::GEPOp p = genGEP(loc, pty, rewriter, a, c0, cDims, dim, c); in loadFromOffset()
179 return rewriter.create<mlir::LLVM::LoadOp>(loc, ty, p); in loadFromOffset()
182 mlir::Value
183 loadStrideFromBox(mlir::Location loc, mlir::Value box, unsigned dim, in loadStrideFromBox()
184 mlir::ConversionPatternRewriter &rewriter) const { in loadStrideFromBox()
194 mlir::Value
195 loadBaseAddrFromBox(mlir::Location loc, mlir::Type ty, mlir::Value box, in loadBaseAddrFromBox()
196 mlir::ConversionPatternRewriter &rewriter) const { in loadBaseAddrFromBox()
197 mlir::LLVM::ConstantOp c0 = genConstantOffset(loc, rewriter, 0); in loadBaseAddrFromBox()
198 mlir::LLVM::ConstantOp cAddr = in loadBaseAddrFromBox()
200 auto pty = mlir::LLVM::LLVMPointerType::get(ty); in loadBaseAddrFromBox()
201 mlir::LLVM::GEPOp p = genGEP(loc, pty, rewriter, box, c0, cAddr); in loadBaseAddrFromBox()
202 return rewriter.create<mlir::LLVM::LoadOp>(loc, ty, p); in loadBaseAddrFromBox()
205 mlir::Value
206 loadElementSizeFromBox(mlir::Location loc, mlir::Type ty, mlir::Value box, in loadElementSizeFromBox()
207 mlir::ConversionPatternRewriter &rewriter) const { in loadElementSizeFromBox()
208 mlir::LLVM::ConstantOp c0 = genConstantOffset(loc, rewriter, 0); in loadElementSizeFromBox()
209 mlir::LLVM::ConstantOp cElemLen = in loadElementSizeFromBox()
211 auto pty = mlir::LLVM::LLVMPointerType::get(ty); in loadElementSizeFromBox()
212 mlir::LLVM::GEPOp p = genGEP(loc, pty, rewriter, box, c0, cElemLen); in loadElementSizeFromBox()
213 return rewriter.create<mlir::LLVM::LoadOp>(loc, ty, p); in loadElementSizeFromBox()
218 static mlir::Type getBoxEleTy(mlir::Type type, in getBoxEleTy()
220 if (auto t = type.dyn_cast<mlir::LLVM::LLVMPointerType>()) in getBoxEleTy()
223 if (auto t = type.dyn_cast<mlir::LLVM::LLVMStructType>()) { in getBoxEleTy()
226 } else if (auto t = type.dyn_cast<mlir::LLVM::LLVMArrayType>()) { in getBoxEleTy()
228 } else if (auto t = type.dyn_cast<mlir::VectorType>()) { in getBoxEleTy()
231 fir::emitFatalError(mlir::UnknownLoc::get(type.getContext()), in getBoxEleTy()
240 static mlir::Type getBaseAddrTypeFromBox(mlir::Type type) { in getBaseAddrTypeFromBox()
246 mlir::Value genBoxAttributeCheck(mlir::Location loc, mlir::Value box, in genBoxAttributeCheck()
247 mlir::ConversionPatternRewriter &rewriter, in genBoxAttributeCheck()
249 mlir::Type attrTy = rewriter.getI32Type(); in genBoxAttributeCheck()
250 mlir::Value attribute = in genBoxAttributeCheck()
252 mlir::LLVM::ConstantOp attrMask = in genBoxAttributeCheck()
255 rewriter.create<mlir::LLVM::AndOp>(loc, attrTy, attribute, attrMask); in genBoxAttributeCheck()
256 mlir::LLVM::ConstantOp c0 = genConstantOffset(loc, rewriter, 0); in genBoxAttributeCheck()
257 return rewriter.create<mlir::LLVM::ICmpOp>( in genBoxAttributeCheck()
258 loc, mlir::LLVM::ICmpPredicate::ne, maskRes, c0); in genBoxAttributeCheck()
262 mlir::LLVM::GEPOp genGEP(mlir::Location loc, mlir::Type ty, in genGEP()
263 mlir::ConversionPatternRewriter &rewriter, in genGEP()
264 mlir::Value base, ARGS... args) const { in genGEP()
265 llvm::SmallVector<mlir::Value> cv = {args...}; in genGEP()
266 return rewriter.create<mlir::LLVM::GEPOp>(loc, ty, base, cv); in genGEP()
283 mlir::LogicalResult
285 mlir::ConversionPatternRewriter &rewriter) const final { in matchAndRewrite()
286 mlir::Type ty = this->convertType(op.getType()); in matchAndRewrite()
290 virtual mlir::LogicalResult
291 doRewrite(FromOp addr, mlir::Type ty, OpAdaptor adaptor,
292 mlir::ConversionPatternRewriter &rewriter) const = 0;
301 mlir::LogicalResult
303 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
305 rewriter.replaceOpWithNewOp<mlir::LLVM::AddressOfOp>( in matchAndRewrite()
307 return mlir::success(); in matchAndRewrite()
315 static mlir::LLVM::LLVMFuncOp
317 mlir::ConversionPatternRewriter &rewriter) { in getDependentTypeMemSizeFn()
318 auto module = op->getParentOfType<mlir::ModuleOp>(); in getDependentTypeMemSizeFn()
320 if (auto memSizeFunc = module.lookupSymbol<mlir::LLVM::LLVMFuncOp>(name)) in getDependentTypeMemSizeFn()
330 static mlir::Value
331 genAllocationScaleSize(OP op, mlir::Type ity, in genAllocationScaleSize()
332 mlir::ConversionPatternRewriter &rewriter) { in genAllocationScaleSize()
333 mlir::Location loc = op.getLoc(); in genAllocationScaleSize()
334 mlir::Type dataTy = op.getInType(); in genAllocationScaleSize()
335 mlir::Type scalarType = fir::unwrapSequenceType(dataTy); in genAllocationScaleSize()
344 mlir::Value constVal{ in genAllocationScaleSize()
357 mlir::LogicalResult
359 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
360 mlir::ValueRange operands = adaptor.getOperands(); in matchAndRewrite()
362 mlir::Type ity = lowerTy().indexType(); in matchAndRewrite()
364 mlir::Value size = genConstantIndex(loc, ity, rewriter, 1).getResult(); in matchAndRewrite()
365 mlir::Type ty = convertType(alloc.getType()); in matchAndRewrite()
366 mlir::Type resultTy = ty; in matchAndRewrite()
369 llvm::SmallVector<mlir::Value> lenParams; in matchAndRewrite()
372 mlir::Type scalarType = fir::unwrapSequenceType(alloc.getInType()); in matchAndRewrite()
376 ty = mlir::LLVM::LLVMPointerType::get(convertType(rawCharTy)); in matchAndRewrite()
380 mlir::LLVM::LLVMFuncOp memSizeFn = in matchAndRewrite()
384 mlir::NamedAttribute attr = rewriter.getNamedAttr( in matchAndRewrite()
385 "callee", mlir::SymbolRefAttr::get(memSizeFn)); in matchAndRewrite()
386 auto call = rewriter.create<mlir::LLVM::CallOp>( in matchAndRewrite()
387 loc, ity, lenParams, llvm::ArrayRef<mlir::NamedAttribute>{attr}); in matchAndRewrite()
396 size = rewriter.create<mlir::LLVM::MulOp>(loc, ity, size, scaleSize); in matchAndRewrite()
400 size = rewriter.create<mlir::LLVM::MulOp>( in matchAndRewrite()
405 rewriter.replaceOpWithNewOp<mlir::LLVM::AllocaOp>(alloc, ty, size, in matchAndRewrite()
408 auto al = rewriter.create<mlir::LLVM::AllocaOp>(loc, ty, size, in matchAndRewrite()
410 rewriter.replaceOpWithNewOp<mlir::LLVM::BitcastOp>(alloc, resultTy, al); in matchAndRewrite()
412 return mlir::success(); in matchAndRewrite()
419 static mlir::LLVM::ExtractValueOp
420 genExtractValueWithIndex(mlir::Location loc, mlir::Value tuple, mlir::Type ty, in genExtractValueWithIndex()
421 mlir::ConversionPatternRewriter &rewriter, in genExtractValueWithIndex()
422 mlir::MLIRContext *ctx, int x) { in genExtractValueWithIndex()
423 auto cx = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(x)); in genExtractValueWithIndex()
424 auto xty = ty.cast<mlir::LLVM::LLVMStructType>().getBody()[x]; in genExtractValueWithIndex()
425 return rewriter.create<mlir::LLVM::ExtractValueOp>(loc, xty, tuple, cx); in genExtractValueWithIndex()
434 mlir::LogicalResult
436 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
437 mlir::Value a = adaptor.getOperands()[0]; in matchAndRewrite()
439 mlir::Type ty = convertType(boxaddr.getType()); in matchAndRewrite()
444 auto c0 = mlir::ArrayAttr::get(boxaddr.getContext(), c0attr); in matchAndRewrite()
445 rewriter.replaceOpWithNewOp<mlir::LLVM::ExtractValueOp>(boxaddr, ty, a, in matchAndRewrite()
448 return mlir::success(); in matchAndRewrite()
457 mlir::LogicalResult
459 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
460 mlir::Value boxChar = adaptor.getOperands()[0]; in matchAndRewrite()
461 mlir::Location loc = boxChar.getLoc(); in matchAndRewrite()
462 mlir::MLIRContext *ctx = boxChar.getContext(); in matchAndRewrite()
463 mlir::Type returnValTy = boxCharLen.getResult().getType(); in matchAndRewrite()
466 mlir::LLVM::ExtractValueOp len = genExtractValueWithIndex( in matchAndRewrite()
468 mlir::Value lenAfterCast = integerCast(loc, rewriter, returnValTy, len); in matchAndRewrite()
471 return mlir::success(); in matchAndRewrite()
481 mlir::LogicalResult
483 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
484 llvm::SmallVector<mlir::Type, 3> resultTypes = { in matchAndRewrite()
493 return mlir::success(); in matchAndRewrite()
502 mlir::LogicalResult
504 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
505 mlir::Value a = adaptor.getOperands()[0]; in matchAndRewrite()
510 return mlir::success(); in matchAndRewrite()
519 mlir::LogicalResult
521 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
522 mlir::Value box = adaptor.getOperands()[0]; in matchAndRewrite()
524 mlir::Value check = in matchAndRewrite()
527 return mlir::success(); in matchAndRewrite()
536 mlir::LogicalResult
538 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
539 mlir::Value a = adaptor.getOperands()[0]; in matchAndRewrite()
544 rewriter.replaceOpWithNewOp<mlir::LLVM::ICmpOp>( in matchAndRewrite()
545 boxisarray, mlir::LLVM::ICmpPredicate::ne, rank, c0); in matchAndRewrite()
546 return mlir::success(); in matchAndRewrite()
555 mlir::LogicalResult
557 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
558 mlir::Value box = adaptor.getOperands()[0]; in matchAndRewrite()
560 mlir::Value check = genBoxAttributeCheck(loc, box, rewriter, kAttrPointer); in matchAndRewrite()
562 return mlir::success(); in matchAndRewrite()
571 mlir::LogicalResult
573 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
574 mlir::Value a = adaptor.getOperands()[0]; in matchAndRewrite()
576 mlir::Type ty = convertType(boxrank.getType()); in matchAndRewrite()
579 return mlir::success(); in matchAndRewrite()
589 mlir::LogicalResult
591 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
593 return mlir::failure(); in matchAndRewrite()
602 mlir::LogicalResult
604 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
605 mlir::Value box = adaptor.getOperands()[0]; in matchAndRewrite()
607 mlir::Type typeTy = in matchAndRewrite()
610 auto typePtrTy = mlir::LLVM::LLVMPointerType::get(typeTy); in matchAndRewrite()
611 rewriter.replaceOpWithNewOp<mlir::LLVM::IntToPtrOp>(boxtypedesc, typePtrTy, in matchAndRewrite()
613 return mlir::success(); in matchAndRewrite()
621 mlir::LogicalResult
623 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
626 if (attr.isa<mlir::StringAttr>()) { in matchAndRewrite()
627 rewriter.replaceOpWithNewOp<mlir::LLVM::ConstantOp>(constop, ty, attr); in matchAndRewrite()
628 return mlir::success(); in matchAndRewrite()
633 mlir::Type intTy = rewriter.getIntegerType(bits); in matchAndRewrite()
634 mlir::Location loc = constop.getLoc(); in matchAndRewrite()
635 mlir::Value cst = rewriter.create<mlir::LLVM::UndefOp>(loc, ty); in matchAndRewrite()
636 if (auto arr = attr.dyn_cast<mlir::DenseElementsAttr>()) { in matchAndRewrite()
637 cst = rewriter.create<mlir::LLVM::ConstantOp>(loc, ty, arr); in matchAndRewrite()
638 } else if (auto arr = attr.dyn_cast<mlir::ArrayAttr>()) { in matchAndRewrite()
641 auto elemAttr = mlir::IntegerAttr::get( in matchAndRewrite()
643 a.value().cast<mlir::IntegerAttr>().getValue().zextOrTrunc(bits)); in matchAndRewrite()
645 rewriter.create<mlir::LLVM::ConstantOp>(loc, intTy, elemAttr); in matchAndRewrite()
646 auto index = mlir::ArrayAttr::get( in matchAndRewrite()
648 cst = rewriter.create<mlir::LLVM::InsertValueOp>(loc, ty, cst, elemCst, in matchAndRewrite()
652 return mlir::failure(); in matchAndRewrite()
655 return mlir::success(); in matchAndRewrite()
663 mlir::LogicalResult
665 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
666 llvm::SmallVector<mlir::Type> resultTys; in matchAndRewrite()
669 rewriter.replaceOpWithNewOp<mlir::LLVM::CallOp>( in matchAndRewrite()
671 return mlir::success(); in matchAndRewrite()
676 static mlir::Type getComplexEleTy(mlir::Type complex) { in getComplexEleTy()
677 if (auto cc = complex.dyn_cast<mlir::ComplexType>()) in getComplexEleTy()
691 mlir::LogicalResult
693 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
694 mlir::ValueRange operands = adaptor.getOperands(); in matchAndRewrite()
695 mlir::MLIRContext *ctxt = cmp.getContext(); in matchAndRewrite()
696 mlir::Type eleTy = convertType(getComplexEleTy(cmp.getLhs().getType())); in matchAndRewrite()
697 mlir::Type resTy = convertType(cmp.getType()); in matchAndRewrite()
698 mlir::Location loc = cmp.getLoc(); in matchAndRewrite()
699 auto pos0 = mlir::ArrayAttr::get(ctxt, rewriter.getI32IntegerAttr(0)); in matchAndRewrite()
700 llvm::SmallVector<mlir::Value, 2> rp = { in matchAndRewrite()
701 rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, operands[0], in matchAndRewrite()
703 rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, operands[1], in matchAndRewrite()
706 rewriter.create<mlir::LLVM::FCmpOp>(loc, resTy, rp, cmp->getAttrs()); in matchAndRewrite()
707 auto pos1 = mlir::ArrayAttr::get(ctxt, rewriter.getI32IntegerAttr(1)); in matchAndRewrite()
708 llvm::SmallVector<mlir::Value, 2> ip = { in matchAndRewrite()
709 rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, operands[0], in matchAndRewrite()
711 rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, operands[1], in matchAndRewrite()
714 rewriter.create<mlir::LLVM::FCmpOp>(loc, resTy, ip, cmp->getAttrs()); in matchAndRewrite()
715 llvm::SmallVector<mlir::Value, 2> cp = {rcp, icp}; in matchAndRewrite()
717 case mlir::arith::CmpFPredicate::OEQ: // .EQ. in matchAndRewrite()
718 rewriter.replaceOpWithNewOp<mlir::LLVM::AndOp>(cmp, resTy, cp); in matchAndRewrite()
720 case mlir::arith::CmpFPredicate::UNE: // .NE. in matchAndRewrite()
721 rewriter.replaceOpWithNewOp<mlir::LLVM::OrOp>(cmp, resTy, cp); in matchAndRewrite()
727 return mlir::success(); in matchAndRewrite()
735 mlir::LogicalResult
737 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
738 mlir::Location loc = conc.getLoc(); in matchAndRewrite()
739 mlir::MLIRContext *ctx = conc.getContext(); in matchAndRewrite()
740 mlir::Type ty = convertType(conc.getType()); in matchAndRewrite()
741 mlir::Type ety = convertType(getComplexEleTy(conc.getType())); in matchAndRewrite()
742 auto realFloatAttr = mlir::FloatAttr::get(ety, getValue(conc.getReal())); in matchAndRewrite()
744 rewriter.create<mlir::LLVM::ConstantOp>(loc, ety, realFloatAttr); in matchAndRewrite()
745 auto imFloatAttr = mlir::FloatAttr::get(ety, getValue(conc.getImaginary())); in matchAndRewrite()
747 rewriter.create<mlir::LLVM::ConstantOp>(loc, ety, imFloatAttr); in matchAndRewrite()
748 auto realIndex = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(0)); in matchAndRewrite()
749 auto imIndex = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(1)); in matchAndRewrite()
750 auto undef = rewriter.create<mlir::LLVM::UndefOp>(loc, ty); in matchAndRewrite()
751 auto setReal = rewriter.create<mlir::LLVM::InsertValueOp>( in matchAndRewrite()
753 rewriter.replaceOpWithNewOp<mlir::LLVM::InsertValueOp>(conc, ty, setReal, in matchAndRewrite()
755 return mlir::success(); in matchAndRewrite()
758 inline llvm::APFloat getValue(mlir::Attribute attr) const { in getValue()
767 static bool isFloatingPointTy(mlir::Type ty) { in isFloatingPointTy()
768 return ty.isa<mlir::FloatType>(); in isFloatingPointTy()
771 mlir::LogicalResult
773 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
778 mlir::Value op0 = adaptor.getOperands()[0]; in matchAndRewrite()
781 return mlir::success(); in matchAndRewrite()
784 auto convertFpToFp = [&](mlir::Value val, unsigned fromBits, in matchAndRewrite()
785 unsigned toBits, mlir::Type toTy) -> mlir::Value { in matchAndRewrite()
789 mlir::emitError(loc, in matchAndRewrite()
795 return rewriter.create<mlir::LLVM::FPTruncOp>(loc, toTy, val); in matchAndRewrite()
796 return rewriter.create<mlir::LLVM::FPExtOp>(loc, toTy, val); in matchAndRewrite()
802 auto zero = mlir::ArrayAttr::get(convert.getContext(), in matchAndRewrite()
804 auto one = mlir::ArrayAttr::get(convert.getContext(), in matchAndRewrite()
807 auto rp = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, ty, op0, zero); in matchAndRewrite()
808 auto ip = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, ty, op0, one); in matchAndRewrite()
810 auto fromBits = mlir::LLVM::getPrimitiveTypeSizeInBits(ty); in matchAndRewrite()
811 auto toBits = mlir::LLVM::getPrimitiveTypeSizeInBits(nt); in matchAndRewrite()
814 auto un = rewriter.create<mlir::LLVM::UndefOp>(loc, toTy); in matchAndRewrite()
816 rewriter.create<mlir::LLVM::InsertValueOp>(loc, toTy, un, rc, zero); in matchAndRewrite()
817 rewriter.replaceOpWithNewOp<mlir::LLVM::InsertValueOp>(convert, toTy, i1, in matchAndRewrite()
819 return mlir::success(); in matchAndRewrite()
825 auto i1Type = mlir::IntegerType::get(convert.getContext(), 1); in matchAndRewrite()
827 mlir::Value zero = genConstantIndex(loc, fromTy, rewriter, 0); in matchAndRewrite()
828 rewriter.replaceOpWithNewOp<mlir::LLVM::ICmpOp>( in matchAndRewrite()
829 convert, mlir::LLVM::ICmpPredicate::ne, op0, zero); in matchAndRewrite()
830 return mlir::success(); in matchAndRewrite()
833 rewriter.replaceOpWithNewOp<mlir::LLVM::ZExtOp>(convert, toTy, op0); in matchAndRewrite()
834 return mlir::success(); in matchAndRewrite()
840 auto fromBits = mlir::LLVM::getPrimitiveTypeSizeInBits(fromTy); in matchAndRewrite()
841 auto toBits = mlir::LLVM::getPrimitiveTypeSizeInBits(toTy); in matchAndRewrite()
844 return mlir::success(); in matchAndRewrite()
846 if (toTy.isa<mlir::IntegerType>()) { in matchAndRewrite()
847 rewriter.replaceOpWithNewOp<mlir::LLVM::FPToSIOp>(convert, toTy, op0); in matchAndRewrite()
848 return mlir::success(); in matchAndRewrite()
850 } else if (fromTy.isa<mlir::IntegerType>()) { in matchAndRewrite()
852 if (toTy.isa<mlir::IntegerType>()) { in matchAndRewrite()
853 auto fromBits = mlir::LLVM::getPrimitiveTypeSizeInBits(fromTy); in matchAndRewrite()
854 auto toBits = mlir::LLVM::getPrimitiveTypeSizeInBits(toTy); in matchAndRewrite()
857 rewriter.replaceOpWithNewOp<mlir::LLVM::TruncOp>(convert, toTy, op0); in matchAndRewrite()
858 return mlir::success(); in matchAndRewrite()
860 rewriter.replaceOpWithNewOp<mlir::LLVM::SExtOp>(convert, toTy, op0); in matchAndRewrite()
861 return mlir::success(); in matchAndRewrite()
865 rewriter.replaceOpWithNewOp<mlir::LLVM::SIToFPOp>(convert, toTy, op0); in matchAndRewrite()
866 return mlir::success(); in matchAndRewrite()
869 if (toTy.isa<mlir::LLVM::LLVMPointerType>()) { in matchAndRewrite()
870 rewriter.replaceOpWithNewOp<mlir::LLVM::IntToPtrOp>(convert, toTy, op0); in matchAndRewrite()
871 return mlir::success(); in matchAndRewrite()
873 } else if (fromTy.isa<mlir::LLVM::LLVMPointerType>()) { in matchAndRewrite()
875 if (toTy.isa<mlir::IntegerType>()) { in matchAndRewrite()
876 rewriter.replaceOpWithNewOp<mlir::LLVM::PtrToIntOp>(convert, toTy, op0); in matchAndRewrite()
877 return mlir::success(); in matchAndRewrite()
880 if (toTy.isa<mlir::LLVM::LLVMPointerType>()) { in matchAndRewrite()
881 rewriter.replaceOpWithNewOp<mlir::LLVM::BitcastOp>(convert, toTy, op0); in matchAndRewrite()
882 return mlir::success(); in matchAndRewrite()
894 mlir::LogicalResult
896 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
898 return mlir::failure(); in matchAndRewrite()
908 mlir::LogicalResult
910 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
912 return mlir::failure(); in matchAndRewrite()
921 mlir::LogicalResult
923 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
925 return mlir::failure(); in matchAndRewrite()
933 mlir::LogicalResult
935 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
937 return mlir::failure(); in matchAndRewrite()
947 mlir::LogicalResult
949 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
961 mlir::LogicalResult
963 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
964 mlir::ValueRange operands = adaptor.getOperands(); in matchAndRewrite()
967 mlir::Value charBuffer = operands[0]; in matchAndRewrite()
968 mlir::Value charBufferLen = operands[1]; in matchAndRewrite()
970 mlir::Location loc = emboxChar.getLoc(); in matchAndRewrite()
971 mlir::Type llvmStructTy = convertType(emboxChar.getType()); in matchAndRewrite()
972 auto llvmStruct = rewriter.create<mlir::LLVM::UndefOp>(loc, llvmStructTy); in matchAndRewrite()
974 mlir::Type lenTy = in matchAndRewrite()
975 llvmStructTy.cast<mlir::LLVM::LLVMStructType>().getBody()[1]; in matchAndRewrite()
976 mlir::Value lenAfterCast = integerCast(loc, rewriter, lenTy, charBufferLen); in matchAndRewrite()
978 auto c0 = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(0)); in matchAndRewrite()
979 auto c1 = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(1)); in matchAndRewrite()
980 auto insertBufferOp = rewriter.create<mlir::LLVM::InsertValueOp>( in matchAndRewrite()
982 rewriter.replaceOpWithNewOp<mlir::LLVM::InsertValueOp>( in matchAndRewrite()
985 return mlir::success(); in matchAndRewrite()
991 static mlir::LLVM::LLVMFuncOp
992 getMalloc(fir::AllocMemOp op, mlir::ConversionPatternRewriter &rewriter) { in getMalloc()
993 auto module = op->getParentOfType<mlir::ModuleOp>(); in getMalloc()
994 if (mlir::LLVM::LLVMFuncOp mallocFunc = in getMalloc()
995 module.lookupSymbol<mlir::LLVM::LLVMFuncOp>("malloc")) in getMalloc()
997 mlir::OpBuilder moduleBuilder( in getMalloc()
998 op->getParentOfType<mlir::ModuleOp>().getBodyRegion()); in getMalloc()
999 auto indexType = mlir::IntegerType::get(op.getContext(), 64); in getMalloc()
1000 return moduleBuilder.create<mlir::LLVM::LLVMFuncOp>( in getMalloc()
1002 mlir::LLVM::LLVMFunctionType::get(getVoidPtrType(op.getContext()), in getMalloc()
1009 static mlir::Value
1010 computeDerivedTypeSize(mlir::Location loc, mlir::Type ptrTy, mlir::Type idxTy, in computeDerivedTypeSize()
1011 mlir::ConversionPatternRewriter &rewriter) { in computeDerivedTypeSize()
1012 auto nullPtr = rewriter.create<mlir::LLVM::NullOp>(loc, ptrTy); in computeDerivedTypeSize()
1013 mlir::Value one = genConstantIndex(loc, idxTy, rewriter, 1); in computeDerivedTypeSize()
1014 llvm::SmallVector<mlir::Value> args = {one}; in computeDerivedTypeSize()
1015 auto gep = rewriter.create<mlir::LLVM::GEPOp>(loc, ptrTy, nullPtr, args); in computeDerivedTypeSize()
1016 return rewriter.create<mlir::LLVM::PtrToIntOp>(loc, idxTy, gep); in computeDerivedTypeSize()
1024 mlir::LogicalResult
1026 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
1027 mlir::Type heapTy = heap.getType(); in matchAndRewrite()
1028 mlir::Type ty = convertType(heapTy); in matchAndRewrite()
1029 mlir::LLVM::LLVMFuncOp mallocFunc = getMalloc(heap, rewriter); in matchAndRewrite()
1030 mlir::Location loc = heap.getLoc(); in matchAndRewrite()
1032 mlir::Type dataTy = fir::unwrapRefType(heapTy); in matchAndRewrite()
1035 mlir::Value size = genTypeSizeInBytes(loc, ity, rewriter, ty); in matchAndRewrite()
1037 size = rewriter.create<mlir::LLVM::MulOp>(loc, ity, size, scaleSize); in matchAndRewrite()
1038 for (mlir::Value opnd : adaptor.getOperands()) in matchAndRewrite()
1039 size = rewriter.create<mlir::LLVM::MulOp>( in matchAndRewrite()
1041 heap->setAttr("callee", mlir::SymbolRefAttr::get(mallocFunc)); in matchAndRewrite()
1042 auto malloc = rewriter.create<mlir::LLVM::CallOp>( in matchAndRewrite()
1044 rewriter.replaceOpWithNewOp<mlir::LLVM::BitcastOp>(heap, ty, in matchAndRewrite()
1046 return mlir::success(); in matchAndRewrite()
1050 mlir::Value genTypeSizeInBytes(mlir::Location loc, mlir::Type idxTy, in genTypeSizeInBytes()
1051 mlir::ConversionPatternRewriter &rewriter, in genTypeSizeInBytes()
1052 mlir::Type llTy) const { in genTypeSizeInBytes()
1054 auto ptrTy = llTy.dyn_cast<mlir::LLVM::LLVMPointerType>(); in genTypeSizeInBytes()
1056 mlir::LLVM::getPrimitiveTypeSizeInBits(ptrTy.getElementType())) in genTypeSizeInBytes()
1066 static mlir::LLVM::LLVMFuncOp
1067 getFree(fir::FreeMemOp op, mlir::ConversionPatternRewriter &rewriter) { in getFree()
1068 auto module = op->getParentOfType<mlir::ModuleOp>(); in getFree()
1069 if (mlir::LLVM::LLVMFuncOp freeFunc = in getFree()
1070 module.lookupSymbol<mlir::LLVM::LLVMFuncOp>("free")) in getFree()
1072 mlir::OpBuilder moduleBuilder(module.getBodyRegion()); in getFree()
1073 auto voidType = mlir::LLVM::LLVMVoidType::get(op.getContext()); in getFree()
1074 return moduleBuilder.create<mlir::LLVM::LLVMFuncOp>( in getFree()
1076 mlir::LLVM::LLVMFunctionType::get(voidType, in getFree()
1081 static unsigned getDimension(mlir::LLVM::LLVMArrayType ty) { in getDimension()
1083 for (auto eleTy = ty.getElementType().dyn_cast<mlir::LLVM::LLVMArrayType>(); in getDimension()
1085 eleTy = eleTy.getElementType().dyn_cast<mlir::LLVM::LLVMArrayType>()) in getDimension()
1095 mlir::LogicalResult
1097 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
1098 mlir::LLVM::LLVMFuncOp freeFunc = getFree(freemem, rewriter); in matchAndRewrite()
1099 mlir::Location loc = freemem.getLoc(); in matchAndRewrite()
1100 auto bitcast = rewriter.create<mlir::LLVM::BitcastOp>( in matchAndRewrite()
1102 freemem->setAttr("callee", mlir::SymbolRefAttr::get(freeFunc)); in matchAndRewrite()
1103 rewriter.create<mlir::LLVM::CallOp>( in matchAndRewrite()
1104 loc, mlir::TypeRange{}, mlir::ValueRange{bitcast}, freemem->getAttrs()); in matchAndRewrite()
1106 return mlir::success(); in matchAndRewrite()
1120 mlir::LLVM::LLVMFuncOp
1121 getFuncForAllocaInsert(mlir::ConversionPatternRewriter &rewriter) const { in getFuncForAllocaInsert()
1122 mlir::Operation *parentOp = rewriter.getInsertionBlock()->getParentOp(); in getFuncForAllocaInsert()
1123 return mlir::isa<mlir::LLVM::LLVMFuncOp>(parentOp) in getFuncForAllocaInsert()
1124 ? mlir::cast<mlir::LLVM::LLVMFuncOp>(parentOp) in getFuncForAllocaInsert()
1125 : parentOp->getParentOfType<mlir::LLVM::LLVMFuncOp>(); in getFuncForAllocaInsert()
1129 mlir::LLVM::AllocaOp
1130 genAllocaWithType(mlir::Location loc, mlir::Type toTy, unsigned alignment, in genAllocaWithType()
1131 mlir::ConversionPatternRewriter &rewriter) const { in genAllocaWithType()
1133 mlir::LLVM::LLVMFuncOp func = getFuncForAllocaInsert(rewriter); in genAllocaWithType()
1136 auto al = rewriter.create<mlir::LLVM::AllocaOp>(loc, toTy, size, alignment); in genAllocaWithType()
1163 std::tuple<mlir::Value, mlir::Value> getSizeAndTypeCode( in getSizeAndTypeCode()
1164 mlir::Location loc, mlir::ConversionPatternRewriter &rewriter, in getSizeAndTypeCode()
1165 mlir::Type boxEleTy, mlir::ValueRange lenParams = {}) const { in getSizeAndTypeCode()
1167 [&](unsigned width) -> std::tuple<mlir::Value, mlir::Value> { in __anon447c3e180902()
1173 [&](unsigned width) -> std::tuple<mlir::Value, mlir::Value> { in __anon447c3e180a02()
1178 auto doFloat = [&](unsigned width) -> std::tuple<mlir::Value, mlir::Value> { in __anon447c3e180b02()
1184 [&](unsigned width) -> std::tuple<mlir::Value, mlir::Value> { in __anon447c3e180c02()
1191 mlir::Value len) -> std::tuple<mlir::Value, mlir::Value> { in __anon447c3e180d02()
1196 auto i64Ty = mlir::IntegerType::get(&this->lowerTy().getContext(), 64); in __anon447c3e180d02()
1200 rewriter.create<mlir::LLVM::MulOp>(loc, i64Ty, byteWidth, len64); in __anon447c3e180d02()
1211 if (auto ty = boxEleTy.dyn_cast<mlir::IntegerType>())
1218 if (auto ty = boxEleTy.dyn_cast<mlir::FloatType>())
1225 if (auto ty = boxEleTy.dyn_cast<mlir::ComplexType>())
1227 ty.getElementType().cast<mlir::FloatType>().getWidth());
1249 auto ptrTy = mlir::LLVM::LLVMPointerType::get(
1251 auto nullPtr = rewriter.create<mlir::LLVM::NullOp>(loc, ptrTy);
1254 auto gep = rewriter.create<mlir::LLVM::GEPOp>(loc, ptrTy, nullPtr,
1255 mlir::ValueRange{one});
1256 auto eleSize = rewriter.create<mlir::LLVM::PtrToIntOp>(
1271 mlir::Value insertField(mlir::ConversionPatternRewriter &rewriter, in insertField()
1272 mlir::Location loc, mlir::Value dest, in insertField()
1274 mlir::Value value, bool bitcast = false) const { in insertField()
1278 value = rewriter.create<mlir::LLVM::BitcastOp>(loc, fldTy, value); in insertField()
1281 llvm::SmallVector<mlir::Attribute, 2> attrs; in insertField()
1284 auto indexesAttr = mlir::ArrayAttr::get(rewriter.getContext(), attrs); in insertField()
1285 return rewriter.create<mlir::LLVM::InsertValueOp>(loc, boxTy, dest, value, in insertField()
1289 inline mlir::Value
1290 insertBaseAddress(mlir::ConversionPatternRewriter &rewriter, in insertBaseAddress()
1291 mlir::Location loc, mlir::Value dest, in insertBaseAddress()
1292 mlir::Value base) const { in insertBaseAddress()
1297 inline mlir::Value insertLowerBound(mlir::ConversionPatternRewriter &rewriter, in insertLowerBound()
1298 mlir::Location loc, mlir::Value dest, in insertLowerBound()
1299 unsigned dim, mlir::Value lb) const { in insertLowerBound()
1304 inline mlir::Value insertExtent(mlir::ConversionPatternRewriter &rewriter, in insertExtent()
1305 mlir::Location loc, mlir::Value dest, in insertExtent()
1306 unsigned dim, mlir::Value extent) const { in insertExtent()
1311 inline mlir::Value insertStride(mlir::ConversionPatternRewriter &rewriter, in insertStride()
1312 mlir::Location loc, mlir::Value dest, in insertStride()
1313 unsigned dim, mlir::Value stride) const { in insertStride()
1321 mlir::Value
1322 getTypeDescriptor(BOX box, mlir::ConversionPatternRewriter &rewriter, in getTypeDescriptor()
1323 mlir::Location loc, fir::RecordType recType) const { in getTypeDescriptor()
1326 auto module = box->template getParentOfType<mlir::ModuleOp>(); in getTypeDescriptor()
1328 auto ty = mlir::LLVM::LLVMPointerType::get( in getTypeDescriptor()
1330 return rewriter.create<mlir::LLVM::AddressOfOp>(loc, ty, in getTypeDescriptor()
1334 module.template lookupSymbol<mlir::LLVM::GlobalOp>(name)) { in getTypeDescriptor()
1336 auto ty = mlir::LLVM::LLVMPointerType::get(global.getType()); in getTypeDescriptor()
1337 return rewriter.create<mlir::LLVM::AddressOfOp>(loc, ty, in getTypeDescriptor()
1347 return rewriter.create<mlir::LLVM::NullOp>( in getTypeDescriptor()
1352 std::tuple<fir::BoxType, mlir::Value, mlir::Value>
1353 consDescriptorPrefix(BOX box, mlir::ConversionPatternRewriter &rewriter, in consDescriptorPrefix()
1354 unsigned rank, mlir::ValueRange lenParams) const { in consDescriptorPrefix()
1358 auto llvmBoxPtrTy = convTy.template cast<mlir::LLVM::LLVMPointerType>(); in consDescriptorPrefix()
1360 mlir::Value descriptor = in consDescriptorPrefix()
1361 rewriter.create<mlir::LLVM::UndefOp>(loc, llvmBoxTy); in consDescriptorPrefix()
1363 llvm::SmallVector<mlir::Value> typeparams = lenParams; in consDescriptorPrefix()
1405 mlir::Value
1406 genBoxOffsetGep(mlir::ConversionPatternRewriter &rewriter, mlir::Location loc, in genBoxOffsetGep()
1407 mlir::Value base, mlir::Value outerOffset, in genBoxOffsetGep()
1408 mlir::ValueRange cstInteriorIndices, in genBoxOffsetGep()
1409 mlir::ValueRange componentIndices, in genBoxOffsetGep()
1410 llvm::Optional<mlir::Value> substringOffset) const { in genBoxOffsetGep()
1411 llvm::SmallVector<mlir::Value> gepArgs{outerOffset}; in genBoxOffsetGep()
1412 mlir::Type resultTy = in genBoxOffsetGep()
1413 base.getType().cast<mlir::LLVM::LLVMPointerType>().getElementType(); in genBoxOffsetGep()
1415 for (mlir::Value interiorIndex : llvm::reverse(cstInteriorIndices)) { in genBoxOffsetGep()
1416 auto arrayTy = resultTy.dyn_cast<mlir::LLVM::LLVMArrayType>(); in genBoxOffsetGep()
1424 for (mlir::Value componentIndex : componentIndices) { in genBoxOffsetGep()
1427 if (auto structTy = resultTy.dyn_cast<mlir::LLVM::LLVMStructType>()) { in genBoxOffsetGep()
1431 resultTy.dyn_cast<mlir::LLVM::LLVMArrayType>()) { in genBoxOffsetGep()
1440 if (auto arrayTy = resultTy.dyn_cast<mlir::LLVM::LLVMArrayType>()) { in genBoxOffsetGep()
1451 mlir::Type outterOffsetTy = gepArgs[0].getType(); in genBoxOffsetGep()
1452 mlir::Value cast = in genBoxOffsetGep()
1455 gepArgs[0] = rewriter.create<mlir::LLVM::AddOp>(loc, outterOffsetTy, in genBoxOffsetGep()
1459 resultTy = mlir::LLVM::LLVMPointerType::get(resultTy); in genBoxOffsetGep()
1460 return rewriter.create<mlir::LLVM::GEPOp>(loc, resultTy, base, gepArgs); in genBoxOffsetGep()
1465 getSubcomponentIndices(BOX xbox, mlir::Value memref, in getSubcomponentIndices()
1466 mlir::ValueRange operands, in getSubcomponentIndices()
1467 mlir::SmallVectorImpl<mlir::Value> &indices) const { in getSubcomponentIndices()
1483 mlir::Value
1484 placeInMemoryIfNotGlobalInit(mlir::ConversionPatternRewriter &rewriter, in placeInMemoryIfNotGlobalInit()
1485 mlir::Location loc, mlir::Value boxValue) const { in placeInMemoryIfNotGlobalInit()
1487 if (thisBlock && mlir::isa<mlir::LLVM::GlobalOp>(thisBlock->getParentOp())) in placeInMemoryIfNotGlobalInit()
1489 auto boxPtrTy = mlir::LLVM::LLVMPointerType::get(boxValue.getType()); in placeInMemoryIfNotGlobalInit()
1491 rewriter.create<mlir::LLVM::StoreOp>(loc, boxValue, alloca); in placeInMemoryIfNotGlobalInit()
1497 static mlir::Value
1498 computeTripletExtent(mlir::ConversionPatternRewriter &rewriter, in computeTripletExtent()
1499 mlir::Location loc, mlir::Value lb, mlir::Value ub, in computeTripletExtent()
1500 mlir::Value step, mlir::Value zero, mlir::Type type) { in computeTripletExtent()
1501 mlir::Value extent = rewriter.create<mlir::LLVM::SubOp>(loc, type, ub, lb); in computeTripletExtent()
1502 extent = rewriter.create<mlir::LLVM::AddOp>(loc, type, extent, step); in computeTripletExtent()
1503 extent = rewriter.create<mlir::LLVM::SDivOp>(loc, type, extent, step); in computeTripletExtent()
1506 auto cmp = rewriter.create<mlir::LLVM::ICmpOp>( in computeTripletExtent()
1507 loc, mlir::LLVM::ICmpPredicate::sgt, extent, zero); in computeTripletExtent()
1508 return rewriter.create<mlir::LLVM::SelectOp>(loc, cmp, extent, zero); in computeTripletExtent()
1516 mlir::LogicalResult
1518 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
1519 mlir::ValueRange operands = adaptor.getOperands(); in matchAndRewrite()
1527 return mlir::failure(); in matchAndRewrite()
1531 return mlir::success(); in matchAndRewrite()
1539 mlir::LogicalResult
1541 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
1542 mlir::ValueRange operands = adaptor.getOperands(); in matchAndRewrite()
1547 auto i64Ty = mlir::IntegerType::get(xbox.getContext(), 64); in matchAndRewrite()
1548 mlir::Value base = operands[0]; in matchAndRewrite()
1555 mlir::Location loc = xbox.getLoc(); in matchAndRewrite()
1556 mlir::Value zero = genConstantIndex(loc, i64Ty, rewriter, 0); in matchAndRewrite()
1557 mlir::Value one = genConstantIndex(loc, i64Ty, rewriter, 1); in matchAndRewrite()
1558 mlir::Value prevPtrOff = one; in matchAndRewrite()
1559 mlir::Type eleTy = boxTy.getEleTy(); in matchAndRewrite()
1561 llvm::SmallVector<mlir::Value> cstInteriorIndices; in matchAndRewrite()
1563 mlir::Value ptrOffset = zero; in matchAndRewrite()
1564 mlir::Type memEleTy = fir::dyn_cast_ptrEleTy(xbox.memref().getType()); in matchAndRewrite()
1567 mlir::Type seqEleTy = seqTy.getEleTy(); in matchAndRewrite()
1572 mlir::LLVM::ConstantOp charSize = genConstantIndex( in matchAndRewrite()
1574 mlir::Value castedLen = in matchAndRewrite()
1577 rewriter.create<mlir::LLVM::MulOp>(loc, i64Ty, charSize, castedLen); in matchAndRewrite()
1593 mlir::Value prevDimByteStride = integerCast(loc, rewriter, i64Ty, eleSize); in matchAndRewrite()
1597 auto eleTy = mlir::LLVM::LLVMPointerType::get(convertType(seqEleTy)); in matchAndRewrite()
1616 mlir::Value extent = operands[shapeOffset]; in matchAndRewrite()
1617 mlir::Value outerExtent = extent; in matchAndRewrite()
1620 mlir::Value off = operands[sliceOffset]; in matchAndRewrite()
1621 mlir::Value adj = one; in matchAndRewrite()
1624 auto ao = rewriter.create<mlir::LLVM::SubOp>(loc, i64Ty, off, adj); in matchAndRewrite()
1629 rewriter.create<mlir::LLVM::MulOp>(loc, i64Ty, ao, prevPtrOff); in matchAndRewrite()
1631 rewriter.create<mlir::LLVM::AddOp>(loc, i64Ty, dimOff, ptrOffset); in matchAndRewrite()
1633 if (mlir::isa_and_nonnull<fir::UndefOp>( in matchAndRewrite()
1648 mlir::Value lb = zero; in matchAndRewrite()
1661 auto extentIsEmpty = rewriter.create<mlir::LLVM::ICmpOp>( in matchAndRewrite()
1662 loc, mlir::LLVM::ICmpPredicate::eq, extent, zero); in matchAndRewrite()
1663 lb = rewriter.create<mlir::LLVM::SelectOp>(loc, extentIsEmpty, one, in matchAndRewrite()
1671 mlir::Value step = prevDimByteStride; in matchAndRewrite()
1673 step = rewriter.create<mlir::LLVM::MulOp>(loc, i64Ty, step, in matchAndRewrite()
1680 prevDimByteStride = rewriter.create<mlir::LLVM::MulOp>( in matchAndRewrite()
1683 prevPtrOff = rewriter.create<mlir::LLVM::MulOp>(loc, i64Ty, prevPtrOff, in matchAndRewrite()
1697 llvm::SmallVector<mlir::Value> fieldIndices; in matchAndRewrite()
1698 llvm::Optional<mlir::Value> substringOffset; in matchAndRewrite()
1710 mlir::Value result = placeInMemoryIfNotGlobalInit(rewriter, loc, dest); in matchAndRewrite()
1712 return mlir::success(); in matchAndRewrite()
1727 mlir::LogicalResult
1729 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
1730 mlir::Location loc = rebox.getLoc(); in matchAndRewrite()
1731 mlir::Type idxTy = lowerTy().indexType(); in matchAndRewrite()
1732 mlir::Value loweredBox = adaptor.getOperands()[0]; in matchAndRewrite()
1733 mlir::ValueRange operands = adaptor.getOperands(); in matchAndRewrite()
1736 llvm::SmallVector<mlir::Value, 2> lenParams; in matchAndRewrite()
1737 mlir::Type inputEleTy = getInputEleTy(rebox); in matchAndRewrite()
1739 mlir::Value len = in matchAndRewrite()
1742 mlir::Value width = in matchAndRewrite()
1744 len = rewriter.create<mlir::LLVM::SDivOp>(loc, idxTy, len, width); in matchAndRewrite()
1755 llvm::SmallVector<mlir::Value> inputExtents; in matchAndRewrite()
1756 llvm::SmallVector<mlir::Value> inputStrides; in matchAndRewrite()
1759 mlir::Value dim = genConstantIndex(loc, idxTy, rewriter, i); in matchAndRewrite()
1760 llvm::SmallVector<mlir::Value, 3> dimInfo = in matchAndRewrite()
1766 mlir::Type baseTy = getBaseAddrTypeFromBox(loweredBox.getType()); in matchAndRewrite()
1767 mlir::Value baseAddr = in matchAndRewrite()
1780 mlir::LogicalResult
1781 finalizeRebox(fir::cg::XReboxOp rebox, mlir::Value dest, mlir::Value base, in finalizeRebox()
1782 mlir::ValueRange lbounds, mlir::ValueRange extents, in finalizeRebox()
1783 mlir::ValueRange strides, in finalizeRebox()
1784 mlir::ConversionPatternRewriter &rewriter) const { in finalizeRebox()
1785 mlir::Location loc = rebox.getLoc(); in finalizeRebox()
1786 mlir::Value zero = in finalizeRebox()
1788 mlir::Value one = genConstantIndex(loc, lowerTy().indexType(), rewriter, 1); in finalizeRebox()
1790 mlir::Value extent = std::get<0>(iter.value()); in finalizeRebox()
1792 mlir::Value lb = one; in finalizeRebox()
1795 auto extentIsEmpty = rewriter.create<mlir::LLVM::ICmpOp>( in finalizeRebox()
1796 loc, mlir::LLVM::ICmpPredicate::eq, extent, zero); in finalizeRebox()
1797 lb = rewriter.create<mlir::LLVM::SelectOp>(loc, extentIsEmpty, one, lb); in finalizeRebox()
1804 mlir::Value result = in finalizeRebox()
1807 return mlir::success(); in finalizeRebox()
1811 mlir::LogicalResult
1812 sliceBox(fir::cg::XReboxOp rebox, mlir::Value dest, mlir::Value base, in sliceBox()
1813 mlir::ValueRange inputExtents, mlir::ValueRange inputStrides, in sliceBox()
1814 mlir::ValueRange operands, in sliceBox()
1815 mlir::ConversionPatternRewriter &rewriter) const { in sliceBox()
1816 mlir::Location loc = rebox.getLoc(); in sliceBox()
1817 mlir::Type voidPtrTy = ::getVoidPtrType(rebox.getContext()); in sliceBox()
1818 mlir::Type idxTy = lowerTy().indexType(); in sliceBox()
1819 mlir::Value zero = genConstantIndex(loc, idxTy, rewriter, 0); in sliceBox()
1823 mlir::Type inputEleTy = getInputEleTy(rebox); in sliceBox()
1825 mlir::LLVM::LLVMPointerType::get(convertType(inputEleTy)); in sliceBox()
1826 base = rewriter.create<mlir::LLVM::BitcastOp>(loc, llvmElePtrTy, base); in sliceBox()
1828 llvm::SmallVector<mlir::Value> fieldIndices; in sliceBox()
1829 llvm::Optional<mlir::Value> substringOffset; in sliceBox()
1846 base = rewriter.create<mlir::LLVM::BitcastOp>(loc, voidPtrTy, base); in sliceBox()
1850 llvm::SmallVector<mlir::Value> slicedExtents; in sliceBox()
1851 llvm::SmallVector<mlir::Value> slicedStrides; in sliceBox()
1852 mlir::Value one = genConstantIndex(loc, idxTy, rewriter, 1); in sliceBox()
1860 mlir::Value sliceLb = in sliceBox()
1862 mlir::Value inputStride = *strideOps; // already idxTy in sliceBox()
1864 mlir::Value sliceOrigin = in sliceBox()
1868 mlir::Value diff = in sliceBox()
1869 rewriter.create<mlir::LLVM::SubOp>(loc, idxTy, sliceLb, sliceOrigin); in sliceBox()
1870 mlir::Value offset = in sliceBox()
1871 rewriter.create<mlir::LLVM::MulOp>(loc, idxTy, diff, inputStride); in sliceBox()
1875 mlir::Value upper = operands[sliceOps + 1]; in sliceBox()
1877 !mlir::isa_and_nonnull<mlir::LLVM::UndefOp>(upper.getDefiningOp()); in sliceBox()
1879 mlir::Value step = in sliceBox()
1882 mlir::Value sliceUb = integerCast(loc, rewriter, idxTy, upper); in sliceBox()
1883 mlir::Value extent = computeTripletExtent(rewriter, loc, sliceLb, in sliceBox()
1887 mlir::Value stride = in sliceBox()
1888 rewriter.create<mlir::LLVM::MulOp>(loc, idxTy, step, inputStride); in sliceBox()
1898 mlir::LogicalResult
1899 reshapeBox(fir::cg::XReboxOp rebox, mlir::Value dest, mlir::Value base, in reshapeBox()
1900 mlir::ValueRange inputExtents, mlir::ValueRange inputStrides, in reshapeBox()
1901 mlir::ValueRange operands, in reshapeBox()
1902 mlir::ConversionPatternRewriter &rewriter) const { in reshapeBox()
1903 mlir::ValueRange reboxShifts{operands.begin() + rebox.shiftOffset(), in reshapeBox()
1912 mlir::Location loc = rebox.getLoc(); in reshapeBox()
1914 mlir::Type voidPtrTy = ::getVoidPtrType(rebox.getContext()); in reshapeBox()
1915 base = rewriter.create<mlir::LLVM::BitcastOp>(loc, voidPtrTy, base); in reshapeBox()
1917 llvm::SmallVector<mlir::Value> newStrides; in reshapeBox()
1918 llvm::SmallVector<mlir::Value> newExtents; in reshapeBox()
1919 mlir::Type idxTy = lowerTy().indexType(); in reshapeBox()
1924 mlir::Value stride = inputStrides.empty() in reshapeBox()
1928 mlir::Value rawExtent = operands[rebox.shapeOffset() + i]; in reshapeBox()
1929 mlir::Value extent = integerCast(loc, rewriter, idxTy, rawExtent); in reshapeBox()
1933 stride = rewriter.create<mlir::LLVM::MulOp>(loc, idxTy, extent, stride); in reshapeBox()
1940 static mlir::Type getInputEleTy(fir::cg::XReboxOp rebox) { in getInputEleTy()
1953 mlir::LogicalResult
1955 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
1957 return mlir::failure(); in matchAndRewrite()
1965 static void toRowMajor(llvm::SmallVectorImpl<mlir::Attribute> &attrs, in toRowMajor()
1966 mlir::Type ty) { in toRowMajor()
1970 if (auto seq = ty.dyn_cast<mlir::LLVM::LLVMArrayType>()) { in toRowMajor()
1978 } else if (auto st = ty.dyn_cast<mlir::LLVM::LLVMStructType>()) { in toRowMajor()
1979 ty = st.getBody()[attrs[i].cast<mlir::IntegerAttr>().getInt()]; in toRowMajor()
1986 static llvm::SmallVector<mlir::Attribute>
1987 collectIndices(mlir::ConversionPatternRewriter &rewriter, in collectIndices()
1988 mlir::ArrayAttr arrAttr) { in collectIndices()
1989 llvm::SmallVector<mlir::Attribute> attrs; in collectIndices()
1991 if (i->isa<mlir::IntegerAttr>()) { in collectIndices()
1994 auto fieldName = i->cast<mlir::StringAttr>().getValue(); in collectIndices()
1996 auto ty = i->cast<mlir::TypeAttr>().getValue(); in collectIndices()
1998 attrs.push_back(mlir::IntegerAttr::get(rewriter.getI32Type(), index)); in collectIndices()
2005 static mlir::Type getArrayElementType(mlir::LLVM::LLVMArrayType ty) { in getArrayElementType()
2007 while (auto arrTy = eleTy.dyn_cast<mlir::LLVM::LLVMArrayType>()) in getArrayElementType()
2020 mlir::LogicalResult
2021 doRewrite(fir::ExtractValueOp extractVal, mlir::Type ty, OpAdaptor adaptor, in doRewrite()
2022 mlir::ConversionPatternRewriter &rewriter) const override { in doRewrite()
2023 mlir::ValueRange operands = adaptor.getOperands(); in doRewrite()
2026 auto position = mlir::ArrayAttr::get(extractVal.getContext(), attrs); in doRewrite()
2027 rewriter.replaceOpWithNewOp<mlir::LLVM::ExtractValueOp>( in doRewrite()
2029 return mlir::success(); in doRewrite()
2040 mlir::LogicalResult
2041 doRewrite(fir::InsertValueOp insertVal, mlir::Type ty, OpAdaptor adaptor, in doRewrite()
2042 mlir::ConversionPatternRewriter &rewriter) const override { in doRewrite()
2043 mlir::ValueRange operands = adaptor.getOperands(); in doRewrite()
2046 auto position = mlir::ArrayAttr::get(insertVal.getContext(), attrs); in doRewrite()
2047 rewriter.replaceOpWithNewOp<mlir::LLVM::InsertValueOp>( in doRewrite()
2049 return mlir::success(); in doRewrite()
2069 mlir::LogicalResult
2070 doRewrite(fir::InsertOnRangeOp range, mlir::Type ty, OpAdaptor adaptor, in doRewrite()
2071 mlir::ConversionPatternRewriter &rewriter) const override { in doRewrite()
2077 while (auto t = type.dyn_cast<mlir::LLVM::LLVMArrayType>()) { in doRewrite()
2086 mlir::DenseIntElementsAttr coor = range.getCoor(); in doRewrite()
2095 mlir::Value lastOp = adaptor.getOperands()[0]; in doRewrite()
2096 mlir::Value insertVal = adaptor.getOperands()[1]; in doRewrite()
2101 llvm::SmallVector<mlir::Attribute> subscriptAttrs; in doRewrite()
2103 subscriptAttrs.push_back(mlir::IntegerAttr::get(i64Ty, subscript)); in doRewrite()
2104 lastOp = rewriter.create<mlir::LLVM::InsertValueOp>( in doRewrite()
2106 mlir::ArrayAttr::get(range.getContext(), subscriptAttrs)); in doRewrite()
2112 llvm::SmallVector<mlir::Attribute> subscriptAttrs; in doRewrite()
2115 mlir::IntegerAttr::get(rewriter.getI64Type(), subscript)); in doRewrite()
2116 mlir::ArrayRef<mlir::Attribute> arrayRef(subscriptAttrs); in doRewrite()
2118 rewriter.replaceOpWithNewOp<mlir::LLVM::InsertValueOp>( in doRewrite()
2120 mlir::ArrayAttr::get(range.getContext(), arrayRef)); in doRewrite()
2122 return mlir::success(); in doRewrite()
2136 mlir::LogicalResult
2137 doRewrite(fir::cg::XArrayCoorOp coor, mlir::Type ty, OpAdaptor adaptor, in doRewrite()
2138 mlir::ConversionPatternRewriter &rewriter) const override { in doRewrite()
2140 mlir::ValueRange operands = adaptor.getOperands(); in doRewrite()
2146 mlir::Type idxTy = lowerTy().indexType(); in doRewrite()
2152 mlir::Value one = genConstantIndex(loc, idxTy, rewriter, 1); in doRewrite()
2153 mlir::Value prevExt = one; in doRewrite()
2154 mlir::Value zero = genConstantIndex(loc, idxTy, rewriter, 0); in doRewrite()
2155 mlir::Value offset = zero; in doRewrite()
2163 mlir::Value index = in doRewrite()
2165 mlir::Value lb = in doRewrite()
2168 mlir::Value step = one; in doRewrite()
2173 mlir::Value originalUb = *(sliceOps + 1); in doRewrite()
2175 !mlir::isa_and_nonnull<fir::UndefOp>(originalUb.getDefiningOp()); in doRewrite()
2179 auto idx = rewriter.create<mlir::LLVM::SubOp>(loc, idxTy, index, lb); in doRewrite()
2180 mlir::Value diff = in doRewrite()
2181 rewriter.create<mlir::LLVM::MulOp>(loc, idxTy, idx, step); in doRewrite()
2183 mlir::Value sliceLb = in doRewrite()
2185 auto adj = rewriter.create<mlir::LLVM::SubOp>(loc, idxTy, sliceLb, lb); in doRewrite()
2186 diff = rewriter.create<mlir::LLVM::AddOp>(loc, idxTy, diff, adj); in doRewrite()
2192 mlir::Value stride = loadStrideFromBox(loc, operands[0], i, rewriter); in doRewrite()
2193 auto sc = rewriter.create<mlir::LLVM::MulOp>(loc, idxTy, diff, stride); in doRewrite()
2194 offset = rewriter.create<mlir::LLVM::AddOp>(loc, idxTy, sc, offset); in doRewrite()
2197 auto sc = rewriter.create<mlir::LLVM::MulOp>(loc, idxTy, diff, prevExt); in doRewrite()
2198 offset = rewriter.create<mlir::LLVM::AddOp>(loc, idxTy, sc, offset); in doRewrite()
2203 rewriter.create<mlir::LLVM::MulOp>(loc, idxTy, prevExt, nextExt); in doRewrite()
2211 mlir::Type baseTy = getBaseAddrTypeFromBox(operands[0].getType()); in doRewrite()
2212 mlir::Value base = in doRewrite()
2214 mlir::Type voidPtrTy = getVoidPtrType(); in doRewrite()
2215 base = rewriter.create<mlir::LLVM::BitcastOp>(loc, voidPtrTy, base); in doRewrite()
2216 llvm::SmallVector<mlir::Value> args{offset}; in doRewrite()
2218 rewriter.create<mlir::LLVM::GEPOp>(loc, voidPtrTy, base, args); in doRewrite()
2220 rewriter.replaceOpWithNewOp<mlir::LLVM::BitcastOp>(coor, ty, addr); in doRewrite()
2221 return mlir::success(); in doRewrite()
2223 auto casted = rewriter.create<mlir::LLVM::BitcastOp>(loc, baseTy, addr); in doRewrite()
2235 rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(coor, ty, casted, args); in doRewrite()
2236 return mlir::success(); in doRewrite()
2242 mlir::Value base; in doRewrite()
2254 rewriter.create<mlir::LLVM::MulOp>(loc, idxTy, offset, length); in doRewrite()
2260 base = rewriter.create<mlir::LLVM::BitcastOp>(loc, ty, operands[0]); in doRewrite()
2264 mlir::Type ty0 = operands[0].getType(); in doRewrite()
2265 auto ptrTy = ty0.dyn_cast<mlir::LLVM::LLVMPointerType>(); in doRewrite()
2267 mlir::Type eleTy = ptrTy.getElementType(); in doRewrite()
2268 while (auto arrTy = eleTy.dyn_cast<mlir::LLVM::LLVMArrayType>()) in doRewrite()
2270 auto newTy = mlir::LLVM::LLVMPointerType::get(eleTy); in doRewrite()
2271 base = rewriter.create<mlir::LLVM::BitcastOp>(loc, newTy, operands[0]); in doRewrite()
2273 llvm::SmallVector<mlir::Value> args = {offset}; in doRewrite()
2276 rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(coor, ty, base, args); in doRewrite()
2277 return mlir::success(); in doRewrite()
2291 mlir::LogicalResult
2292 doRewrite(fir::CoordinateOp coor, mlir::Type ty, OpAdaptor adaptor, in doRewrite()
2293 mlir::ConversionPatternRewriter &rewriter) const override { in doRewrite()
2294 mlir::ValueRange operands = adaptor.getOperands(); in doRewrite()
2296 mlir::Location loc = coor.getLoc(); in doRewrite()
2297 mlir::Value base = operands[0]; in doRewrite()
2298 mlir::Type baseObjectTy = coor.getBaseType(); in doRewrite()
2299 mlir::Type objectTy = fir::dyn_cast_ptrOrBoxEleTy(baseObjectTy); in doRewrite()
2304 mlir::LLVM::ConstantOp c0 = in doRewrite()
2306 llvm::SmallVector<mlir::Value> offs = {c0, operands[1]}; in doRewrite()
2307 mlir::Value gep = genGEP(loc, ty, rewriter, base, offs); in doRewrite()
2309 return mlir::success(); in doRewrite()
2324 static unsigned getFieldNumber(fir::RecordType ty, mlir::Value op) { in getFieldNumber()
2327 ->getAttrOfType<mlir::IntegerAttr>("field") in getFieldNumber()
2332 static bool hasSubDimensions(mlir::Type type) { in hasSubDimensions()
2333 return type.isa<fir::SequenceType, fir::RecordType, mlir::TupleType>(); in hasSubDimensions()
2341 static bool supportedCoordinate(mlir::Type type, mlir::ValueRange coors) { in supportedCoordinate()
2347 mlir::Value nxtOpnd = coors[i]; in supportedCoordinate()
2355 } else if (auto tupTy = type.dyn_cast<mlir::TupleType>()) { in supportedCoordinate()
2370 static bool arraysHaveKnownShape(mlir::Type type, mlir::ValueRange coors) { in arraysHaveKnownShape()
2372 mlir::Value nxtOpnd = coors[i]; in arraysHaveKnownShape()
2380 } else if (auto strTy = type.dyn_cast<mlir::TupleType>()) { in arraysHaveKnownShape()
2390 mlir::LogicalResult
2391 doRewriteBox(fir::CoordinateOp coor, mlir::Type ty, mlir::ValueRange operands, in doRewriteBox()
2392 mlir::Location loc, in doRewriteBox()
2393 mlir::ConversionPatternRewriter &rewriter) const { in doRewriteBox()
2394 mlir::Type boxObjTy = coor.getBaseType(); in doRewriteBox()
2397 mlir::Value boxBaseAddr = operands[0]; in doRewriteBox()
2404 mlir::Operation *coordinateDef = in doRewriteBox()
2406 if (mlir::isa_and_nonnull<fir::LenParamIndexOp>(coordinateDef)) in doRewriteBox()
2426 mlir::LLVM::ConstantOp c0 = in doRewriteBox()
2428 mlir::Value resultAddr = in doRewriteBox()
2433 mlir::Type voidPtrTy = ::getVoidPtrType(coor.getContext()); in doRewriteBox()
2444 mlir::Value off = genConstantIndex(loc, idxTy, rewriter, 0); in doRewriteBox()
2447 mlir::Value stride = in doRewriteBox()
2449 auto sc = rewriter.create<mlir::LLVM::MulOp>(loc, idxTy, in doRewriteBox()
2451 off = rewriter.create<mlir::LLVM::AddOp>(loc, idxTy, sc, off); in doRewriteBox()
2454 rewriter.create<mlir::LLVM::BitcastOp>(loc, voidPtrTy, resultAddr); in doRewriteBox()
2455 llvm::SmallVector<mlir::Value> args = {off}; in doRewriteBox()
2456 resultAddr = rewriter.create<mlir::LLVM::GEPOp>(loc, voidPtrTy, in doRewriteBox()
2462 mlir::LLVM::LLVMPointerType::get(lowerTy().convertType(recTy)); in doRewriteBox()
2463 mlir::Value nxtOpnd = operands[i]; in doRewriteBox()
2465 rewriter.create<mlir::LLVM::BitcastOp>(loc, recRefTy, resultAddr); in doRewriteBox()
2466 llvm::SmallVector<mlir::Value> args = {c0, nxtOpnd}; in doRewriteBox()
2469 auto gep = rewriter.create<mlir::LLVM::GEPOp>( in doRewriteBox()
2470 loc, mlir::LLVM::LLVMPointerType::get(llvmCurrentObjTy), memObj, in doRewriteBox()
2473 rewriter.create<mlir::LLVM::BitcastOp>(loc, voidPtrTy, gep); in doRewriteBox()
2479 rewriter.replaceOpWithNewOp<mlir::LLVM::BitcastOp>(coor, ty, resultAddr); in doRewriteBox()
2480 return mlir::success(); in doRewriteBox()
2483 mlir::LogicalResult
2484 doRewriteRefOrPtr(fir::CoordinateOp coor, mlir::Type ty, in doRewriteRefOrPtr()
2485 mlir::ValueRange operands, mlir::Location loc, in doRewriteRefOrPtr()
2486 mlir::ConversionPatternRewriter &rewriter) const { in doRewriteRefOrPtr()
2487 mlir::Type baseObjectTy = coor.getBaseType(); in doRewriteRefOrPtr()
2490 mlir::Type cpnTy = fir::dyn_cast_ptrOrBoxEleTy(baseObjectTy); in doRewriteRefOrPtr()
2522 return mlir::emitError( in doRewriteRefOrPtr()
2526 llvm::SmallVector<mlir::Value> offs; in doRewriteRefOrPtr()
2528 mlir::LLVM::ConstantOp c0 = in doRewriteRefOrPtr()
2533 llvm::SmallVector<mlir::Value> arrIdx; in doRewriteRefOrPtr()
2535 mlir::Value nxtOpnd = operands[i]; in doRewriteRefOrPtr()
2538 return mlir::emitError(loc, "invalid coordinate/check failed"); in doRewriteRefOrPtr()
2570 else if (auto tupTy = cpnTy.dyn_cast<mlir::TupleType>()) in doRewriteRefOrPtr()
2579 mlir::Value base = operands[0]; in doRewriteRefOrPtr()
2580 mlir::Value retval = genGEP(loc, ty, rewriter, base, offs); in doRewriteRefOrPtr()
2582 return mlir::success(); in doRewriteRefOrPtr()
2585 return mlir::emitError( in doRewriteRefOrPtr()
2596 mlir::LogicalResult
2598 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
2605 rewriter.replaceOp(field, mlir::ValueRange{genConstantOffset( in matchAndRewrite()
2607 return mlir::success(); in matchAndRewrite()
2613 mlir::FlatSymbolRefAttr symAttr = mlir::SymbolRefAttr::get( in matchAndRewrite()
2615 mlir::NamedAttribute callAttr = rewriter.getNamedAttr("callee", symAttr); in matchAndRewrite()
2616 mlir::NamedAttribute fieldAttr = rewriter.getNamedAttr( in matchAndRewrite()
2617 "field", mlir::IntegerAttr::get(lowerTy().indexType(), index)); in matchAndRewrite()
2618 rewriter.replaceOpWithNewOp<mlir::LLVM::CallOp>( in matchAndRewrite()
2620 llvm::ArrayRef<mlir::NamedAttribute>{callAttr, fieldAttr}); in matchAndRewrite()
2621 return mlir::success(); in matchAndRewrite()
2636 mlir::LogicalResult
2638 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
2640 return mlir::failure(); in matchAndRewrite()
2648 mlir::LogicalResult
2650 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
2652 return mlir::failure(); in matchAndRewrite()
2660 mlir::LogicalResult
2662 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
2663 rewriter.replaceOpWithNewOp<mlir::LLVM::ReturnOp>(op, in matchAndRewrite()
2665 return mlir::success(); in matchAndRewrite()
2675 mlir::LogicalResult
2677 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
2680 tyAttr = tyAttr.cast<mlir::LLVM::LLVMPointerType>().getElementType(); in matchAndRewrite()
2682 mlir::Attribute initAttr = global.getInitVal().value_or(mlir::Attribute()); in matchAndRewrite()
2685 auto g = rewriter.create<mlir::LLVM::GlobalOp>( in matchAndRewrite()
2697 auto constant = mlir::dyn_cast<mlir::arith::ConstantOp>(op); in matchAndRewrite()
2699 auto convertOp = mlir::dyn_cast<fir::ConvertOp>(op); in matchAndRewrite()
2702 constant = mlir::cast<mlir::arith::ConstantOp>( in matchAndRewrite()
2705 mlir::Type vecType = mlir::VectorType::get( in matchAndRewrite()
2707 auto denseAttr = mlir::DenseElementsAttr::get( in matchAndRewrite()
2708 vecType.cast<mlir::ShapedType>(), constant.getValue()); in matchAndRewrite()
2710 rewriter.replaceOpWithNewOp<mlir::arith::ConstantOp>( in matchAndRewrite()
2716 return mlir::success(); in matchAndRewrite()
2719 bool isFullRange(mlir::DenseIntElementsAttr indexes, in isFullRange()
2736 mlir::LLVM::Linkage
2741 return mlir::LLVM::Linkage::Internal; in convertLinkage()
2743 return mlir::LLVM::Linkage::Linkonce; in convertLinkage()
2745 return mlir::LLVM::Linkage::LinkonceODR; in convertLinkage()
2747 return mlir::LLVM::Linkage::Common; in convertLinkage()
2749 return mlir::LLVM::Linkage::Weak; in convertLinkage()
2751 return mlir::LLVM::Linkage::External; in convertLinkage()
2759 mlir::LogicalResult
2761 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
2769 rewriter.replaceOpWithNewOp<mlir::LLVM::LoadOp>( in matchAndRewrite()
2773 return mlir::success(); in matchAndRewrite()
2783 mlir::LogicalResult
2785 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
2787 return mlir::success(); in matchAndRewrite()
2791 static void genCondBrOp(mlir::Location loc, mlir::Value cmp, mlir::Block *dest, in genCondBrOp()
2792 llvm::Optional<mlir::ValueRange> destOps, in genCondBrOp()
2793 mlir::ConversionPatternRewriter &rewriter, in genCondBrOp()
2794 mlir::Block *newBlock) { in genCondBrOp()
2796 rewriter.create<mlir::LLVM::CondBrOp>(loc, cmp, dest, *destOps, newBlock, in genCondBrOp()
2797 mlir::ValueRange()); in genCondBrOp()
2799 rewriter.create<mlir::LLVM::CondBrOp>(loc, cmp, dest, newBlock); in genCondBrOp()
2803 static void genBrOp(A caseOp, mlir::Block *dest, llvm::Optional<B> destOps, in genBrOp()
2804 mlir::ConversionPatternRewriter &rewriter) { in genBrOp()
2806 rewriter.replaceOpWithNewOp<mlir::LLVM::BrOp>(caseOp, *destOps, dest); in genBrOp()
2808 rewriter.replaceOpWithNewOp<mlir::LLVM::BrOp>(caseOp, llvm::None, dest); in genBrOp()
2811 static void genCaseLadderStep(mlir::Location loc, mlir::Value cmp, in genCaseLadderStep()
2812 mlir::Block *dest, in genCaseLadderStep()
2813 llvm::Optional<mlir::ValueRange> destOps, in genCaseLadderStep()
2814 mlir::ConversionPatternRewriter &rewriter) { in genCaseLadderStep()
2844 mlir::LogicalResult
2846 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
2848 llvm::ArrayRef<mlir::Attribute> cases = caseOp.getCases().getValue(); in matchAndRewrite()
2853 return mlir::failure(); in matchAndRewrite()
2855 mlir::Value selector = caseOp.getSelector(adaptor.getOperands()); in matchAndRewrite()
2858 mlir::Block *dest = caseOp.getSuccessor(t); in matchAndRewrite()
2859 llvm::Optional<mlir::ValueRange> destOps = in matchAndRewrite()
2861 llvm::Optional<mlir::ValueRange> cmpOps = in matchAndRewrite()
2863 mlir::Value caseArg = *(cmpOps.value().begin()); in matchAndRewrite()
2864 mlir::Attribute attr = cases[t]; in matchAndRewrite()
2866 auto cmp = rewriter.create<mlir::LLVM::ICmpOp>( in matchAndRewrite()
2867 loc, mlir::LLVM::ICmpPredicate::eq, selector, caseArg); in matchAndRewrite()
2872 auto cmp = rewriter.create<mlir::LLVM::ICmpOp>( in matchAndRewrite()
2873 loc, mlir::LLVM::ICmpPredicate::sle, caseArg, selector); in matchAndRewrite()
2878 auto cmp = rewriter.create<mlir::LLVM::ICmpOp>( in matchAndRewrite()
2879 loc, mlir::LLVM::ICmpPredicate::sle, selector, caseArg); in matchAndRewrite()
2884 auto cmp = rewriter.create<mlir::LLVM::ICmpOp>( in matchAndRewrite()
2885 loc, mlir::LLVM::ICmpPredicate::sle, caseArg, selector); in matchAndRewrite()
2890 rewriter.create<mlir::LLVM::CondBrOp>(loc, cmp, newBlock1, newBlock2); in matchAndRewrite()
2892 mlir::Value caseArg0 = *(cmpOps.value().begin() + 1); in matchAndRewrite()
2893 auto cmp0 = rewriter.create<mlir::LLVM::ICmpOp>( in matchAndRewrite()
2894 loc, mlir::LLVM::ICmpPredicate::sle, selector, caseArg0); in matchAndRewrite()
2899 assert(attr.isa<mlir::UnitAttr>()); in matchAndRewrite()
2903 return mlir::success(); in matchAndRewrite()
2910 mlir::ConversionPatternRewriter &rewriter) { in selectMatchAndRewrite()
2913 mlir::Value selector = adaptor.getSelector(); in selectMatchAndRewrite()
2917 llvm::SmallVector<mlir::Block *> destinations; in selectMatchAndRewrite()
2918 llvm::SmallVector<mlir::ValueRange> destinationsOperands; in selectMatchAndRewrite()
2919 mlir::Block *defaultDestination; in selectMatchAndRewrite()
2920 mlir::ValueRange defaultOperands; in selectMatchAndRewrite()
2924 mlir::Block *dest = select.getSuccessor(t); in selectMatchAndRewrite()
2926 const mlir::Attribute &attr = cases[t]; in selectMatchAndRewrite()
2927 if (auto intAttr = attr.template dyn_cast<mlir::IntegerAttr>()) { in selectMatchAndRewrite()
2929 destinationsOperands.push_back(destOps ? *destOps : mlir::ValueRange{}); in selectMatchAndRewrite()
2933 assert(attr.template dyn_cast_or_null<mlir::UnitAttr>()); in selectMatchAndRewrite()
2936 defaultOperands = destOps ? *destOps : mlir::ValueRange{}; in selectMatchAndRewrite()
2941 selector = rewriter.create<mlir::LLVM::TruncOp>(loc, rewriter.getI32Type(), in selectMatchAndRewrite()
2944 rewriter.replaceOpWithNewOp<mlir::LLVM::SwitchOp>( in selectMatchAndRewrite()
2958 mlir::LogicalResult
2960 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
2962 return mlir::success(); in matchAndRewrite()
2970 mlir::LogicalResult
2972 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
2974 return mlir::success(); in matchAndRewrite()
2982 mlir::LogicalResult
2984 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
2985 mlir::emitError(select.getLoc(), in matchAndRewrite()
2987 return mlir::failure(); in matchAndRewrite()
2995 mlir::LogicalResult
2997 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3000 mlir::Location loc = store.getLoc(); in matchAndRewrite()
3001 mlir::Type boxPtrTy = adaptor.getOperands()[0].getType(); in matchAndRewrite()
3002 auto val = rewriter.create<mlir::LLVM::LoadOp>( in matchAndRewrite()
3003 loc, boxPtrTy.cast<mlir::LLVM::LLVMPointerType>().getElementType(), in matchAndRewrite()
3005 rewriter.replaceOpWithNewOp<mlir::LLVM::StoreOp>( in matchAndRewrite()
3008 rewriter.replaceOpWithNewOp<mlir::LLVM::StoreOp>( in matchAndRewrite()
3011 return mlir::success(); in matchAndRewrite()
3022 mlir::LogicalResult
3024 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3027 mlir::Type lenTy = convertType(unboxchar.getType(1)); in matchAndRewrite()
3028 mlir::Value tuple = adaptor.getOperands()[0]; in matchAndRewrite()
3029 mlir::Type tupleTy = tuple.getType(); in matchAndRewrite()
3031 mlir::Location loc = unboxchar.getLoc(); in matchAndRewrite()
3032 mlir::Value ptrToBuffer = in matchAndRewrite()
3035 mlir::LLVM::ExtractValueOp len = in matchAndRewrite()
3037 mlir::Value lenAfterCast = integerCast(loc, rewriter, lenTy, len); in matchAndRewrite()
3040 llvm::ArrayRef<mlir::Value>{ptrToBuffer, lenAfterCast}); in matchAndRewrite()
3041 return mlir::success(); in matchAndRewrite()
3051 mlir::LogicalResult
3053 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3055 return mlir::failure(); in matchAndRewrite()
3063 mlir::LogicalResult
3065 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3066 rewriter.replaceOpWithNewOp<mlir::LLVM::UndefOp>( in matchAndRewrite()
3068 return mlir::success(); in matchAndRewrite()
3075 mlir::LogicalResult
3077 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3078 mlir::Type ty = convertType(zero.getType()); in matchAndRewrite()
3079 if (ty.isa<mlir::LLVM::LLVMPointerType>()) { in matchAndRewrite()
3080 rewriter.replaceOpWithNewOp<mlir::LLVM::NullOp>(zero, ty); in matchAndRewrite()
3081 } else if (ty.isa<mlir::IntegerType>()) { in matchAndRewrite()
3082 rewriter.replaceOpWithNewOp<mlir::LLVM::ConstantOp>( in matchAndRewrite()
3083 zero, ty, mlir::IntegerAttr::get(zero.getType(), 0)); in matchAndRewrite()
3084 } else if (mlir::LLVM::isCompatibleFloatingPointType(ty)) { in matchAndRewrite()
3085 rewriter.replaceOpWithNewOp<mlir::LLVM::ConstantOp>( in matchAndRewrite()
3086 zero, ty, mlir::FloatAttr::get(zero.getType(), 0.0)); in matchAndRewrite()
3093 return mlir::success(); in matchAndRewrite()
3101 mlir::LogicalResult
3103 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3104 rewriter.replaceOpWithNewOp<mlir::LLVM::UnreachableOp>(unreach); in matchAndRewrite()
3105 return mlir::success(); in matchAndRewrite()
3118 mlir::LogicalResult
3120 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3121 mlir::Type idxTy = lowerTy().indexType(); in matchAndRewrite()
3122 mlir::Location loc = isPresent.getLoc(); in matchAndRewrite()
3126 auto structTy = ptr.getType().cast<mlir::LLVM::LLVMStructType>(); in matchAndRewrite()
3129 mlir::Type ty = structTy.getBody()[0]; in matchAndRewrite()
3130 mlir::MLIRContext *ctx = isPresent.getContext(); in matchAndRewrite()
3131 auto c0 = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(0)); in matchAndRewrite()
3132 ptr = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, ty, ptr, c0); in matchAndRewrite()
3134 mlir::LLVM::ConstantOp c0 = in matchAndRewrite()
3136 auto addr = rewriter.create<mlir::LLVM::PtrToIntOp>(loc, idxTy, ptr); in matchAndRewrite()
3137 rewriter.replaceOpWithNewOp<mlir::LLVM::ICmpOp>( in matchAndRewrite()
3138 isPresent, mlir::LLVM::ICmpPredicate::ne, addr, c0); in matchAndRewrite()
3140 return mlir::success(); in matchAndRewrite()
3149 mlir::LogicalResult
3151 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3152 mlir::Type ty = convertType(absent.getType()); in matchAndRewrite()
3153 mlir::Location loc = absent.getLoc(); in matchAndRewrite()
3156 auto structTy = ty.cast<mlir::LLVM::LLVMStructType>(); in matchAndRewrite()
3158 auto undefStruct = rewriter.create<mlir::LLVM::UndefOp>(loc, ty); in matchAndRewrite()
3160 rewriter.create<mlir::LLVM::NullOp>(loc, structTy.getBody()[0]); in matchAndRewrite()
3161 mlir::MLIRContext *ctx = absent.getContext(); in matchAndRewrite()
3162 auto c0 = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(0)); in matchAndRewrite()
3163 rewriter.replaceOpWithNewOp<mlir::LLVM::InsertValueOp>( in matchAndRewrite()
3166 rewriter.replaceOpWithNewOp<mlir::LLVM::NullOp>(absent, ty); in matchAndRewrite()
3168 return mlir::success(); in matchAndRewrite()
3178 static mlir::LLVM::InsertValueOp
3179 complexSum(OPTY sumop, mlir::ValueRange opnds, in complexSum()
3180 mlir::ConversionPatternRewriter &rewriter, in complexSum()
3182 mlir::Value a = opnds[0]; in complexSum()
3183 mlir::Value b = opnds[1]; in complexSum()
3186 auto c0 = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(0)); in complexSum()
3187 auto c1 = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(1)); in complexSum()
3188 mlir::Type eleTy = lowering.convertType(getComplexEleTy(sumop.getType())); in complexSum()
3189 mlir::Type ty = lowering.convertType(sumop.getType()); in complexSum()
3190 auto x0 = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, a, c0); in complexSum()
3191 auto y0 = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, a, c1); in complexSum()
3192 auto x1 = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, b, c0); in complexSum()
3193 auto y1 = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, b, c1); in complexSum()
3196 auto r0 = rewriter.create<mlir::LLVM::UndefOp>(loc, ty); in complexSum()
3197 auto r1 = rewriter.create<mlir::LLVM::InsertValueOp>(loc, ty, r0, rx, c0); in complexSum()
3198 return rewriter.create<mlir::LLVM::InsertValueOp>(loc, ty, r1, ry, c1); in complexSum()
3206 mlir::LogicalResult
3208 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3211 auto r = complexSum<mlir::LLVM::FAddOp>(addc, adaptor.getOperands(), in matchAndRewrite()
3214 return mlir::success(); in matchAndRewrite()
3221 mlir::LogicalResult
3223 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3226 auto r = complexSum<mlir::LLVM::FSubOp>(subc, adaptor.getOperands(), in matchAndRewrite()
3229 return mlir::success(); in matchAndRewrite()
3237 mlir::LogicalResult
3239 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3243 mlir::Value a = adaptor.getOperands()[0]; in matchAndRewrite()
3244 mlir::Value b = adaptor.getOperands()[1]; in matchAndRewrite()
3247 auto c0 = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(0)); in matchAndRewrite()
3248 auto c1 = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(1)); in matchAndRewrite()
3249 mlir::Type eleTy = convertType(getComplexEleTy(mulc.getType())); in matchAndRewrite()
3250 mlir::Type ty = convertType(mulc.getType()); in matchAndRewrite()
3251 auto x0 = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, a, c0); in matchAndRewrite()
3252 auto y0 = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, a, c1); in matchAndRewrite()
3253 auto x1 = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, b, c0); in matchAndRewrite()
3254 auto y1 = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, b, c1); in matchAndRewrite()
3255 auto xx = rewriter.create<mlir::LLVM::FMulOp>(loc, eleTy, x0, x1); in matchAndRewrite()
3256 auto yx = rewriter.create<mlir::LLVM::FMulOp>(loc, eleTy, y0, x1); in matchAndRewrite()
3257 auto xy = rewriter.create<mlir::LLVM::FMulOp>(loc, eleTy, x0, y1); in matchAndRewrite()
3258 auto ri = rewriter.create<mlir::LLVM::FAddOp>(loc, eleTy, xy, yx); in matchAndRewrite()
3259 auto yy = rewriter.create<mlir::LLVM::FMulOp>(loc, eleTy, y0, y1); in matchAndRewrite()
3260 auto rr = rewriter.create<mlir::LLVM::FSubOp>(loc, eleTy, xx, yy); in matchAndRewrite()
3261 auto ra = rewriter.create<mlir::LLVM::UndefOp>(loc, ty); in matchAndRewrite()
3262 auto r1 = rewriter.create<mlir::LLVM::InsertValueOp>(loc, ty, ra, rr, c0); in matchAndRewrite()
3263 auto r0 = rewriter.create<mlir::LLVM::InsertValueOp>(loc, ty, r1, ri, c1); in matchAndRewrite()
3265 return mlir::success(); in matchAndRewrite()
3273 mlir::LogicalResult
3275 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3280 mlir::Value a = adaptor.getOperands()[0]; in matchAndRewrite()
3281 mlir::Value b = adaptor.getOperands()[1]; in matchAndRewrite()
3284 auto c0 = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(0)); in matchAndRewrite()
3285 auto c1 = mlir::ArrayAttr::get(ctx, rewriter.getI32IntegerAttr(1)); in matchAndRewrite()
3286 mlir::Type eleTy = convertType(getComplexEleTy(divc.getType())); in matchAndRewrite()
3287 mlir::Type ty = convertType(divc.getType()); in matchAndRewrite()
3288 auto x0 = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, a, c0); in matchAndRewrite()
3289 auto y0 = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, a, c1); in matchAndRewrite()
3290 auto x1 = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, b, c0); in matchAndRewrite()
3291 auto y1 = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, b, c1); in matchAndRewrite()
3292 auto xx = rewriter.create<mlir::LLVM::FMulOp>(loc, eleTy, x0, x1); in matchAndRewrite()
3293 auto x1x1 = rewriter.create<mlir::LLVM::FMulOp>(loc, eleTy, x1, x1); in matchAndRewrite()
3294 auto yx = rewriter.create<mlir::LLVM::FMulOp>(loc, eleTy, y0, x1); in matchAndRewrite()
3295 auto xy = rewriter.create<mlir::LLVM::FMulOp>(loc, eleTy, x0, y1); in matchAndRewrite()
3296 auto yy = rewriter.create<mlir::LLVM::FMulOp>(loc, eleTy, y0, y1); in matchAndRewrite()
3297 auto y1y1 = rewriter.create<mlir::LLVM::FMulOp>(loc, eleTy, y1, y1); in matchAndRewrite()
3298 auto d = rewriter.create<mlir::LLVM::FAddOp>(loc, eleTy, x1x1, y1y1); in matchAndRewrite()
3299 auto rrn = rewriter.create<mlir::LLVM::FAddOp>(loc, eleTy, xx, yy); in matchAndRewrite()
3300 auto rin = rewriter.create<mlir::LLVM::FSubOp>(loc, eleTy, yx, xy); in matchAndRewrite()
3301 auto rr = rewriter.create<mlir::LLVM::FDivOp>(loc, eleTy, rrn, d); in matchAndRewrite()
3302 auto ri = rewriter.create<mlir::LLVM::FDivOp>(loc, eleTy, rin, d); in matchAndRewrite()
3303 auto ra = rewriter.create<mlir::LLVM::UndefOp>(loc, ty); in matchAndRewrite()
3304 auto r1 = rewriter.create<mlir::LLVM::InsertValueOp>(loc, ty, ra, rr, c0); in matchAndRewrite()
3305 auto r0 = rewriter.create<mlir::LLVM::InsertValueOp>(loc, ty, r1, ri, c1); in matchAndRewrite()
3307 return mlir::success(); in matchAndRewrite()
3315 mlir::LogicalResult
3317 mlir::ConversionPatternRewriter &rewriter) const override { in matchAndRewrite()
3324 mlir::Value o0 = adaptor.getOperands()[0]; in matchAndRewrite()
3325 auto c0 = mlir::ArrayAttr::get(ctxt, rewriter.getI32IntegerAttr(0)); in matchAndRewrite()
3326 auto c1 = mlir::ArrayAttr::get(ctxt, rewriter.getI32IntegerAttr(1)); in matchAndRewrite()
3327 auto rp = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, o0, c0); in matchAndRewrite()
3328 auto ip = rewriter.create<mlir::LLVM::ExtractValueOp>(loc, eleTy, o0, c1); in matchAndRewrite()
3329 auto nrp = rewriter.create<mlir::LLVM::FNegOp>(loc, eleTy, rp); in matchAndRewrite()
3330 auto nip = rewriter.create<mlir::LLVM::FNegOp>(loc, eleTy, ip); in matchAndRewrite()
3331 auto r = rewriter.create<mlir::LLVM::InsertValueOp>(loc, ty, o0, nrp, c0); in matchAndRewrite()
3332 rewriter.replaceOpWithNewOp<mlir::LLVM::InsertValueOp>(neg, ty, r, nip, c1); in matchAndRewrite()
3333 return mlir::success(); in matchAndRewrite()
3348 mlir::LogicalResult
3350 mlir::ConversionPatternRewriter &rewriter) const final { in matchAndRewrite()
3354 return mlir::success(); in matchAndRewrite()
3385 mlir::ModuleOp getModule() { return getOperation(); } in getModule()
3394 mlir::RewritePatternSet pattern(context); in runOnOperation()
3418 mlir::populateFuncToLLVMConversionPatterns(typeConverter, pattern); in runOnOperation()
3419 mlir::populateOpenMPToLLVMConversionPatterns(typeConverter, pattern); in runOnOperation()
3420 mlir::arith::populateArithmeticToLLVMConversionPatterns(typeConverter, in runOnOperation()
3422 mlir::cf::populateControlFlowToLLVMConversionPatterns(typeConverter, in runOnOperation()
3426 mlir::populateMathToLLVMConversionPatterns(typeConverter, pattern); in runOnOperation()
3427 mlir::populateMathToLibmConversionPatterns(pattern, /*benefit=*/0); in runOnOperation()
3428 mlir::ConversionTarget target{*context}; in runOnOperation()
3429 target.addLegalDialect<mlir::LLVM::LLVMDialect>(); in runOnOperation()
3434 mlir::configureOpenMPToLLVMConversionLegality(target, typeConverter); in runOnOperation()
3435 target.addLegalDialect<mlir::omp::OpenMPDialect>(); in runOnOperation()
3438 target.addLegalOp<mlir::ModuleOp>(); in runOnOperation()
3441 if (mlir::failed(mlir::applyFullConversion(getModule(), target, in runOnOperation()
3453 : public mlir::PassWrapper<LLVMIRLoweringPass,
3454 mlir::OperationPass<mlir::ModuleOp>> {
3460 mlir::ModuleOp getModule() { return getOperation(); } in getModule()
3466 if (auto llvmModule = mlir::translateModuleToLLVMIR( in runOnOperation()
3472 mlir::emitError(mlir::UnknownLoc::get(ctx), "could not emit LLVM-IR\n"); in runOnOperation()
3483 std::unique_ptr<mlir::Pass> fir::createFIRToLLVMPass() { in createFIRToLLVMPass()
3487 std::unique_ptr<mlir::Pass>
3492 std::unique_ptr<mlir::Pass>