From e38ef2ff711ca1aa68c541e973e68fbbb8efc575 Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Wed, 17 Nov 2021 12:01:57 +0100 Subject: [PATCH] [fir] Add fir.box_tdesc conversion This patch adds the conversion pattern for `fir.box_tdes`. This patch is part of the upstreaming effort from fir-dev branch. Reviewed By: kiranchandramohan Differential Revision: https://reviews.llvm.org/D113931 Co-authored-by: Eric Schweitz --- flang/lib/Optimizer/CodeGen/CodeGen.cpp | 44 ++++++++++++++++++------- flang/test/Fir/convert-to-llvm.fir | 17 ++++++++++ 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp index 899315a1286e..4e12005777b4 100644 --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -498,6 +498,26 @@ struct StringLitOpConversion : public FIROpConversion { } }; +/// Lower `fir.box_tdesc` to the sequence of operations to extract the type +/// descriptor from the box. +struct BoxTypeDescOpConversion : public FIROpConversion { + using FIROpConversion::FIROpConversion; + + mlir::LogicalResult + matchAndRewrite(fir::BoxTypeDescOp boxtypedesc, OpAdaptor adaptor, + mlir::ConversionPatternRewriter &rewriter) const override { + mlir::Value box = adaptor.getOperands()[0]; + auto loc = boxtypedesc.getLoc(); + mlir::Type typeTy = + fir::getDescFieldTypeModel()(boxtypedesc.getContext()); + auto result = getValueFromBox(loc, box, typeTy, rewriter, kTypePosInBox); + auto typePtrTy = mlir::LLVM::LLVMPointerType::get(typeTy); + rewriter.replaceOpWithNewOp(boxtypedesc, typePtrTy, + result); + return success(); + } +}; + // `fir.call` -> `llvm.call` struct CallOpConversion : public FIROpConversion { using FIROpConversion::FIROpConversion; @@ -1664,18 +1684,18 @@ public: AllocaOpConversion, BoxAddrOpConversion, BoxCharLenOpConversion, BoxDimsOpConversion, BoxEleSizeOpConversion, BoxIsAllocOpConversion, BoxIsArrayOpConversion, BoxIsPtrOpConversion, BoxRankOpConversion, - CallOpConversion, CmpcOpConversion, ConvertOpConversion, - DispatchOpConversion, DispatchTableOpConversion, DTEntryOpConversion, - DivcOpConversion, EmboxCharOpConversion, ExtractValueOpConversion, - HasValueOpConversion, GenTypeDescOpConversion, GlobalLenOpConversion, - GlobalOpConversion, InsertOnRangeOpConversion, InsertValueOpConversion, - IsPresentOpConversion, LoadOpConversion, NegcOpConversion, - MulcOpConversion, SelectCaseOpConversion, SelectOpConversion, - SelectRankOpConversion, SelectTypeOpConversion, ShapeOpConversion, - ShapeShiftOpConversion, ShiftOpConversion, SliceOpConversion, - StoreOpConversion, StringLitOpConversion, SubcOpConversion, - UnboxCharOpConversion, UndefOpConversion, UnreachableOpConversion, - ZeroOpConversion>(typeConverter); + BoxTypeDescOpConversion, CallOpConversion, CmpcOpConversion, + ConvertOpConversion, DispatchOpConversion, DispatchTableOpConversion, + DTEntryOpConversion, DivcOpConversion, EmboxCharOpConversion, + ExtractValueOpConversion, HasValueOpConversion, GenTypeDescOpConversion, + GlobalLenOpConversion, GlobalOpConversion, InsertOnRangeOpConversion, + InsertValueOpConversion, IsPresentOpConversion, LoadOpConversion, + NegcOpConversion, MulcOpConversion, SelectCaseOpConversion, + SelectOpConversion, SelectRankOpConversion, SelectTypeOpConversion, + ShapeOpConversion, ShapeShiftOpConversion, ShiftOpConversion, + SliceOpConversion, StoreOpConversion, StringLitOpConversion, + SubcOpConversion, UnboxCharOpConversion, UndefOpConversion, + UnreachableOpConversion, ZeroOpConversion>(typeConverter); mlir::populateStdToLLVMConversionPatterns(typeConverter, pattern); mlir::arith::populateArithmeticToLLVMConversionPatterns(typeConverter, pattern); diff --git a/flang/test/Fir/convert-to-llvm.fir b/flang/test/Fir/convert-to-llvm.fir index 5cbee8165382..8465063312c8 100644 --- a/flang/test/Fir/convert-to-llvm.fir +++ b/flang/test/Fir/convert-to-llvm.fir @@ -1319,3 +1319,20 @@ func @dead_slice() { // CHECK-NOT: fir.slice // CHECK: %{{.*}} = llvm.mlir.constant(0 : index) : i{{.*}} // CHECK-NEXT: llvm.return + +// ----- + +// Test `fir.box_tdesc` conversion. + +func @box_tdesc(%arg0: !fir.box) { + %0 = fir.box_tdesc %arg0 : (!fir.box) -> !fir.tdesc + return +} + +// CHECK-LABEL: llvm.func @box_tdesc( +// CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>) { +// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i32) : i32 +// CHECK: %[[TYPE_POS:.*]] = llvm.mlir.constant(4 : i32) : i32 +// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[TYPE_POS]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32) -> !llvm.ptr +// CHECK: %[[LOAD:.*]] = llvm.load %[[GEP]] : !llvm.ptr +// CHECK: %{{.*}} = llvm.inttoptr %[[LOAD]] : i{{.*}} to !llvm.ptr