diff --git a/flang/include/flang/Optimizer/Builder/BoxValue.h b/flang/include/flang/Optimizer/Builder/BoxValue.h index bffb4924d0009..040555f3d907c 100644 --- a/flang/include/flang/Optimizer/Builder/BoxValue.h +++ b/flang/include/flang/Optimizer/Builder/BoxValue.h @@ -101,19 +101,21 @@ class CharBoxValue : public AbstractBox { /// Polymorphic value associated with a dynamic type descriptor. class PolymorphicValue : public AbstractBox { public: - PolymorphicValue(mlir::Value addr, mlir::Value tdesc) - : AbstractBox{addr}, tdesc{tdesc} {} + PolymorphicValue(mlir::Value addr, mlir::Value sourceBox) + : AbstractBox{addr}, sourceBox{sourceBox} {} - PolymorphicValue clone(mlir::Value newBase) const { return {newBase, tdesc}; } + PolymorphicValue clone(mlir::Value newBase) const { + return {newBase, sourceBox}; + } - mlir::Value getTdesc() const { return tdesc; } + mlir::Value getSourceBox() const { return sourceBox; } friend llvm::raw_ostream &operator<<(llvm::raw_ostream &, const PolymorphicValue &); LLVM_DUMP_METHOD void dump() const { llvm::errs() << *this; } protected: - mlir::Value tdesc; + mlir::Value sourceBox; }; /// Abstract base class. @@ -153,8 +155,8 @@ class ArrayBoxValue : public PolymorphicValue, public AbstractArrayBox { public: ArrayBoxValue(mlir::Value addr, llvm::ArrayRef extents, llvm::ArrayRef lbounds = {}, - mlir::Value tdesc = {}) - : PolymorphicValue{addr, tdesc}, AbstractArrayBox{extents, lbounds} {} + mlir::Value sourceBox = {}) + : PolymorphicValue{addr, sourceBox}, AbstractArrayBox{extents, lbounds} {} ArrayBoxValue clone(mlir::Value newBase) const { return {newBase, extents, lbounds}; @@ -520,7 +522,7 @@ class ExtendedValue : public details::matcher { bool isPolymorphic() const { return match([](const fir::PolymorphicValue &box) -> bool { return true; }, [](const fir::ArrayBoxValue &box) -> bool { - return box.getTdesc() ? true : false; + return box.getSourceBox() ? true : false; }, [](const auto &box) -> bool { return false; }); } diff --git a/flang/include/flang/Optimizer/CodeGen/CGOps.td b/flang/include/flang/Optimizer/CodeGen/CGOps.td index 7df9fdc421de6..07670f2b92a77 100644 --- a/flang/include/flang/Optimizer/CodeGen/CGOps.td +++ b/flang/include/flang/Optimizer/CodeGen/CGOps.td @@ -58,14 +58,14 @@ def fircg_XEmboxOp : fircg_Op<"ext_embox", [AttrSizedOperandSegments]> { Variadic:$subcomponent, Variadic:$substr, Variadic:$lenParams, - Optional:$tdesc + Optional:$sourceBox ); let results = (outs BoxOrClassType); let assemblyFormat = [{ $memref (`(`$shape^`)`)? (`origin` $shift^)? (`[`$slice^`]`)? (`path` $subcomponent^)? (`substr` $substr^)? (`typeparams` $lenParams^)? - (`tdesc` $tdesc^)? attr-dict `:` functional-type(operands, results) + (`source_box` $sourceBox^)? attr-dict `:` functional-type(operands, results) }]; let extraClassDeclaration = [{ @@ -84,7 +84,7 @@ def fircg_XEmboxOp : fircg_Op<"ext_embox", [AttrSizedOperandSegments]> { return subcomponentOffset() + getSubcomponent().size(); } unsigned lenParamOffset() { return substrOffset() + getSubstr().size(); } - unsigned getTdescOffset() { + unsigned getSourceBoxOffset() { return lenParamOffset() + getLenParams().size(); } }]; diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td index 407a42599a100..acdea4f8aa8d1 100644 --- a/flang/include/flang/Optimizer/Dialect/FIROps.td +++ b/flang/include/flang/Optimizer/Dialect/FIROps.td @@ -763,7 +763,7 @@ def fir_EmboxOp : fir_Op<"embox", [NoMemoryEffect, AttrSizedOperandSegments]> { Optional:$shape, Optional:$slice, Variadic:$typeparams, - Optional:$tdesc, + Optional:$sourceBox, OptionalAttr:$accessMap ); @@ -774,14 +774,14 @@ def fir_EmboxOp : fir_Op<"embox", [NoMemoryEffect, AttrSizedOperandSegments]> { "mlir::Value":$memref, CArg<"mlir::Value", "{}">:$shape, CArg<"mlir::Value", "{}">:$slice, CArg<"mlir::ValueRange", "{}">:$typeparams, - CArg<"mlir::Value", "{}">:$tdesc), + CArg<"mlir::Value", "{}">:$sourceBox), [{ return build($_builder, $_state, resultTypes, memref, shape, slice, - typeparams, tdesc, mlir::AffineMapAttr{}); }]> + typeparams, sourceBox, mlir::AffineMapAttr{}); }]> ]; let assemblyFormat = [{ $memref (`(` $shape^ `)`)? (`[` $slice^ `]`)? (`typeparams` $typeparams^)? - (`tdesc` $tdesc^)? (`map` $accessMap^)? attr-dict `:` + (`source_box` $sourceBox^)? (`map` $accessMap^)? attr-dict `:` functional-type(operands, results) }]; @@ -790,7 +790,7 @@ def fir_EmboxOp : fir_Op<"embox", [NoMemoryEffect, AttrSizedOperandSegments]> { let extraClassDeclaration = [{ bool hasLenParams() { return !getTypeparams().empty(); } unsigned numLenParams() { return getTypeparams().size(); } - unsigned getTdescOffset() { + unsigned getSourceBoxOffset() { return 1 + (getShape() ? 1 : 0) + (getSlice() ? 1 : 0) + numLenParams(); } diff --git a/flang/lib/Lower/ConvertExpr.cpp b/flang/lib/Lower/ConvertExpr.cpp index da80abdcb951c..e852e8b007f29 100644 --- a/flang/lib/Lower/ConvertExpr.cpp +++ b/flang/lib/Lower/ConvertExpr.cpp @@ -2112,7 +2112,7 @@ class ScalarExprLowering { mlir::ValueRange emptyRange; auto boxTy = fir::ClassType::get(value.getType()); return builder.create(loc, boxTy, temp, empty, empty, - emptyRange, p.getTdesc()); + emptyRange, p.getSourceBox()); }, [&](const auto &) -> ExtValue { fir::emitFatalError(loc, "expr is not a scalar value"); @@ -4650,13 +4650,9 @@ class ArrayExprLowering { if (fir::isPolymorphicType(argTy)) { if (isArray(*expr)) { ExtValue exv = asScalarRef(*expr); - mlir::Value tdesc; - if (fir::isPolymorphicType(fir::getBase(exv).getType())) { - mlir::Type tdescType = fir::TypeDescType::get( - mlir::NoneType::get(builder.getContext())); - tdesc = builder.create(loc, tdescType, - fir::getBase(exv)); - } + mlir::Value sourceBox; + if (fir::isPolymorphicType(fir::getBase(exv).getType())) + sourceBox = fir::getBase(exv); mlir::Type baseTy = fir::dyn_cast_ptrOrBoxEleTy(fir::getBase(exv).getType()); mlir::Type innerTy = fir::unwrapSequenceType(baseTy); @@ -4668,7 +4664,7 @@ class ArrayExprLowering { mlir::ValueRange emptyRange; return builder.create( loc, fir::ClassType::get(innerTy), coord, empty, empty, - emptyRange, tdesc); + emptyRange, sourceBox); }); } else { ExtValue exv = asScalarRef(*expr); diff --git a/flang/lib/Optimizer/Builder/BoxValue.cpp b/flang/lib/Optimizer/Builder/BoxValue.cpp index 9f5818264e3c5..bffe91eaf6b7c 100644 --- a/flang/lib/Optimizer/Builder/BoxValue.cpp +++ b/flang/lib/Optimizer/Builder/BoxValue.cpp @@ -87,7 +87,7 @@ llvm::raw_ostream &fir::operator<<(llvm::raw_ostream &os, llvm::raw_ostream &fir::operator<<(llvm::raw_ostream &os, const fir::PolymorphicValue &p) { return os << "polymorphicvalue: { addr: " << p.getAddr() - << ", tdesc: " << p.getTdesc() << " }"; + << ", sourceBox: " << p.getSourceBox() << " }"; } llvm::raw_ostream &fir::operator<<(llvm::raw_ostream &os, diff --git a/flang/lib/Optimizer/Builder/FIRBuilder.cpp b/flang/lib/Optimizer/Builder/FIRBuilder.cpp index 0c5bf47e2978a..cac5c09ce35c0 100644 --- a/flang/lib/Optimizer/Builder/FIRBuilder.cpp +++ b/flang/lib/Optimizer/Builder/FIRBuilder.cpp @@ -519,7 +519,7 @@ mlir::Value fir::FirOpBuilder::createBox(mlir::Location loc, mlir::Value s = createShape(loc, exv); return create(loc, boxTy, itemAddr, s, /*slice=*/empty, /*typeparams=*/emptyRange, - isPolymorphic ? box.getTdesc() : tdesc); + isPolymorphic ? box.getSourceBox() : tdesc); }, [&](const fir::CharArrayBoxValue &box) -> mlir::Value { mlir::Value s = createShape(loc, exv); @@ -548,7 +548,7 @@ mlir::Value fir::FirOpBuilder::createBox(mlir::Location loc, mlir::ValueRange emptyRange; return create(loc, boxTy, itemAddr, empty, empty, emptyRange, - isPolymorphic ? p.getTdesc() : tdesc); + isPolymorphic ? p.getSourceBox() : tdesc); }, [&](const auto &) -> mlir::Value { mlir::Value empty; @@ -1054,17 +1054,13 @@ fir::ExtendedValue fir::factory::arrayElementToExtendedValue( if (box.isDerivedWithLenParameters()) TODO(loc, "get length parameters from derived type BoxValue"); if (box.isPolymorphic()) { - mlir::Type tdescType = - fir::TypeDescType::get(mlir::NoneType::get(builder.getContext())); - mlir::Value tdesc = builder.create( - loc, tdescType, fir::getBase(box)); - return fir::PolymorphicValue(element, tdesc); + return fir::PolymorphicValue(element, fir::getBase(box)); } return element; }, [&](const fir::ArrayBoxValue &box) -> fir::ExtendedValue { - if (box.getTdesc()) - return fir::PolymorphicValue(element, box.getTdesc()); + if (box.getSourceBox()) + return fir::PolymorphicValue(element, box.getSourceBox()); return element; }, [&](const auto &) -> fir::ExtendedValue { return element; }); diff --git a/flang/lib/Optimizer/Builder/MutableBox.cpp b/flang/lib/Optimizer/Builder/MutableBox.cpp index 7bdcb81b50c84..817ae0271eda3 100644 --- a/flang/lib/Optimizer/Builder/MutableBox.cpp +++ b/flang/lib/Optimizer/Builder/MutableBox.cpp @@ -416,17 +416,13 @@ fir::factory::genMutableBoxRead(fir::FirOpBuilder &builder, mlir::Location loc, return fir::CharArrayBoxValue{addr, len, extents, lbounds}; return fir::CharBoxValue{addr, len}; } - mlir::Value tdesc; - if (box.isPolymorphic()) { - auto loadedBox = builder.create(loc, box.getAddr()); - mlir::Type tdescType = - fir::TypeDescType::get(mlir::NoneType::get(builder.getContext())); - tdesc = builder.create(loc, tdescType, loadedBox); - } + mlir::Value sourceBox; + if (box.isPolymorphic()) + sourceBox = builder.create(loc, box.getAddr()); if (rank) - return fir::ArrayBoxValue{addr, extents, lbounds, tdesc}; + return fir::ArrayBoxValue{addr, extents, lbounds, sourceBox}; if (box.isPolymorphic()) - return fir::PolymorphicValue(addr, tdesc); + return fir::PolymorphicValue(addr, sourceBox); return addr; } @@ -476,12 +472,12 @@ void fir::factory::associateMutableBox(fir::FirOpBuilder &builder, MutablePropertyWriter writer(builder, loc, box); source.match( [&](const fir::PolymorphicValue &p) { - mlir::Value tdesc; + mlir::Value sourceBox; if (auto polyBox = source.getBoxOf()) - tdesc = polyBox->getTdesc(); + sourceBox = polyBox->getSourceBox(); writer.updateMutableBox(p.getAddr(), /*lbounds=*/std::nullopt, /*extents=*/std::nullopt, - /*lengths=*/std::nullopt, tdesc); + /*lengths=*/std::nullopt, sourceBox); }, [&](const fir::UnboxedValue &addr) { writer.updateMutableBox(addr, /*lbounds=*/std::nullopt, diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp index 84b5765b32250..a97139d8046a7 100644 --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -1565,8 +1565,8 @@ struct EmboxCommonConversion : public FIROpConversion { std::tuple consDescriptorPrefix(BOX box, mlir::Type inputType, mlir::ConversionPatternRewriter &rewriter, unsigned rank, - mlir::ValueRange lenParams, - mlir::Value typeDesc = {}) const { + mlir::ValueRange lenParams, mlir::Value sourceBox = {}, + mlir::Type sourceBoxType = {}) const { auto loc = box.getLoc(); auto boxTy = box.getType().template dyn_cast(); bool useInputType = fir::isPolymorphicType(boxTy) && @@ -1584,25 +1584,19 @@ struct EmboxCommonConversion : public FIROpConversion { auto [eleSize, cfiTy] = getSizeAndTypeCode( loc, rewriter, useInputType ? inputType : boxTy.getEleTy(), typeparams); + mlir::Value typeDesc; + if (sourceBox) + typeDesc = + this->loadTypeDescAddress(loc, sourceBoxType, sourceBox, rewriter); // When emboxing a fir.ref to an unlimited polymorphic box, get the // type code and element size from the box used to extract the type desc. if (fir::isUnlimitedPolymorphicType(boxTy) && - inputType.isa() && typeDesc) { - if (auto *typeDescOp = typeDesc.getDefiningOp()) { - if (auto loadOp = mlir::dyn_cast(typeDescOp)) { - if (auto *gepOp = loadOp.getAddr().getDefiningOp()) { - if (auto gep = mlir::dyn_cast(gepOp)) { - mlir::Type idxTy = this->lowerTy().indexType(); - eleSize = this->getElementSizeFromBox(loc, idxTy, gep.getBase(), - rewriter); - cfiTy = this->getValueFromBox(loc, gep.getBase(), cfiTy.getType(), - rewriter, kTypePosInBox); - } - } - } - } + inputType.isa() && sourceBox) { + mlir::Type idxTy = this->lowerTy().indexType(); + eleSize = this->getElementSizeFromBox(loc, idxTy, sourceBox, rewriter); + cfiTy = this->getValueFromBox(loc, sourceBox, cfiTy.getType(), rewriter, + kTypePosInBox); } - auto mod = box->template getParentOfType(); mlir::Value descriptor = populateDescriptor( loc, mod, boxTy, inputType, rewriter, rank, eleSize, cfiTy, typeDesc); @@ -1769,13 +1763,17 @@ struct EmboxOpConversion : public EmboxCommonConversion { matchAndRewrite(fir::EmboxOp embox, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const override { mlir::ValueRange operands = adaptor.getOperands(); - mlir::Value tdesc; - if (embox.getTdesc()) - tdesc = operands[embox.getTdescOffset()]; + mlir::Value sourceBox; + mlir::Type sourceBoxType; + if (embox.getSourceBox()) { + sourceBox = operands[embox.getSourceBoxOffset()]; + sourceBoxType = embox.getSourceBox().getType(); + } assert(!embox.getShape() && "There should be no dims on this embox op"); auto [boxTy, dest, eleSize] = consDescriptorPrefix( embox, fir::unwrapRefType(embox.getMemref().getType()), rewriter, - /*rank=*/0, /*lenParams=*/operands.drop_front(1), tdesc); + /*rank=*/0, /*lenParams=*/operands.drop_front(1), sourceBox, + sourceBoxType); dest = insertBaseAddress(rewriter, embox.getLoc(), dest, operands[0]); if (isDerivedTypeWithLenParams(boxTy)) { TODO(embox.getLoc(), @@ -1796,12 +1794,16 @@ struct XEmboxOpConversion : public EmboxCommonConversion { matchAndRewrite(fir::cg::XEmboxOp xbox, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const override { mlir::ValueRange operands = adaptor.getOperands(); - mlir::Value tdesc; - if (xbox.getTdesc()) - tdesc = operands[xbox.getTdescOffset()]; + mlir::Value sourceBox; + mlir::Type sourceBoxType; + if (xbox.getSourceBox()) { + sourceBox = operands[xbox.getSourceBoxOffset()]; + sourceBoxType = xbox.getSourceBox().getType(); + } auto [boxTy, dest, eleSize] = consDescriptorPrefix( xbox, fir::unwrapRefType(xbox.getMemref().getType()), rewriter, - xbox.getOutRank(), operands.drop_front(xbox.lenParamOffset()), tdesc); + xbox.getOutRank(), operands.drop_front(xbox.lenParamOffset()), + sourceBox, sourceBoxType); // Generate the triples in the dims field of the descriptor auto i64Ty = mlir::IntegerType::get(xbox.getContext(), 64); mlir::Value base = operands[0]; diff --git a/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp b/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp index a8d5925458182..044c2e775a6a7 100644 --- a/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp +++ b/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp @@ -108,7 +108,7 @@ class EmboxConversion : public mlir::OpRewritePattern { auto xbox = rewriter.create( loc, embox.getType(), embox.getMemref(), shapeOpers, std::nullopt, std::nullopt, std::nullopt, std::nullopt, embox.getTypeparams(), - embox.getTdesc()); + embox.getSourceBox()); LLVM_DEBUG(llvm::dbgs() << "rewriting " << embox << " to " << xbox << '\n'); rewriter.replaceOp(embox, xbox.getOperation()->getResults()); return mlir::success(); @@ -144,7 +144,7 @@ class EmboxConversion : public mlir::OpRewritePattern { auto xbox = rewriter.create( loc, embox.getType(), embox.getMemref(), shapeOpers, shiftOpers, sliceOpers, subcompOpers, substrOpers, embox.getTypeparams(), - embox.getTdesc()); + embox.getSourceBox()); LLVM_DEBUG(llvm::dbgs() << "rewriting " << embox << " to " << xbox << '\n'); rewriter.replaceOp(embox, xbox.getOperation()->getResults()); return mlir::success(); diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp index 579fd8317ca9d..e6dced8988ce0 100644 --- a/flang/lib/Optimizer/Dialect/FIROps.cpp +++ b/flang/lib/Optimizer/Dialect/FIROps.cpp @@ -1180,8 +1180,8 @@ mlir::LogicalResult fir::EmboxOp::verify() { return emitOpError("shape must not be provided for a scalar"); if (getSlice() && !isArray) return emitOpError("slice must not be provided for a scalar"); - if (getTdesc() && !getResult().getType().isa()) - return emitOpError("tdesc must be used with fir.class result type"); + if (getSourceBox() && !getResult().getType().isa()) + return emitOpError("source_box must be used with fir.class result type"); return mlir::success(); } diff --git a/flang/test/Fir/fir-ops.fir b/flang/test/Fir/fir-ops.fir index 323c2b590dc6e..f65d12a9452bb 100644 --- a/flang/test/Fir/fir-ops.fir +++ b/flang/test/Fir/fir-ops.fir @@ -821,7 +821,8 @@ func.func private @dispatch(%arg0: !fir.class>> func.func @embox_tdesc(%arg0: !fir.class>>) { %0 = fir.alloca i32 %c1_i32 = arith.constant 1 : i32 @@ -837,10 +838,8 @@ func.func @embox_tdesc(%arg0: !fir.class>>, i64) -> !fir.ref> - %tdesc = fir.box_tdesc %arg0 : (!fir.class>>) -> (!fir.tdesc>) - // CHECK: %[[TDESC:.*]] = fir.box_tdesc %{{.*}} : (!fir.class>>) -> !fir.tdesc> - %13 = fir.embox %12 tdesc %tdesc : (!fir.ref>, !fir.tdesc>) -> !fir.class> - // CHECK: %{{.*}} = fir.embox %{{.*}} tdesc %[[TDESC]] : (!fir.ref>, !fir.tdesc>) -> !fir.class> + %13 = fir.embox %12 source_box %arg0 : (!fir.ref>, !fir.class>>) -> !fir.class> + // CHECK: %{{.*}} = fir.embox %{{.*}} source_box %[[ARG0]] : (!fir.ref>, !fir.class>>) -> !fir.class> %14 = arith.addi %arg2, %c1 : index %15 = fir.convert %c1 : (index) -> i32 %16 = fir.load %0 : !fir.ref diff --git a/flang/test/Fir/invalid.fir b/flang/test/Fir/invalid.fir index fdb4249c4ad81..c01bcc809d341 100644 --- a/flang/test/Fir/invalid.fir +++ b/flang/test/Fir/invalid.fir @@ -360,9 +360,8 @@ func.func @embox_tdesc(%arg0: !fir.class>>, i64) -> !fir.ref> - %tdesc = fir.box_tdesc %arg0 : (!fir.class>>) -> (!fir.tdesc>) - // expected-error@+1 {{'fir.embox' op tdesc must be used with fir.class result type}} - %13 = fir.embox %12 tdesc %tdesc : (!fir.ref>, !fir.tdesc>) -> !fir.box> + // expected-error@+1 {{'fir.embox' op source_box must be used with fir.class result type}} + %13 = fir.embox %12 source_box %arg0 : (!fir.ref>, !fir.class>>) -> !fir.box> %14 = arith.addi %arg2, %c1 : index %15 = fir.convert %c1 : (index) -> i32 %16 = fir.load %0 : !fir.ref diff --git a/flang/test/Fir/polymorphic.fir b/flang/test/Fir/polymorphic.fir index a24652123ab2b..993e5c473cf8f 100644 --- a/flang/test/Fir/polymorphic.fir +++ b/flang/test/Fir/polymorphic.fir @@ -75,8 +75,7 @@ func.func @_QMunlimitedPsub1(%arg0: !fir.class> {fir.bindc_na %c1_i64_0 = arith.constant 1 : i64 %0 = arith.subi %c1_i64, %c1_i64_0 : i64 %1 = fir.coordinate_of %arg0, %0 : (!fir.class>, i64) -> !fir.ref - %2 = fir.box_tdesc %arg0 : (!fir.class>) -> !fir.tdesc - %3 = fir.embox %1 tdesc %2 : (!fir.ref, !fir.tdesc) -> !fir.class + %3 = fir.embox %1 source_box %arg0 : (!fir.ref, !fir.class>) -> !fir.class fir.select_type %3 : !fir.class [#fir.type_is, ^bb1, unit, ^bb2] ^bb1: %4 = fir.box_addr %3 : (!fir.class) -> !fir.ref @@ -90,11 +89,12 @@ func.func @_QMunlimitedPsub1(%arg0: !fir.class> {fir.bindc_na // CHECK-LABEL: define void @_QMunlimitedPsub1( // CHECK-SAME: ptr %[[ARRAY:.*]]) { // CHECK: %[[BOX:.*]] = alloca { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] } +// CHECK: %{{.}} = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]], ptr, [1 x i64] }, ptr %[[ARRAY]], i32 0, i32 7, i32 0, i32 2 // CHECK: %[[TYPE_DESC_GEP:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]], ptr, [1 x i64] }, ptr %[[ARRAY]], i32 0, i32 8 // CHECK: %[[TYPE_DESC:.*]] = load ptr, ptr %[[TYPE_DESC_GEP]] -// CHECK: %[[ELE_SIZE_GEP:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]], ptr, [1 x i64] }, ptr %0, i32 0, i32 1 +// CHECK: %[[ELE_SIZE_GEP:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]], ptr, [1 x i64] }, ptr %[[ARRAY]], i32 0, i32 1 // CHECK: %[[ELE_SIZE:.*]] = load i64, ptr %[[ELE_SIZE_GEP]] -// CHECK: %[[TYPE_CODE_GEP:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]], ptr, [1 x i64] }, ptr %0, i32 0, i32 4 +// CHECK: %[[TYPE_CODE_GEP:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]], ptr, [1 x i64] }, ptr %[[ARRAY]], i32 0, i32 4 // CHECK: %[[TYPE_CODE:.*]] = load i32, ptr %[[TYPE_CODE_GEP]] // CHECK: %{{.*}} = insertvalue { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] } undef, i64 %[[ELE_SIZE]], 1 // CHECK: %[[TYPE_CODE_TRUNC:.*]] = trunc i32 %[[TYPE_CODE]] to i8 diff --git a/flang/test/Lower/allocatable-polymorphic.f90 b/flang/test/Lower/allocatable-polymorphic.f90 index 968de1e4b12a6..992f660806176 100644 --- a/flang/test/Lower/allocatable-polymorphic.f90 +++ b/flang/test/Lower/allocatable-polymorphic.f90 @@ -167,15 +167,13 @@ subroutine test_pointer() ! CHECK-LABEL: fir.do_loop ! CHECK: %[[C3_LOAD:.*]] = fir.load %[[C3_DESC]] : !fir.ref>>>> ! CHECK: %[[C3_COORD:.*]] = fir.coordinate_of %[[C3_LOAD]], %{{.*}} : (!fir.class>>>, i64) -> !fir.ref> -! CHECK: %[[C3_TDESC:.*]] = fir.box_tdesc %[[C3_LOAD]] : (!fir.class>>>) -> !fir.tdesc -! CHECK: %[[C3_BOXED:.*]] = fir.embox %[[C3_COORD]] tdesc %[[C3_TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[C3_BOXED:.*]] = fir.embox %[[C3_COORD]] source_box %[[C3_LOAD]] : (!fir.ref>, !fir.class>>>) -> !fir.class> ! CHECK: fir.dispatch "proc2"(%[[C3_BOXED]] : !fir.class>) (%[[C3_BOXED]] : !fir.class>) {pass_arg_pos = 0 : i32} ! CHECK-LABEL: fir.do_loop ! CHECK: %[[C4_LOAD:.*]] = fir.load %[[C4_DESC]] : !fir.ref>>>> ! CHECK: %[[C4_COORD:.*]] = fir.coordinate_of %[[C4_LOAD]], %{{.*}} : (!fir.class>>>, i64) -> !fir.ref> -! CHECK: %[[C4_TDESC:.*]] = fir.box_tdesc %[[C4_LOAD]] : (!fir.class>>>) -> !fir.tdesc -! CHECK: %[[C4_BOXED:.*]] = fir.embox %[[C4_COORD]] tdesc %[[C4_TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[C4_BOXED:.*]] = fir.embox %[[C4_COORD]] source_box %[[C4_LOAD]] : (!fir.ref>, !fir.class>>>) -> !fir.class> ! CHECK: fir.dispatch "proc2"(%[[C4_BOXED]] : !fir.class>) (%[[C4_BOXED]] : !fir.class>) {pass_arg_pos = 0 : i32} @@ -330,15 +328,13 @@ subroutine test_allocatable() ! CHECK-LABEL: %{{.*}} = fir.do_loop ! CHECK: %[[C3_LOAD:.*]] = fir.load %[[C3_DESC]] : !fir.ref>>>> ! CHECK: %[[C3_COORD:.*]] = fir.coordinate_of %[[C3_LOAD]], %{{.*}} : (!fir.class>>>, i64) -> !fir.ref> -! CHECK: %[[C3_TDESC:.*]] = fir.box_tdesc %[[C3_LOAD]] : (!fir.class>>>) -> !fir.tdesc -! CHECK: %[[C3_EMBOX:.*]] = fir.embox %[[C3_COORD]] tdesc %[[C3_TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[C3_EMBOX:.*]] = fir.embox %[[C3_COORD]] source_box %[[C3_LOAD]] : (!fir.ref>, !fir.class>>>) -> !fir.class> ! CHECK: fir.dispatch "proc2"(%[[C3_EMBOX]] : !fir.class>) (%[[C3_EMBOX]] : !fir.class>) {pass_arg_pos = 0 : i32} ! CHECK-LABEL: %{{.*}} = fir.do_loop ! CHECK: %[[C4_LOAD:.*]] = fir.load %[[C4]] : !fir.ref>>>> ! CHECK: %[[C4_COORD:.*]] = fir.coordinate_of %[[C4_LOAD]], %{{.*}} : (!fir.class>>>, i64) -> !fir.ref> -! CHECK: %[[C4_TDESC:.*]] = fir.box_tdesc %[[C4_LOAD]] : (!fir.class>>>) -> !fir.tdesc -! CHECK: %[[C4_EMBOX:.*]] = fir.embox %[[C4_COORD]] tdesc %[[C4_TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[C4_EMBOX:.*]] = fir.embox %[[C4_COORD]] source_box %[[C4_LOAD]] : (!fir.ref>, !fir.class>>>) -> !fir.class> ! CHECK: fir.dispatch "proc2"(%[[C4_EMBOX]] : !fir.class>) (%[[C4_EMBOX]] : !fir.class>) {pass_arg_pos = 0 : i32} ! CHECK: %[[TYPE_DESC_ADDR:.*]] = fir.address_of(@_QMpolyE.dt.p1) : !fir.ref> @@ -441,7 +437,7 @@ program test_alloc call test_pointer() end -! Check code generation of allocate runtime calls for polymoprhic entities. This +! Check code generation of allocate runtime calls for polymorphic entities. This ! is done from Fortran so we don't have a file full of auto-generated type info ! in order to perform the checks. @@ -491,8 +487,10 @@ program test_alloc ! LLVM: %[[C3_LOAD:.*]] = load { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]], ptr, [1 x i64] }, ptr %{{.*}} ! LLVM: store { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]], ptr, [1 x i64] } %[[C3_LOAD]], ptr %{{.*}} + ! LLVM: %[[GEP_TDESC_C3:.*]] = getelementptr { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]], ptr, [1 x i64] }, ptr %{{.*}}, i32 0, i32 8 ! LLVM: %[[TDESC_C3:.*]] = load ptr, ptr %[[GEP_TDESC_C3]] + ! LLVM: %[[BOX0:.*]] = insertvalue { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] } { ptr undef, i64 ptrtoint (ptr getelementptr (%_QMpolyTp1, ptr null, i32 1) to i64), i32 20180515, i8 0, i8 42, i8 0, i8 1, ptr undef, [1 x i64] undef }, ptr %[[TDESC_C3]], 7 ! LLVM: %[[BOX1:.*]] = insertvalue { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] } %[[BOX0]], ptr %{{.*}}, 0 ! LLVM: store { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] } %[[BOX1]], ptr %{{.*}} diff --git a/flang/test/Lower/dispatch.f90 b/flang/test/Lower/dispatch.f90 index f3009ee012626..4328ac70747c3 100644 --- a/flang/test/Lower/dispatch.f90 +++ b/flang/test/Lower/dispatch.f90 @@ -203,8 +203,7 @@ subroutine check_dispatch_static_array(p, t) ! CHECK-SAME: %[[ARG1:.*]]: !fir.ref>> {fir.bindc_name = "t"}) { ! CHECK: fir.do_loop {{.*}} { ! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[ARG0]], %{{.*}} : (!fir.class>>, i64) -> !fir.ref> -! CHECK: %[[TDESC:.*]] = fir.box_tdesc %[[ARG0]] : (!fir.class>>) -> !fir.tdesc -! CHECK: %[[CLASS_BOX:.*]] = fir.embox %[[COORD]] tdesc %[[TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[CLASS_BOX:.*]] = fir.embox %[[COORD]] source_box %[[ARG0]] : (!fir.ref>, !fir.class>>) -> !fir.class> ! CHECK: fir.dispatch "tbp_pass"(%[[CLASS_BOX]] : !fir.class>) (%[[CLASS_BOX]] : !fir.class>) {pass_arg_pos = 0 : i32} ! CHECK: fir.do_loop {{.*}} { @@ -230,8 +229,7 @@ subroutine check_dispatch_dynamic_array(p, t) ! CHECK-SAME: %[[ARG1:.*]]: !fir.box>> {fir.bindc_name = "t"}) { ! CHECK: %{{.*}} = fir.do_loop {{.*}} { ! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[ARG0]], %{{.*}} : (!fir.class>>, i64) -> !fir.ref> -! CHECK: %[[TDESC:.*]] = fir.box_tdesc %[[ARG0]] : (!fir.class>>) -> !fir.tdesc -! CHECK: %[[CLASS_BOX:.*]] = fir.embox %[[COORD]] tdesc %[[TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[CLASS_BOX:.*]] = fir.embox %[[COORD]] source_box %[[ARG0]] : (!fir.ref>, !fir.class>>) -> !fir.class> ! CHECK: fir.dispatch "tbp_pass"(%[[CLASS_BOX]] : !fir.class>) (%[[CLASS_BOX]] : !fir.class>) {pass_arg_pos = 0 : i32} ! CHECK: %{{.*}} = fir.do_loop {{.*}} { @@ -261,8 +259,7 @@ subroutine check_dispatch_allocatable_array(p, t) ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[BOX_DIMS_ARG0:.*]]:3 = fir.box_dims %[[LOAD_ARG0]], %[[C0]] : (!fir.class>>>, index) -> (index, index, index) ! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[LOAD_ARG0]], %{{.*}} : (!fir.class>>>, i64) -> !fir.ref> -! CHECK: %[[TDESC_ARG0:.*]] = fir.box_tdesc %[[LOAD_ARG0]] : (!fir.class>>>) -> !fir.tdesc -! CHECK: %[[CLASS_BOX:.*]] = fir.embox %[[COORD]] tdesc %[[TDESC_ARG0]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[CLASS_BOX:.*]] = fir.embox %[[COORD]] source_box %[[LOAD_ARG0]] : (!fir.ref>, !fir.class>>>) -> !fir.class> ! CHECK: fir.dispatch "tbp_pass"(%[[CLASS_BOX]] : !fir.class>) (%[[CLASS_BOX]] : !fir.class>) {pass_arg_pos = 0 : i32} ! CHECK: %{{.*}} = fir.do_loop {{.*}} { @@ -295,8 +292,7 @@ subroutine check_dispatch_pointer_array(p, t) ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[BOX_DIMS_ARG0]]:3 = fir.box_dims %[[LOAD_ARG0]], %[[C0]] : (!fir.class>>>, index) -> (index, index, index) ! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[LOAD_ARG0]], %{{.*}} : (!fir.class>>>, i64) -> !fir.ref> -! CHECK: %[[TDESC_ARG0:.*]] = fir.box_tdesc %[[LOAD_ARG0]] : (!fir.class>>>) -> !fir.tdesc -! CHECK: %[[CLASS_BOX]] = fir.embox %[[COORD]] tdesc %[[TDESC_ARG0]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[CLASS_BOX]] = fir.embox %[[COORD]] source_box %[[LOAD_ARG0]] : (!fir.ref>, !fir.class>>>) -> !fir.class> ! CHECK: fir.dispatch "tbp_pass"(%[[CLASS_BOX]] : !fir.class>) (%[[CLASS_BOX]] : !fir.class>) {pass_arg_pos = 0 : i32} ! CHECK: %{{.*}} = fir.do_loop {{.*}} { @@ -322,11 +318,9 @@ subroutine check_dispatch_dynamic_array_copy(p, o) ! CHECK-SAME: %[[ARG1:.*]]: !fir.class>> {fir.bindc_name = "o"}) { ! CHECK: %{{.*}} = fir.do_loop {{.*}} { ! CHECK: %[[COORD1:.*]] = fir.coordinate_of %[[ARG0]], %{{.*}} : (!fir.class>>, i64) -> !fir.ref> -! CHECK: %[[TDESC1:.*]] = fir.box_tdesc %[[ARG0]] : (!fir.class>>) -> !fir.tdesc -! CHECK: %[[CLASS1:.*]] = fir.embox %[[COORD1]] tdesc %[[TDESC1]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[CLASS1:.*]] = fir.embox %[[COORD1]] source_box %[[ARG0]] : (!fir.ref>, !fir.class>>) -> !fir.class> ! CHECK: %[[COORD2:.*]] = fir.coordinate_of %[[ARG1]], %{{.*}} : (!fir.class>>, i64) -> !fir.ref> -! CHECK: %[[TDESC2:.*]] = fir.box_tdesc %[[ARG1]] : (!fir.class>>) -> !fir.tdesc -! CHECK: %[[CLASS2:.*]] = fir.embox %[[COORD2]] tdesc %[[TDESC2]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[CLASS2:.*]] = fir.embox %[[COORD2]] source_box %[[ARG1]] : (!fir.ref>, !fir.class>>) -> !fir.class> ! CHECK: fir.dispatch "pass_with_class_arg"(%[[CLASS1]] : !fir.class>) (%[[CLASS1]], %[[CLASS2]] : !fir.class>, !fir.class>) {pass_arg_pos = 0 : i32} ! ------------------------------------------------------------------------------ diff --git a/flang/test/Lower/pointer-association-polymorphic.f90 b/flang/test/Lower/pointer-association-polymorphic.f90 index e49bc7c47362d..fa3091d9ffa68 100644 --- a/flang/test/Lower/pointer-association-polymorphic.f90 +++ b/flang/test/Lower/pointer-association-polymorphic.f90 @@ -107,8 +107,7 @@ subroutine test_pointer() ! CHECK: %[[LB:.*]] = fir.convert %[[C3_DIMS]]#0 : (index) -> i64 ! CHECK: %[[IDX:.*]] = arith.subi %[[C1]], %[[LB]] : i64 ! CHECK: %[[C3_COORD:.*]] = fir.coordinate_of %[[C3_LOAD]], %[[IDX]] : (!fir.class>>>, i64) -> !fir.ref> -! CHECK: %[[C3_TDESC:.*]] = fir.box_tdesc %[[C3_LOAD]] : (!fir.class>>>) -> !fir.tdesc -! CHECK: %[[C3_EMBOX:.*]] = fir.embox %[[C3_COORD]] tdesc %[[C3_TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[C3_EMBOX:.*]] = fir.embox %[[C3_COORD]] source_box %[[C3_LOAD]] : (!fir.ref>, !fir.class>>>) -> !fir.class> ! CHECK: %[[P_CONV:.*]] = fir.convert %[[P_DESC]] : (!fir.ref>>>) -> !fir.ref> ! CHECK: %[[C3_EMBOX_CONV:.*]] = fir.convert %[[C3_EMBOX]] : (!fir.class>) -> !fir.box ! CHECK: %{{.*}} = fir.call @_FortranAPointerAssociate(%[[P_CONV]], %[[C3_EMBOX_CONV]]) {{.*}} : (!fir.ref>, !fir.box) -> none @@ -123,8 +122,7 @@ subroutine test_pointer() ! CHECK: %[[LB:.*]] = fir.convert %[[C4_DIMS]]#0 : (index) -> i64 ! CHECK: %[[IDX:.*]] = arith.subi %[[C2]], %[[LB]] : i64 ! CHECK: %[[C4_COORD:.*]] = fir.coordinate_of %[[C4_LOAD]], %[[IDX]] : (!fir.class>>>, i64) -> !fir.ref> -! CHECK: %[[C4_TDESC:.*]] = fir.box_tdesc %[[C4_LOAD]] : (!fir.class>>>) -> !fir.tdesc -! CHECK: %[[C4_EMBOX:.*]] = fir.embox %[[C4_COORD]] tdesc %[[C4_TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[C4_EMBOX:.*]] = fir.embox %[[C4_COORD]] source_box %[[C4_LOAD]] : (!fir.ref>, !fir.class>>>) -> !fir.class> ! CHECK: %[[P_CONV:.*]] = fir.convert %[[P_DESC]] : (!fir.ref>>>) -> !fir.ref> ! CHECK: %[[C4_EMBOX_CONV:.*]] = fir.convert %[[C4_EMBOX]] : (!fir.class>) -> !fir.box ! CHECK: %{{.*}} = fir.call @_FortranAPointerAssociate(%[[P_CONV]], %[[C4_EMBOX_CONV]]) {{.*}} : (!fir.ref>, !fir.box) -> none @@ -140,8 +138,7 @@ subroutine test_pointer() ! CHECK-LABEL: fir.do_loop ! CHECK: %[[PA_LOAD:.*]] = fir.load %[[PA_DESC]] : !fir.ref>>>> ! CHECK: %[[PA_COORD:.*]] = fir.coordinate_of %[[PA_LOAD]], %{{.*}} : (!fir.class>>>, i64) -> !fir.ref> -! CHECK: %[[PA_TDESC:.*]] = fir.box_tdesc %[[PA_LOAD]] : (!fir.class>>>) -> !fir.tdesc -! CHECK: %[[PA_EMBOX:.*]] = fir.embox %[[PA_COORD]] tdesc %[[PA_TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[PA_EMBOX:.*]] = fir.embox %[[PA_COORD]] source_box %[[PA_LOAD]] : (!fir.ref>, !fir.class>>>) -> !fir.class> ! CHECK: fir.dispatch "proc"(%[[PA_EMBOX]] : !fir.class>) (%[[PA_EMBOX]] : !fir.class>) {pass_arg_pos = 0 : i32} ! CHECK: %[[C4_LOAD:.*]] = fir.load %[[C4_DESC]] : !fir.ref>>>> @@ -152,8 +149,7 @@ subroutine test_pointer() ! CHECK-LABEL: fir.do_loop ! CHECK: %[[PA_LOAD:.*]] = fir.load %[[PA_DESC]] : !fir.ref>>>> ! CHECK: %[[PA_COORD:.*]] = fir.coordinate_of %[[PA_LOAD]], %{{.*}} : (!fir.class>>>, i64) -> !fir.ref> -! CHECK: %[[PA_TDESC:.*]] = fir.box_tdesc %[[PA_LOAD]] : (!fir.class>>>) -> !fir.tdesc -! CHECK: %[[PA_EMBOX:.*]] = fir.embox %[[PA_COORD]] tdesc %[[PA_TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[PA_EMBOX:.*]] = fir.embox %[[PA_COORD]] source_box %[[PA_LOAD]] : (!fir.ref>, !fir.class>>>) -> !fir.class> ! CHECK: fir.dispatch "proc"(%[[PA_EMBOX]] : !fir.class>) (%[[PA_EMBOX]] : !fir.class>) {pass_arg_pos = 0 : i32} ! CHECK: %[[C4_LOAD:.*]] = fir.load %[[C4_DESC]] : !fir.ref>>>> @@ -174,8 +170,7 @@ subroutine test_pointer() ! CHECK-LABEL: fir.do_loop ! CHECK: %[[PA_LOAD:.*]] = fir.load %[[PA_DESC]] : !fir.ref>>>> ! CHECK: %[[PA_COORD:.*]] = fir.coordinate_of %[[PA_LOAD]], %{{.*}} : (!fir.class>>>, i64) -> !fir.ref> -! CHECK: %[[PA_TDESC:.*]] = fir.box_tdesc %[[PA_LOAD]] : (!fir.class>>>) -> !fir.tdesc -! CHECK: %[[PA_EMBOX:.*]] = fir.embox %[[PA_COORD]] tdesc %[[PA_TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[PA_EMBOX:.*]] = fir.embox %[[PA_COORD]] source_box %[[PA_LOAD]] : (!fir.ref>, !fir.class>>>) -> !fir.class> ! CHECK: fir.dispatch "proc"(%[[PA_EMBOX]] : !fir.class>) (%[[PA_EMBOX]] : !fir.class>) {pass_arg_pos = 0 : i32} end module diff --git a/flang/test/Lower/polymorphic.f90 b/flang/test/Lower/polymorphic.f90 index 48c54a012c532..8caa6ce9603f6 100644 --- a/flang/test/Lower/polymorphic.f90 +++ b/flang/test/Lower/polymorphic.f90 @@ -263,11 +263,10 @@ subroutine no_reassoc_poly_value(a, i) ! CHECK: %[[C1:.*]] = arith.constant 1 : i64 ! CHECK: %[[IDX:.*]] = arith.subi %[[I_I64]], %[[C1]] : i64 ! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[ARG0]], %[[IDX]] : (!fir.class>>, i64) -> !fir.ref> -! CHECK: %[[TDESC:.*]] = fir.box_tdesc %[[ARG0]] : (!fir.class>>) -> !fir.tdesc ! CHECK: %[[NO_REASSOC:.*]] = fir.no_reassoc %[[COORD]] : !fir.ref> ! CHECK: %[[LOAD:.*]] = fir.load %[[NO_REASSOC]] : !fir.ref> ! CHECK: fir.store %[[LOAD]] to %[[TEMP]] : !fir.ref> -! CHECK: %[[EMBOX:.*]] = fir.embox %[[TEMP]] tdesc %[[TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[EMBOX:.*]] = fir.embox %[[TEMP]] source_box %[[ARG0]] : (!fir.ref>, !fir.class>>) -> !fir.class> ! CHECK: fir.call @_QMpolymorphic_testPtakes_p1(%[[EMBOX]]) {{.*}} : (!fir.class>) -> () ! Test pointer assignment with non polymorphic lhs and polymorphic rhs @@ -517,7 +516,6 @@ subroutine test_elemental_poly_array(p) ! CHECK-LABEL: func.func @_QMpolymorphic_testPtest_elemental_poly_array( ! CHECK-SAME: %[[P:.*]]: !fir.class>> {fir.bindc_name = "p"}) { ! CHECK: %[[C5:.*]] = arith.constant 5 : index -! CHECK: %[[TDESC:.*]] = fir.box_tdesc %[[P]] : (!fir.class>>) -> !fir.tdesc ! CHECK: %[[TMP:.*]] = fir.allocmem !fir.array<5xi32> ! CHECK: %[[SHAPE:.*]] = fir.shape %[[C5]] : (index) -> !fir.shape<1> ! CHECK: %[[ARRAY_LOAD_TMP:.*]] = fir.array_load %[[TMP]](%[[SHAPE]]) : (!fir.heap>, !fir.shape<1>) -> !fir.array<5xi32> @@ -526,8 +524,8 @@ subroutine test_elemental_poly_array(p) ! CHECK: %[[UB:.*]] = arith.subi %[[C5]], %[[C1]] : index ! CHECK: %[[LOOP_RES:.*]] = fir.do_loop %[[IND:.*]] = %[[C0]] to %[[UB]] step %[[C1]] unordered iter_args(%[[ARG:.*]] = %[[ARRAY_LOAD_TMP]]) -> (!fir.array<5xi32>) { ! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[P]], %[[IND]] : (!fir.class>>, index) -> !fir.ref> -! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD]] tdesc %[[TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> -! CHECK: %[[RES:.*]] = fir.dispatch "elemental_fct"(%[[EMBOXED]] : !fir.class>) (%15 : !fir.class>) -> i32 {pass_arg_pos = 0 : i32} +! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD]] source_box %[[P]] : (!fir.ref>, !fir.class>>) -> !fir.class> +! CHECK: %[[RES:.*]] = fir.dispatch "elemental_fct"(%[[EMBOXED]] : !fir.class>) (%[[EMBOXED]] : !fir.class>) -> i32 {pass_arg_pos = 0 : i32} ! CHECK: %[[ARR_UP:.*]] = fir.array_update %[[ARG]], %[[RES]], %[[IND]] : (!fir.array<5xi32>, i32, index) -> !fir.array<5xi32> ! CHECK: fir.result %[[ARR_UP]] : !fir.array<5xi32> ! CHECK: } @@ -547,7 +545,6 @@ subroutine test_elemental_poly_array_2d(p) ! CHECK-SAME: %[[P]]: !fir.class>> {fir.bindc_name = "p"}) { ! CHECK: %[[C5:.*]] = arith.constant 5 : index ! CHECK: %[[C5_0:.*]] = arith.constant 5 : index -! CHECK: %[[TDESC:.*]] = fir.box_tdesc %[[P]] : (!fir.class>>) -> !fir.tdesc ! CHECK: %[[TMP:.*]] = fir.allocmem !fir.array<5x5xi32> ! CHECK: %[[SHAPE:.*]] = fir.shape %[[C5]], %[[C5_0]] : (index, index) -> !fir.shape<2> ! CHECK: %[[ARRAY_LOAD_TMP:.*]] = fir.array_load %[[TMP]](%[[SHAPE]]) : (!fir.heap>, !fir.shape<2>) -> !fir.array<5x5xi32> @@ -558,8 +555,8 @@ subroutine test_elemental_poly_array_2d(p) ! CHECK: %[[LOOP_RES:.*]] = fir.do_loop %[[IND0:.*]] = %[[C0]] to %[[UB1]] step %[[C1]] unordered iter_args(%[[ARG:.*]] = %[[ARRAY_LOAD_TMP]]) -> (!fir.array<5x5xi32>) { ! CHECK: %[[LOOP_RES0:.*]] = fir.do_loop %[[IND1:.*]] = %[[C0]] to %[[UB0]] step %[[C1]] unordered iter_args(%[[ARG0:.*]] = %[[ARG]]) -> (!fir.array<5x5xi32>) { ! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[P]], %[[IND1]], %[[IND0]] : (!fir.class>>, index, index) -> !fir.ref> -! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD]] tdesc %[[TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> -! CHECK: %[[RES:.*]] = fir.dispatch "elemental_fct"(%[[EMBOXED]] : !fir.class>) (%17 : !fir.class>) -> i32 {pass_arg_pos = 0 : i32} +! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD]] source_box %[[P]] : (!fir.ref>, !fir.class>>) -> !fir.class> +! CHECK: %[[RES:.*]] = fir.dispatch "elemental_fct"(%[[EMBOXED]] : !fir.class>) (%[[EMBOXED]] : !fir.class>) -> i32 {pass_arg_pos = 0 : i32} ! CHECK: %[[ARR_UP:.*]] = fir.array_update %[[ARG0]], %[[RES]], %[[IND1]], %[[IND0]] : (!fir.array<5x5xi32>, i32, index, index) -> !fir.array<5x5xi32> ! CHECK: fir.result %[[ARR_UP]] : !fir.array<5x5xi32> ! CHECK: } @@ -607,22 +604,20 @@ subroutine test_elemental_sub_poly_array(p) ! CHECK-LABEL: func.func @_QMpolymorphic_testPtest_elemental_sub_poly_array( ! CHECK-SAME: %[[P:.*]]: !fir.class>> {fir.bindc_name = "p"}) { ! CHECK: %[[C10:.*]] = arith.constant 10 : index -! CHECK: %[[TDESC:.*]] = fir.box_tdesc %[[P]] : (!fir.class>>) -> !fir.tdesc ! CHECK: %[[C1:.*]] = arith.constant 1 : index ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[UB:.*]] = arith.subi %[[C10]], %[[C1]] : index ! CHECK: fir.do_loop %[[IND:.*]] = %[[C0]] to %[[UB]] step %[[C1]] { ! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[P]], %[[IND]] : (!fir.class>>, index) -> !fir.ref> -! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD]] tdesc %[[TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD]] source_box %[[P]] : (!fir.ref>, !fir.class>>) -> !fir.class> ! CHECK: fir.dispatch "elemental_sub"(%[[EMBOXED]] : !fir.class>) (%[[EMBOXED]] : !fir.class>) {pass_arg_pos = 0 : i32} ! CHECK: } -! CHECK: %[[TDESC:.*]] = fir.box_tdesc %[[P]] : (!fir.class>>) -> !fir.tdesc ! CHECK: %[[C1:.*]] = arith.constant 1 : index ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[UB:.*]] = arith.subi %[[C10]], %[[C1]] : index ! CHECK: fir.do_loop %[[IND:.*]] = %[[C0]] to %[[UB]] step %[[C1]] { ! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[P]], %[[IND]] : (!fir.class>>, index) -> !fir.ref> -! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD]] tdesc %[[TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD]] source_box %[[P]] : (!fir.ref>, !fir.class>>) -> !fir.class> ! CHECK: fir.dispatch "elemental_sub_pass"(%[[EMBOXED]] : !fir.class>) (%{{.*}}, %[[EMBOXED]] : !fir.ref, !fir.class>) {pass_arg_pos = 1 : i32} ! CHECK: } @@ -662,7 +657,6 @@ subroutine test_elemental_sub_poly_array_assumed(p) ! CHECK-LABEL: func.func @_QMpolymorphic_testPtest_elemental_sub_poly_array_assumed( ! CHECK-SAME: %[[P:.*]]: !fir.class>> {fir.bindc_name = "p"}) { -! CHECK: %[[TDESC:.*]] = fir.box_tdesc %[[P]] : (!fir.class>>) -> !fir.tdesc ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[P_DIMS:.*]]:3 = fir.box_dims %[[P]], %[[C0]] : (!fir.class>>, index) -> (index, index, index) ! CHECK: %[[C1:.*]] = arith.constant 1 : index @@ -670,10 +664,9 @@ subroutine test_elemental_sub_poly_array_assumed(p) ! CHECK: %[[UB:.*]] = arith.subi %[[P_DIMS]]#1, %[[C1]] : index ! CHECK: fir.do_loop %[[IND:.*]] = %[[C0]] to %[[UB]] step %[[C1]] { ! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[P]], %[[IND]] : (!fir.class>>, index) -> !fir.ref> -! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD]] tdesc %[[TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD]] source_box %[[P]] : (!fir.ref>, !fir.class>>) -> !fir.class> ! CHECK: fir.dispatch "elemental_sub"(%[[EMBOXED]] : !fir.class>) (%[[EMBOXED]] : !fir.class>) {pass_arg_pos = 0 : i32} ! CHECK: } -! CHECK: %[[TDESC:.*]] = fir.box_tdesc %[[P]] : (!fir.class>>) -> !fir.tdesc ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[P_DIMS:.*]]:3 = fir.box_dims %[[P]], %[[C0]] : (!fir.class>>, index) -> (index, index, index) ! CHECK: %[[C1:.*]] = arith.constant 1 : index @@ -681,7 +674,7 @@ subroutine test_elemental_sub_poly_array_assumed(p) ! CHECK: %[[UB:.*]] = arith.subi %[[P_DIMS]]#1, %[[C1]] : index ! CHECK: fir.do_loop %[[IND:.*]] = %[[C0]] to %[[UB]] step %[[C1]] { ! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[P]], %[[IND]] : (!fir.class>>, index) -> !fir.ref> -! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD]] tdesc %[[TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[EMBOXED:.*]] = fir.embox %[[COORD]] source_box %[[P]] : (!fir.ref>, !fir.class>>) -> !fir.class> ! CHECK: fir.dispatch "elemental_sub_pass"(%[[EMBOXED]] : !fir.class>) (%{{.*}}, %[[EMBOXED]] : !fir.ref, !fir.class>) {pass_arg_pos = 1 : i32} ! CHECK: } diff --git a/flang/test/Lower/select-type.f90 b/flang/test/Lower/select-type.f90 index 957b65652ee26..23f60cd7cc36f 100644 --- a/flang/test/Lower/select-type.f90 +++ b/flang/test/Lower/select-type.f90 @@ -153,8 +153,7 @@ subroutine select_type3(a) ! CHECK-SAME: %[[ARG0:.*]]: !fir.ref>>>> {fir.bindc_name = "a"}) ! CHECK: %[[ARG0_LOAD:.*]] = fir.load %[[ARG0]] : !fir.ref>>>> ! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[ARG0_LOAD]], %{{.*}} : (!fir.class>>>, i64) -> !fir.ref> -! CHECK: %[[TDESC:.*]] = fir.box_tdesc %[[ARG0_LOAD]] : (!fir.class>>>) -> !fir.tdesc -! CHECK: %[[SELECTOR:.*]] = fir.embox %[[COORD]] tdesc %[[TDESC]] : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CHECK: %[[SELECTOR:.*]] = fir.embox %[[COORD]] source_box %[[ARG0_LOAD]] : (!fir.ref>, !fir.class>>>) -> !fir.class> ! CHECK: fir.select_type %[[SELECTOR]] : !fir.class> ! CHECK-SAME: [#fir.type_is>, ^[[TYPE_IS_BLK:.*]], #fir.class_is>, ^[[CLASS_IS_BLK:.*]], unit, ^[[DEFAULT_BLK:.*]]] ! CHECK: ^[[TYPE_IS_BLK]] @@ -163,7 +162,7 @@ subroutine select_type3(a) ! CFG-LABEL: func.func @_QMselect_type_lower_testPselect_type3( ! CFG-SAME: %[[ARG0:.*]]: !fir.ref>>>> {fir.bindc_name = "a"}) { -! CFG: %[[SELECTOR:.*]] = fir.embox %{{.*}} tdesc %{{.*}} : (!fir.ref>, !fir.tdesc) -> !fir.class> +! CFG: %[[SELECTOR:.*]] = fir.embox %{{.*}} source_box %{{.*}} : (!fir.ref>, !fir.class<{{.*}}>) -> !fir.class> ! CFG: %[[TDESC_P1_ADDR:.*]] = fir.address_of(@_QMselect_type_lower_testE.dt.p1) : !fir.ref> ! CFG: %[[SELECTOR_TDESC:.*]] = fir.box_tdesc %[[SELECTOR]] : (!fir.class>) -> !fir.tdesc ! CFG: %[[TDESC_P1_CONV:.*]] = fir.convert %[[TDESC_P1_ADDR]] : (!fir.ref>) -> index