@@ -650,6 +650,23 @@ struct BoxTypeDescOpConversion : public FIROpConversion<fir::BoxTypeDescOp> {
650650 }
651651};
652652
653+ // / Lower `fir.box_typecode` to a sequence of operations to extract the type
654+ // / code in the boxed value.
655+ struct BoxTypeCodeOpConversion : public FIROpConversion <fir::BoxTypeCodeOp> {
656+ using FIROpConversion::FIROpConversion;
657+
658+ mlir::LogicalResult
659+ matchAndRewrite (fir::BoxTypeCodeOp op, OpAdaptor adaptor,
660+ mlir::ConversionPatternRewriter &rewriter) const override {
661+ mlir::Value box = adaptor.getOperands ()[0 ];
662+ auto loc = box.getLoc ();
663+ auto ty = convertType (op.getType ());
664+ auto typeCode = getValueFromBox (loc, box, ty, rewriter, kTypePosInBox );
665+ rewriter.replaceOp (op, typeCode);
666+ return mlir::success ();
667+ }
668+ };
669+
653670// / Lower `fir.string_lit` to LLVM IR dialect operation.
654671struct StringLitOpConversion : public FIROpConversion <fir::StringLitOp> {
655672 using FIROpConversion::FIROpConversion;
@@ -3584,24 +3601,24 @@ class FIRToLLVMLowering
35843601 AllocaOpConversion, AllocMemOpConversion, BoxAddrOpConversion,
35853602 BoxCharLenOpConversion, BoxDimsOpConversion, BoxEleSizeOpConversion,
35863603 BoxIsAllocOpConversion, BoxIsArrayOpConversion, BoxIsPtrOpConversion,
3587- BoxProcHostOpConversion, BoxRankOpConversion, BoxTypeDescOpConversion ,
3588- CallOpConversion, CmpcOpConversion, ConstcOpConversion ,
3589- ConvertOpConversion, CoordinateOpConversion, DispatchOpConversion ,
3590- DispatchTableOpConversion, DTEntryOpConversion, DivcOpConversion ,
3591- EmboxOpConversion, EmboxCharOpConversion, EmboxProcOpConversion ,
3592- ExtractValueOpConversion, FieldIndexOpConversion, FirEndOpConversion ,
3593- FreeMemOpConversion, GenTypeDescOpConversion, GlobalLenOpConversion ,
3594- GlobalOpConversion, HasValueOpConversion, InsertOnRangeOpConversion ,
3595- InsertValueOpConversion, IsPresentOpConversion ,
3596- LenParamIndexOpConversion, LoadOpConversion, MulcOpConversion ,
3597- NegcOpConversion, NoReassocOpConversion, SelectCaseOpConversion ,
3598- SelectOpConversion, SelectRankOpConversion, SelectTypeOpConversion ,
3599- ShapeOpConversion, ShapeShiftOpConversion, ShiftOpConversion ,
3600- SliceOpConversion, StoreOpConversion, StringLitOpConversion ,
3601- SubcOpConversion, UnboxCharOpConversion, UnboxProcOpConversion ,
3602- UndefOpConversion, UnreachableOpConversion, XArrayCoorOpConversion ,
3603- XEmboxOpConversion, XReboxOpConversion, ZeroOpConversion>(
3604- typeConverter, options, bindingTables);
3604+ BoxProcHostOpConversion, BoxRankOpConversion, BoxTypeCodeOpConversion ,
3605+ BoxTypeDescOpConversion, CallOpConversion, CmpcOpConversion ,
3606+ ConstcOpConversion, ConvertOpConversion, CoordinateOpConversion ,
3607+ DispatchOpConversion, DispatchTableOpConversion, DTEntryOpConversion ,
3608+ DivcOpConversion, EmboxOpConversion, EmboxCharOpConversion ,
3609+ EmboxProcOpConversion, ExtractValueOpConversion, FieldIndexOpConversion ,
3610+ FirEndOpConversion, FreeMemOpConversion, GenTypeDescOpConversion ,
3611+ GlobalLenOpConversion, GlobalOpConversion, HasValueOpConversion ,
3612+ InsertOnRangeOpConversion, InsertValueOpConversion ,
3613+ IsPresentOpConversion, LenParamIndexOpConversion, LoadOpConversion ,
3614+ MulcOpConversion, NegcOpConversion, NoReassocOpConversion ,
3615+ SelectCaseOpConversion, SelectOpConversion, SelectRankOpConversion ,
3616+ SelectTypeOpConversion, ShapeOpConversion, ShapeShiftOpConversion ,
3617+ ShiftOpConversion, SliceOpConversion, StoreOpConversion ,
3618+ StringLitOpConversion, SubcOpConversion, UnboxCharOpConversion ,
3619+ UnboxProcOpConversion, UndefOpConversion, UnreachableOpConversion ,
3620+ XArrayCoorOpConversion, XEmboxOpConversion, XReboxOpConversion,
3621+ ZeroOpConversion>( typeConverter, options, bindingTables);
36053622 mlir::populateFuncToLLVMConversionPatterns (typeConverter, pattern);
36063623 mlir::populateOpenMPToLLVMConversionPatterns (typeConverter, pattern);
36073624 mlir::arith::populateArithToLLVMConversionPatterns (typeConverter, pattern);
0 commit comments