From: Alex Zinenko Date: Fri, 7 Jan 2022 11:46:01 +0000 (+0100) Subject: [flang] update to reflect MLIR LLVM::GEPOp changes X-Git-Tag: upstream/15.0.7~21314 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=301226562b28088b112651cadf6695eba1e2ef87;p=platform%2Fupstream%2Fllvm.git [flang] update to reflect MLIR LLVM::GEPOp changes --- diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp index 6018de1..98ebda0 100644 --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -103,7 +103,7 @@ protected: genConstantOffset(loc, rewriter, boxValue); auto pty = mlir::LLVM::LLVMPointerType::get(resultTy); auto p = rewriter.create( - loc, pty, mlir::ValueRange{box, c0, cValuePos}); + loc, pty, box, mlir::ValueRange{c0, cValuePos}); return rewriter.create(loc, resultTy, p); } @@ -907,8 +907,8 @@ computeDerivedTypeSize(mlir::Location loc, mlir::Type ptrTy, mlir::Type idxTy, mlir::ConversionPatternRewriter &rewriter) { auto nullPtr = rewriter.create(loc, ptrTy); mlir::Value one = genConstantIndex(loc, idxTy, rewriter, 1); - llvm::SmallVector args{nullPtr, one}; - auto gep = rewriter.create(loc, ptrTy, args); + llvm::SmallVector args{one}; + auto gep = rewriter.create(loc, ptrTy, nullPtr, args); return rewriter.create(loc, idxTy, gep); } @@ -1564,8 +1564,8 @@ struct EmboxCommonConversion : public FIROpConversion { auto nullPtr = rewriter.create(loc, ptrTy); auto one = genConstantIndex(loc, this->lowerTy().offsetType(), rewriter, 1); - auto gep = rewriter.create( - loc, ptrTy, mlir::ValueRange{nullPtr, one}); + auto gep = rewriter.create(loc, ptrTy, nullPtr, + mlir::ValueRange{one}); auto eleSize = rewriter.create( loc, this->lowerTy().indexType(), gep); return {eleSize, @@ -1940,7 +1940,7 @@ struct XEmboxOpConversion : public EmboxCommonConversion { sliceOffset += 3; } if (hasSlice || hasSubcomp || !xbox.substr().empty()) { - llvm::SmallVector args = {base, ptrOffset}; + llvm::SmallVector args = {ptrOffset}; args.append(gepArgs.rbegin(), gepArgs.rend()); if (hasSubcomp) { // For each field in the path add the offset to base via the args list. @@ -1953,7 +1953,8 @@ struct XEmboxOpConversion : public EmboxCommonConversion { operands.begin() + xbox.subcomponentOffset() + xbox.subcomponent().size()); } - base = rewriter.create(loc, base.getType(), args); + base = + rewriter.create(loc, base.getType(), base, args); if (!xbox.substr().empty()) base = shiftSubstringBase(rewriter, loc, base, operands[xbox.substrOffset()]); @@ -2447,15 +2448,15 @@ struct XArrayCoorOpConversion loadBaseAddrFromBox(loc, baseTy, adaptor.getOperands()[0], rewriter); mlir::Type voidPtrTy = getVoidPtrType(); base = rewriter.create(loc, voidPtrTy, base); - llvm::SmallVector args{base, offset}; - auto addr = rewriter.create(loc, voidPtrTy, args); + llvm::SmallVector args{offset}; + auto addr = + rewriter.create(loc, voidPtrTy, base, args); if (coor.subcomponent().empty()) { rewriter.replaceOpWithNewOp(coor, baseTy, addr); return success(); } auto casted = rewriter.create(loc, baseTy, addr); args.clear(); - args.push_back(casted); args.push_back(zero); if (!coor.lenParams().empty()) { // If type parameters are present, then we don't want to use a GEPOp @@ -2466,7 +2467,8 @@ struct XArrayCoorOpConversion // row-major layout here. for (auto i = coor.subcomponentOffset(); i != coor.indicesOffset(); ++i) args.push_back(operands[i]); - rewriter.replaceOpWithNewOp(coor, baseTy, args); + rewriter.replaceOpWithNewOp(coor, baseTy, casted, + args); return success(); } @@ -2512,10 +2514,10 @@ struct XArrayCoorOpConversion base = rewriter.create(loc, newTy, adaptor.getOperands()[0]); } - SmallVector args = {base, offset}; + SmallVector args = {offset}; for (auto i = coor.subcomponentOffset(); i != coor.indicesOffset(); ++i) args.push_back(operands[i]); - rewriter.replaceOpWithNewOp(coor, ty, args); + rewriter.replaceOpWithNewOp(coor, ty, base, args); return success(); } }; @@ -3097,8 +3099,9 @@ private: } auto voidPtrBase = rewriter.create(loc, voidPtrTy, resultAddr); - SmallVector args{voidPtrBase, off}; - resultAddr = rewriter.create(loc, voidPtrTy, args); + SmallVector args{off}; + resultAddr = rewriter.create(loc, voidPtrTy, + voidPtrBase, args); i += arrTy.getDimension() - 1; currentObjTy = arrTy.getEleTy(); } else if (auto recTy = currentObjTy.dyn_cast()) { @@ -3107,11 +3110,12 @@ private: mlir::Value nxtOpnd = operands[i]; auto memObj = rewriter.create(loc, recRefTy, resultAddr); - llvm::SmallVector args = {memObj, c0, nxtOpnd}; + llvm::SmallVector args = {c0, nxtOpnd}; currentObjTy = recTy.getType(getFieldNumber(recTy, nxtOpnd)); auto llvmCurrentObjTy = lowerTy().convertType(currentObjTy); auto gep = rewriter.create( - loc, mlir::LLVM::LLVMPointerType::get(llvmCurrentObjTy), args); + loc, mlir::LLVM::LLVMPointerType::get(llvmCurrentObjTy), memObj, + args); resultAddr = rewriter.create(loc, voidPtrTy, gep); } else { diff --git a/flang/test/Fir/convert-to-llvm.fir b/flang/test/Fir/convert-to-llvm.fir index 669e9a3..dfbfbf8 100644 --- a/flang/test/Fir/convert-to-llvm.fir +++ b/flang/test/Fir/convert-to-llvm.fir @@ -862,8 +862,7 @@ func @extract_rank(%arg0: !fir.box>) -> i32 { // CHECK-LABEL: llvm.func @extract_rank( // CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>) -> i32 // CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[CRANK:.*]] = llvm.mlir.constant(3 : i32) : i32 -// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[CRANK]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32) -> !llvm.ptr +// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], 3] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32) -> !llvm.ptr // CHECK: %[[RANK:.*]] = llvm.load %[[GEP]] : !llvm.ptr // CHECK: llvm.return %[[RANK]] : i32 @@ -879,8 +878,7 @@ func @extract_addr(%arg0: !fir.box>) -> !fir.ref { // CHECK-LABEL: llvm.func @extract_addr( // CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>) -> !llvm.ptr // CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[CADDR:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[CADDR]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32) -> !llvm.ptr> +// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], 0] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32) -> !llvm.ptr> // CHECK: %[[ADDR:.*]] = llvm.load %[[GEP]] : !llvm.ptr> // CHECK: llvm.return %[[ADDR]] : !llvm.ptr @@ -888,27 +886,34 @@ func @extract_addr(%arg0: !fir.box>) -> !fir.ref { // Test `fir.box_dims` conversion. -func @extract_dims(%arg0: !fir.box>) -> index { - %c1 = arith.constant 0 : i32 - %0:3 = fir.box_dims %arg0, %c1 : (!fir.box>, i32) -> (index, index, index) - return %0 : index -} +// +// DISABLED TEST: +// +// The produced IR is invalid: accessing a struct with 7 elements at index 7 is out-of-bounds. +// This would trigger an assertion in either MLIR or LLVM. +// -// CHECK-LABEL: llvm.func @extract_dims( -// CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>) -> i64 -// CHECK: %[[C0_1:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[CDIMS:.*]] = llvm.mlir.constant(7 : i32) : i32 -// CHECK: %[[C0_2:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[GEP0:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[CDIMS]], %[[C0_1]], %[[C0_2]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32, i32, i32) -> !llvm.ptr -// CHECK: %[[LOAD0:.*]] = llvm.load %[[GEP0]] : !llvm.ptr -// CHECK: %[[C1:.*]] = llvm.mlir.constant(1 : i32) : i32 -// CHECK: %[[GEP1:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[CDIMS]], %[[C0_1]], %[[C1]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32, i32, i32) -> !llvm.ptr -// CHECK: %[[LOAD1:.*]] = llvm.load %[[GEP1]] : !llvm.ptr -// CHECK: %[[C2:.*]] = llvm.mlir.constant(2 : i32) : i32 -// CHECK: %[[GEP2:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[CDIMS]], %[[C0_1]], %[[C2]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32, i32, i32) -> !llvm.ptr -// CHECK: %[[LOAD2:.*]] = llvm.load %[[GEP2]] : !llvm.ptr -// CHECK: llvm.return %[[LOAD0]] : i64 +//func @extract_dims(%arg0: !fir.box>) -> index { +// %c1 = arith.constant 0 : i32 +// %0:3 = fir.box_dims %arg0, %c1 : (!fir.box>, i32) -> (index, index, index) +// return %0 : index +//} + +// _HECK-LABEL: llvm.func @extract_dims( +// _HECK-SAME: %[[ARG0:.*]]: !llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>) -> i64 +// _HECK: %[[C0_1:.*]] = llvm.mlir.constant(0 : i32) : i32 +// _HECK: %[[C0:.*]] = llvm.mlir.constant(0 : i32) : i32 +// _HECK: %[[CDIMS:.*]] = llvm.mlir.constant(7 : i32) : i32 +// _HECK: %[[C0_2:.*]] = llvm.mlir.constant(0 : i32) : i32 +// _HECK: %[[GEP0:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[CDIMS]], %[[C0_1]], %[[C0_2]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32, i32, i32) -> !llvm.ptr +// _HECK: %[[LOAD0:.*]] = llvm.load %[[GEP0]] : !llvm.ptr +// _HECK: %[[C1:.*]] = llvm.mlir.constant(1 : i32) : i32 +// _HECK: %[[GEP1:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[CDIMS]], %[[C0_1]], %[[C1]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32, i32, i32) -> !llvm.ptr +// _HECK: %[[LOAD1:.*]] = llvm.load %[[GEP1]] : !llvm.ptr +// _HECK: %[[C2:.*]] = llvm.mlir.constant(2 : i32) : i32 +// _HECK: %[[GEP2:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[CDIMS]], %[[C0_1]], %[[C2]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32, i32, i32) -> !llvm.ptr +// _HECK: %[[LOAD2:.*]] = llvm.load %[[GEP2]] : !llvm.ptr +// _HECK: llvm.return %[[LOAD0]] : i64 // ----- @@ -922,8 +927,7 @@ func @extract_elesize(%arg0: !fir.box) -> i32 { // CHECK-LABEL: llvm.func @extract_elesize( // CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>) -> i32 // CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[CELESIZE:.*]] = llvm.mlir.constant(1 : i32) : i32 -// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[CELESIZE]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32) -> !llvm.ptr +// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], 1] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32) -> !llvm.ptr // CHECK: %[[ELE_SIZE:.*]] = llvm.load %[[GEP]] : !llvm.ptr // CHECK: llvm.return %[[ELE_SIZE]] : i32 @@ -940,8 +944,7 @@ func @box_isarray(%arg0: !fir.box>) -> i1 { // CHECK-LABEL: llvm.func @box_isarray( // CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>) -> i1 // CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[RANKPOS:.*]] = llvm.mlir.constant(3 : i32) : i32 -// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[RANKPOS]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32) -> !llvm.ptr +// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], 3] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32) -> !llvm.ptr // CHECK: %[[RANK:.*]] = llvm.load %[[GEP]] : !llvm.ptr // CHECK: %[[C0_ISARRAY:.*]] = llvm.mlir.constant(0 : i32) : i32 // CHECK: %[[IS_ARRAY:.*]] = llvm.icmp "ne" %[[RANK]], %[[C0_ISARRAY]] : i32 @@ -961,8 +964,7 @@ func @box_isalloc(%arg0: !fir.box>) -> i1 { // CHECK-LABEL: llvm.func @box_isalloc( // CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>) -> i1 // CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[ATTRPOS:.*]] = llvm.mlir.constant(5 : i32) : i32 -// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[ATTRPOS]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32) -> !llvm.ptr +// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], 5] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32) -> !llvm.ptr // CHECK: %[[ATTR:.*]] = llvm.load %[[GEP]] : !llvm.ptr // CHECK: %[[ATTR_ISALLOC:.*]] = llvm.mlir.constant(2 : i32) : i32 // CHECK: %[[AND:.*]] = llvm.and %[[ATTR]], %[[ATTR_ISALLOC]] : i32 @@ -984,8 +986,7 @@ func @box_isptr(%arg0: !fir.box>) -> i1 { // CHECK-LABEL: llvm.func @box_isptr( // CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>) -> i1 // CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[ATTRPOS:.*]] = llvm.mlir.constant(5 : i32) : i32 -// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], %[[ATTRPOS]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32, i32) -> !llvm.ptr +// CHECK: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], 5] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32) -> !llvm.ptr // CHECK: %[[ATTR:.*]] = llvm.load %[[GEP]] : !llvm.ptr // CHECK: %[[ATTR_ISALLOC:.*]] = llvm.mlir.constant(1 : i32) : i32 // CHECK: %[[AND:.*]] = llvm.and %[[ATTR]], %[[ATTR_ISALLOC]] : i32 @@ -1440,8 +1441,7 @@ func @box_tdesc(%arg0: !fir.box) { // 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: %[[GEP:.*]] = llvm.getelementptr %[[ARG0]][%[[C0]], 4] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i32) -> !llvm.ptr // CHECK: %[[LOAD:.*]] = llvm.load %[[GEP]] : !llvm.ptr // CHECK: %{{.*}} = llvm.inttoptr %[[LOAD]] : i{{.*}} to !llvm.ptr @@ -1863,7 +1863,6 @@ func private @_QPtest_dt_callee(%arg0: !fir.box>) // CHECK: %[[V:.*]] = llvm.alloca %[[ALLOCA_SIZE_V]] x i32 {bindc_name = "v", in_type = i32, operand_segment_sizes = dense<0> : vector<2xi32>, uniq_name = "_QFtest_dt_sliceEv"} : (i64) -> !llvm.ptr // CHECK: %[[ALLOCA_SIZE_X:.*]] = llvm.mlir.constant(1 : i64) : i64 // CHECK: %[[X:.*]] = llvm.alloca %[[ALLOCA_SIZE_X]] x !llvm.array<20 x struct<"_QFtest_dt_sliceTt", (i32, i32)>> {bindc_name = "x", in_type = !fir.array<20x!fir.type<_QFtest_dt_sliceTt{i:i32,j:i32}>>, operand_segment_sizes = dense<0> : vector<2xi32>, uniq_name = "_QFtest_dt_sliceEx"} : (i64) -> !llvm.ptr>> -// CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i32) : i32 // CHECK: %[[BOX0:.*]] = llvm.mlir.undef : !llvm.struct<(ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)> // CHECK: %[[ELEM_LEN:.*]] = llvm.mlir.constant(4 : i32) : i32 // CHECK: %[[TYPE_CODE:.*]] = llvm.mlir.constant(9 : i32) : i32 @@ -1899,7 +1898,7 @@ func private @_QPtest_dt_callee(%arg0: !fir.box>) // CHECK: %[[BOX8:.*]] = llvm.insertvalue %[[EXT_SELECT]], %[[BOX7]][7 : i32, 0 : i32, 1 : i32] : !llvm.struct<(ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)> // CHECK: %[[STRIDE_MUL:.*]] = llvm.mul %[[PTRTOINT_DTYPE_SIZE]], %[[C2]] : i64 // CHECK: %[[BOX9:.*]] = llvm.insertvalue %[[STRIDE_MUL]], %[[BOX8]][7 : i32, 0 : i32, 2 : i32] : !llvm.struct<(ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)> -// CHECK: %[[BASE_PTR:.*]] = llvm.getelementptr %[[X]][%[[ZERO]], %[[ADJUSTED_OFFSET]], %[[C0]]] : (!llvm.ptr>>, i64, i64, i32) -> !llvm.ptr>> +// CHECK: %[[BASE_PTR:.*]] = llvm.getelementptr %[[X]][%[[ZERO]], %[[ADJUSTED_OFFSET]], 0] : (!llvm.ptr>>, i64, i64) -> !llvm.ptr>> // CHECK: %[[ADDR_BITCAST:.*]] = llvm.bitcast %[[BASE_PTR]] : !llvm.ptr>> to !llvm.ptr // CHECK: %[[BOX10:.*]] = llvm.insertvalue %[[ADDR_BITCAST]], %[[BOX9]][0 : i32] : !llvm.struct<(ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)> // CHECK: llvm.store %[[BOX10]], %[[ALLOCA]] : !llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>> @@ -1987,16 +1986,14 @@ func @ext_array_coor3(%arg0: !fir.box>) { // CHECK: %[[IDX:.*]] = llvm.sub %[[C0]], %[[C1]] : i64 // CHECK: %[[DIFF0:.*]] = llvm.mul %[[IDX]], %[[C1]] : i64 // CHECK: %[[C0_2:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[DIMPOSINBOX:.*]] = llvm.mlir.constant(7 : i32) : i32 // CHECK: %[[DIMOFFSET:.*]] = llvm.mlir.constant(0 : i64) : i64 // CHECK: %[[STRIDPOS:.*]] = llvm.mlir.constant(2 : i32) : i32 -// CHECK: %[[GEPSTRIDE:.*]] = llvm.getelementptr %[[ARG0]][%[[C0_2]], %[[DIMPOSINBOX]], %[[DIMOFFSET]], %[[STRIDPOS]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>>, i32, i32, i64, i32) -> !llvm.ptr +// CHECK: %[[GEPSTRIDE:.*]] = llvm.getelementptr %[[ARG0]][%[[C0_2]], 7, %[[DIMOFFSET]], %[[STRIDPOS]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>>, i32, i64, i32) -> !llvm.ptr // CHECK: %[[LOADEDSTRIDE:.*]] = llvm.load %[[GEPSTRIDE]] : !llvm.ptr // CHECK: %[[SC:.*]] = llvm.mul %[[DIFF0]], %[[LOADEDSTRIDE]] : i64 // CHECK: %[[OFFSET:.*]] = llvm.add %[[SC]], %[[C0_1]] : i64 // CHECK: %[[C0_3:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[ADDRPOSINBOX:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[GEPADDR:.*]] = llvm.getelementptr %[[ARG0]][%[[C0_3]], %[[ADDRPOSINBOX]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>>, i32, i32) -> !llvm.ptr> +// CHECK: %[[GEPADDR:.*]] = llvm.getelementptr %[[ARG0]][%[[C0_3]], 0] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>>, i32) -> !llvm.ptr> // CHECK: %[[LOADEDADDR:.*]] = llvm.load %[[GEPADDR]] : !llvm.ptr> // CHECK: %[[LOADEDADDRBITCAST:.*]] = llvm.bitcast %[[LOADEDADDR]] : !llvm.ptr to !llvm.ptr // CHECK: %[[GEPADDROFFSET:.*]] = llvm.getelementptr %[[LOADEDADDRBITCAST]][%[[OFFSET]]] : (!llvm.ptr, i64) -> !llvm.ptr @@ -2083,19 +2080,16 @@ func @test_rebox_1(%arg0: !fir.box>) { //CHECK: %[[RBOX_TMP6:.*]] = llvm.insertvalue %[[ADDENDUM_I8]], %[[RBOX_TMP5]][6 : i32] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> //CHECK: %[[DIM1:.*]] = llvm.mlir.constant(0 : i64) : i64 //CHECK: %[[GEP_ZERO_1:.*]] = llvm.mlir.constant(0 : i32) : i32 -//CHECK: %[[DIM_IDX_1:.*]] = llvm.mlir.constant(7 : i32) : i32 //CHECK: %[[LB1_IDX:.*]] = llvm.mlir.constant(2 : i32) : i32 -//CHECK: %[[DIM1_STRIDE_REF:.*]] = llvm.getelementptr %[[ARG0]][%[[GEP_ZERO_1]], %[[DIM_IDX_1]], %[[DIM1]], %[[LB1_IDX]]] : (!llvm.ptr, i64, i32, i8, i8, i8, i8, array<2 x array<3 x i64>>)>>, i32, i32, i64, i32) -> !llvm.ptr +//CHECK: %[[DIM1_STRIDE_REF:.*]] = llvm.getelementptr %[[ARG0]][%[[GEP_ZERO_1]], 7, %[[DIM1]], %[[LB1_IDX]]] : (!llvm.ptr, i64, i32, i8, i8, i8, i8, array<2 x array<3 x i64>>)>>, i32, i64, i32) -> !llvm.ptr //CHECK: %[[DIM1_STRIDE:.*]] = llvm.load %[[DIM1_STRIDE_REF]] : !llvm.ptr //CHECK: %[[DIM2:.*]] = llvm.mlir.constant(1 : i64) : i64 //CHECK: %[[GEP_ZERO_2:.*]] = llvm.mlir.constant(0 : i32) : i32 -//CHECK: %[[DIM_IDX_2:.*]] = llvm.mlir.constant(7 : i32) : i32 //CHECK: %[[STRIDE2_IDX:.*]] = llvm.mlir.constant(2 : i32) : i32 -//CHECK: %[[DIM2_STRIDE_REF:.*]] = llvm.getelementptr %[[ARG0]][%[[GEP_ZERO_2]], %[[DIM_IDX_2]], %[[DIM2]], %[[STRIDE2_IDX]]] : (!llvm.ptr, i64, i32, i8, i8, i8, i8, array<2 x array<3 x i64>>)>>, i32, i32, i64, i32) -> !llvm.ptr +//CHECK: %[[DIM2_STRIDE_REF:.*]] = llvm.getelementptr %[[ARG0]][%[[GEP_ZERO_2]], 7, %[[DIM2]], %[[STRIDE2_IDX]]] : (!llvm.ptr, i64, i32, i8, i8, i8, i8, array<2 x array<3 x i64>>)>>, i32, i64, i32) -> !llvm.ptr //CHECK: %[[DIM2_STRIDE:.*]] = llvm.load %[[DIM2_STRIDE_REF]] : !llvm.ptr //CHECK: %[[ZERO_1:.*]] = llvm.mlir.constant(0 : i32) : i32 -//CHECK: %[[ZERO_2:.*]] = llvm.mlir.constant(0 : i32) : i32 -//CHECK: %[[SOURCE_ARRAY_PTR:.*]] = llvm.getelementptr %[[ARG0]][%[[ZERO_1]], %[[ZERO_2]]] : (!llvm.ptr, i64, i32, i8, i8, i8, i8, array<2 x array<3 x i64>>)>>, i32, i32) -> !llvm.ptr> +//CHECK: %[[SOURCE_ARRAY_PTR:.*]] = llvm.getelementptr %[[ARG0]][%[[ZERO_1]], 0] : (!llvm.ptr, i64, i32, i8, i8, i8, i8, array<2 x array<3 x i64>>)>>, i32) -> !llvm.ptr> //CHECK: %[[SOURCE_ARRAY:.*]] = llvm.load %[[SOURCE_ARRAY_PTR]] : !llvm.ptr> //CHECK: %[[ZERO_ELEMS:.*]] = llvm.mlir.constant(0 : i64) : i64 //CHECK: %[[SOURCE_ARRAY_I8PTR:.*]] = llvm.bitcast %[[SOURCE_ARRAY]] : !llvm.ptr to !llvm.ptr @@ -2145,7 +2139,6 @@ func @foo(%arg0: !fir.box}>>>) //CHECK: %[[RESULT_STRIDE:.*]] = llvm.mlir.constant(9 : i64) : i64 //CHECK: %[[COMPONENT_OFFSET_1:.*]] = llvm.mlir.constant(1 : i64) : i64 //CHECK: %[[ELEM_SIZE:.*]] = llvm.mlir.constant(7 : i64) : i64 -//CHECK: %[[COMPONENT_OFFSET_2:.*]] = llvm.mlir.constant(1 : i32) : i32 //CHECK: %[[TYPE_CHAR:.*]] = llvm.mlir.constant(32 : i32) : i32 //CHECK: %[[RBOX_TMP1:.*]] = llvm.insertvalue %[[ELEM_SIZE]], %{{.*}}[1 : i32] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> //CHECK: %[[RBOX_TMP2:.*]] = llvm.insertvalue %{{.*}}, %[[RBOX_TMP1]][2 : i32] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> @@ -2160,17 +2153,15 @@ func @foo(%arg0: !fir.box}>>>) //CHECK: %[[RBOX_TMP6:.*]] = llvm.insertvalue %[[ADDENDUM_I8]], %[[RBOX_TMP5]][6 : i32] : !llvm.struct<(ptr, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>)> //CHECK: %[[DIM1:.*]] = llvm.mlir.constant(0 : i64) : i64 //CHECK: %[[ZERO_3:.*]] = llvm.mlir.constant(0 : i32) : i32 -//CHECK: %[[DIM_IDX:.*]] = llvm.mlir.constant(7 : i32) : i32 //CHECK: %[[STRIDE_IDX:.*]] = llvm.mlir.constant(2 : i32) : i32 -//CHECK: %[[SRC_STRIDE_PTR:.*]] = llvm.getelementptr %[[ARG0]][%[[ZERO_3]], %[[DIM_IDX]], %[[DIM1]], %[[STRIDE_IDX]]] : (!llvm.ptr)>>, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>>, i32, i32, i64, i32) -> !llvm.ptr +//CHECK: %[[SRC_STRIDE_PTR:.*]] = llvm.getelementptr %[[ARG0]][%[[ZERO_3]], 7, %[[DIM1]], %[[STRIDE_IDX]]] : (!llvm.ptr)>>, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>>, i32, i64, i32) -> !llvm.ptr //CHECK: %[[SRC_STRIDE:.*]] = llvm.load %[[SRC_STRIDE_PTR]] : !llvm.ptr //CHECK: %[[ZERO_4:.*]] = llvm.mlir.constant(0 : i32) : i32 -//CHECK: %[[ZERO_5:.*]] = llvm.mlir.constant(0 : i32) : i32 -//CHECK: %[[SRC_ARRAY_PTR:.*]] = llvm.getelementptr %[[ARG0]][%[[ZERO_4]], %[[ZERO_5]]] : (!llvm.ptr)>>, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>>, i32, i32) -> !llvm.ptr)>>> +//CHECK: %[[SRC_ARRAY_PTR:.*]] = llvm.getelementptr %[[ARG0]][%[[ZERO_4]], 0] : (!llvm.ptr)>>, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>>, i32) -> !llvm.ptr)>>> //CHECK: %[[SRC_ARRAY:.*]] = llvm.load %[[SRC_ARRAY_PTR]] : !llvm.ptr)>>> //CHECK: %[[ZERO_6:.*]] = llvm.mlir.constant(0 : i64) : i64 //CHECK: %[[SRC_CAST:.*]] = llvm.bitcast %[[SRC_ARRAY]] : !llvm.ptr)>> to !llvm.ptr)>> -//CHECK: %[[TMP_COMPONENT:.*]] = llvm.getelementptr %[[SRC_CAST]][%[[ZERO_6]], %[[COMPONENT_OFFSET_2]]] : (!llvm.ptr)>>, i64, i32) -> !llvm.ptr)>> +//CHECK: %[[TMP_COMPONENT:.*]] = llvm.getelementptr %[[SRC_CAST]][%[[ZERO_6]], 1] : (!llvm.ptr)>>, i64) -> !llvm.ptr)>> //CHECK: %[[COMPONENT:.*]] = llvm.getelementptr %[[TMP_COMPONENT]][%[[COMPONENT_OFFSET_1]]] : (!llvm.ptr)>>, i64) -> !llvm.ptr)>> //CHECK: %[[COMPONENT_CAST:.*]] = llvm.bitcast %[[COMPONENT]] : !llvm.ptr)>> to !llvm.ptr //CHECK: %[[SRC_LB:.*]] = llvm.mlir.constant(1 : i64) : i64 @@ -2200,27 +2191,29 @@ func @foo(%arg0: !fir.box}>>>) // 1. COMPLEX TYPE (`fir.complex` is a special case) // Complex type wrapped in `fir.ref` -func @coordinate_ref_complex(%arg0: !fir.ref>, %arg1: index) { - %p = fir.coordinate_of %arg0, %arg1 : (!fir.ref>, index) -> !fir.ref +func @coordinate_ref_complex(%arg0: !fir.ref>) { + %arg1 = llvm.mlir.constant(0 : i32) : i32 + %p = fir.coordinate_of %arg0, %arg1 : (!fir.ref>, i32) -> !fir.ref return } // CHECK-LABEL: llvm.func @coordinate_ref_complex // CHECK-SAME: %[[ARG0:.*]]: !llvm.ptr> -// CHECK-SAME: %[[COORDINATE:.*]]: i64) { // CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i64) : i64 -// CHECK: %{{.*}} = llvm.getelementptr %[[ARG0]][%[[C0]], %[[COORDINATE]]] : (!llvm.ptr>, i64, i64) -> !llvm.ptr +// CHECK: %{{.*}} = llvm.getelementptr %[[ARG0]][%[[C0]], 0] : (!llvm.ptr>, i64) -> !llvm.ptr // CHECK-NEXT: llvm.return +// ----- + // Complex type wrapped in `fir.box` -func @coordinate_box_complex(%arg0: !fir.box>, %arg1: index) { - %p = fir.coordinate_of %arg0, %arg1 : (!fir.box>, index) -> !fir.ref +func @coordinate_box_complex(%arg0: !fir.box>) { + %arg1 = llvm.mlir.constant(0 : i32) : i32 + %p = fir.coordinate_of %arg0, %arg1 : (!fir.box>, i32) -> !fir.ref return } // CHECK-LABEL: llvm.func @coordinate_box_complex // CHECK-SAME: %[[BOX:.*]]: !llvm.ptr>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>> -// CHECK-SAME: %[[COORDINATE:.*]]: i64) { // CHECK: %[[C0:.*]] = llvm.mlir.constant(0 : i64) : i64 -// CHECK: %{{.*}} = llvm.getelementptr %[[BOX]][%[[C0]], %[[COORDINATE]]] : (!llvm.ptr>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i64, i64) -> !llvm.ptr +// CHECK: %{{.*}} = llvm.getelementptr %[[BOX]][%[[C0]], 0] : (!llvm.ptr>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}})>>, i64) -> !llvm.ptr // CHECK-NEXT: llvm.return // ----- @@ -2239,11 +2232,10 @@ func @coordinate_box_derived_1(%arg0: !fir.box>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, ptr, array<1 x i64>)>>, i32, i32) -> !llvm.ptr>> +// CHECK: %[[DERIVED_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[C0_1]], 0] : (!llvm.ptr>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, ptr, array<1 x i64>)>>, i32) -> !llvm.ptr>> // CHECK: %[[DERIVED_VAL:.*]] = llvm.load %[[DERIVED_ADDR]] : !llvm.ptr>> // CHECK: %[[DERIVED_CAST:.*]] = llvm.bitcast %[[DERIVED_VAL]] : !llvm.ptr> to !llvm.ptr> -// CHECK: %[[SUBOBJECT_ADDR:.*]] = llvm.getelementptr %[[DERIVED_CAST]][%[[C0_3]], %[[COORDINATE]]] : (!llvm.ptr>, i64, i32) -> !llvm.ptr +// CHECK: %[[SUBOBJECT_ADDR:.*]] = llvm.getelementptr %[[DERIVED_CAST]][%[[C0_3]], 1] : (!llvm.ptr>, i64) -> !llvm.ptr // CHECK: %[[CAST_TO_I8_PTR:.*]] = llvm.bitcast %7 : !llvm.ptr to !llvm.ptr // CHECK: %{{.*}} = llvm.bitcast %[[CAST_TO_I8_PTR]] : !llvm.ptr to !llvm.ptr // CHECK-NEXT: llvm.return @@ -2262,14 +2254,13 @@ func @coordinate_box_derived_2(%arg0: !fir.box, i32)>>, i{{.*}}, i{{.*}}32, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, ptr, array<1 x i64>)>>, i32, i32) -> !llvm.ptr, i32)>>> +// CHECK: %[[DERIVED_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[C0_1]], 0] : (!llvm.ptr, i32)>>, i{{.*}}, i{{.*}}32, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, ptr, array<1 x i64>)>>, i32) -> !llvm.ptr, i32)>>> // CHECK-NEXT: %[[DERIVED_VAL:.*]] = llvm.load %[[DERIVED_ADDR]] : !llvm.ptr, i32)>>> // CHECK-NEXT: %[[DERIVED_CAST_I8_PTR:.*]] = llvm.bitcast %[[DERIVED_VAL]] : !llvm.ptr, i32)>> to !llvm.ptr, i32)>> -// CHECK-NEXT: %[[ANOTHER_DERIVED_ADDR:.*]] = llvm.getelementptr %[[DERIVED_CAST_I8_PTR]][%[[C0_3]], %[[C0_0]]] : (!llvm.ptr, i32)>>, i64, i32) -> !llvm.ptr> +// CHECK-NEXT: %[[ANOTHER_DERIVED_ADDR:.*]] = llvm.getelementptr %[[DERIVED_CAST_I8_PTR]][%[[C0_3]], 0] : (!llvm.ptr, i32)>>, i64) -> !llvm.ptr> // CHECK-NEXT: %[[ANOTHER_DERIVED_ADDR_AS_VOID_PTR:.*]] = llvm.bitcast %[[ANOTHER_DERIVED_ADDR]] : !llvm.ptr> to !llvm.ptr // CHECK-NEXT: %[[ANOTHER_DERIVED_RECAST:.*]] = llvm.bitcast %[[ANOTHER_DERIVED_ADDR_AS_VOID_PTR]] : !llvm.ptr to !llvm.ptr> -// CHECK-NEXT: %[[SUBOBJECT_ADDR:.*]] = llvm.getelementptr %[[ANOTHER_DERIVED_RECAST]][%[[C0_3]], %[[C1]]] : (!llvm.ptr>, i64, i32) -> !llvm.ptr +// CHECK-NEXT: %[[SUBOBJECT_ADDR:.*]] = llvm.getelementptr %[[ANOTHER_DERIVED_RECAST]][%[[C0_3]], 1] : (!llvm.ptr>, i64) -> !llvm.ptr // CHECK-NEXT: %[[SUBOBJECT_AS_VOID_PTR:.*]] = llvm.bitcast %[[SUBOBJECT_ADDR]] : !llvm.ptr to !llvm.ptr // CHECK-NEXT: %{{.*}} = llvm.bitcast %[[SUBOBJECT_AS_VOID_PTR]] : !llvm.ptr to !llvm.ptr // CHECK-NEXT: llvm.return @@ -2292,8 +2283,7 @@ func @coordinate_box_array_1d(%arg0: !fir.box>, %arg1: inde // CHECK-NEXT: %{{.*}} = llvm.mlir.constant(0 : i64) : i64 // There's only one box here. Its index is `0`. Generate it. // CHECK-NEXT: %[[BOX_IDX:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK-NEXT: %[[BOX_1ST_ELEM_IDX:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK-NEXT: %[[ARRAY_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX]], %[[BOX_1ST_ELEM_IDX]]] : (!llvm.ptr>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>>, i32, i32) -> !llvm.ptr>> +// CHECK: %[[ARRAY_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX]], 0] : (!llvm.ptr>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>>, i32) -> !llvm.ptr>> // CHECK-NEXT: %[[ARRAY_OBJECT:.*]] = llvm.load %[[ARRAY_ADDR]] : !llvm.ptr>> // CHECK-NEXT: %[[OFFSET_INIT:.*]] = llvm.mlir.constant(0 : i64) : i64 // Same as [[BOX_IDX]], just recreated. @@ -2304,7 +2294,7 @@ func @coordinate_box_array_1d(%arg0: !fir.box>, %arg1: inde // CHECK-NEXT: %[[DIM_1_IDX:.*]] = llvm.mlir.constant(0 : i64) : i64 // Index of the memory stride within a CFI_dim_t object // CHECK-NEXT: %[[DIM_1_MEM_STRIDE:.*]] = llvm.mlir.constant(2 : i32) : i32 -// CHECK-NEXT: %[[DIM_1_MEM_STRIDE_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX_1]], %[[CFI_DIM_IDX]], %[[DIM_1_IDX]], %[[DIM_1_MEM_STRIDE]]] : (!llvm.ptr>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>>, i32, i32, i64, i32) -> !llvm.ptr +// CHECK-NEXT: %[[DIM_1_MEM_STRIDE_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX_1]], 7, %[[DIM_1_IDX]], %[[DIM_1_MEM_STRIDE]]] : (!llvm.ptr>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>>, i32, i64, i32) -> !llvm.ptr // CHECK-NEXT: %[[DIM_1_MEM_STRIDE_VAL:.*]] = llvm.load %[[DIM_1_MEM_STRIDE_ADDR]] : !llvm.ptr // CHECK-NEXT: %[[BYTE_OFFSET:.*]] = llvm.mul %[[COORDINATE]], %[[DIM_1_MEM_STRIDE_VAL]] : i64 // CHECK-NEXT: %[[SUBOJECT_OFFSET:.*]] = llvm.add %[[BYTE_OFFSET]], %[[OFFSET_INIT]] : i64 @@ -2325,7 +2315,7 @@ func @coordinate_of_box_dynamic_array_1d(%arg0: !fir.box>, % // There's only one box here. Its index is `0`. Generate it. // CHECK-NEXT: %[[BOX_IDX:.*]] = llvm.mlir.constant(0 : i32) : i32 // CHECK-NEXT: %[[BOX_1ST_ELEM_IDX:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK-NEXT: %[[ARRAY_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX]], %[[BOX_1ST_ELEM_IDX]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>>, i32, i32) -> !llvm.ptr> +// CHECK-NEXT: %[[ARRAY_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX]], 0] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>>, i32) -> !llvm.ptr> // CHECK-NEXT: %[[ARRAY_OBJECT:.*]] = llvm.load %[[ARRAY_ADDR]] : !llvm.ptr> // CHECK-NEXT: %[[OFFSET_INIT:.*]] = llvm.mlir.constant(0 : i64) : i64 // Same as [[BOX_IDX]], just recreated. @@ -2336,7 +2326,7 @@ func @coordinate_of_box_dynamic_array_1d(%arg0: !fir.box>, % // CHECK-NEXT: %[[DIM_1_IDX:.*]] = llvm.mlir.constant(0 : i64) : i64 // Index of the memory stride within a CFI_dim_t object // CHECK-NEXT: %[[DIM_1_MEM_STRIDE:.*]] = llvm.mlir.constant(2 : i32) : i32 -// CHECK-NEXT: %[[DIM_1_MEM_STRIDE_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX_1]], %[[CFI_DIM_IDX]], %[[DIM_1_IDX]], %[[DIM_1_MEM_STRIDE]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>>, i32, i32, i64, i32) -> !llvm.ptr +// CHECK-NEXT: %[[DIM_1_MEM_STRIDE_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX_1]], 7, %[[DIM_1_IDX]], %[[DIM_1_MEM_STRIDE]]] : (!llvm.ptr, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<1 x array<3 x i64>>)>>, i32, i64, i32) -> !llvm.ptr // CHECK-NEXT: %[[DIM_1_MEM_STRIDE_VAL:.*]] = llvm.load %[[DIM_1_MEM_STRIDE_ADDR]] : !llvm.ptr // CHECK-NEXT: %[[BYTE_OFFSET:.*]] = llvm.mul %[[COORDINATE]], %[[DIM_1_MEM_STRIDE_VAL]] : i64 // CHECK-NEXT: %[[SUBOJECT_OFFSET:.*]] = llvm.add %[[BYTE_OFFSET]], %[[OFFSET_INIT]] : i64 @@ -2345,6 +2335,8 @@ func @coordinate_of_box_dynamic_array_1d(%arg0: !fir.box>, % // CHECK-NEXT: %[[RETURN_VAL:.*]] = llvm.bitcast %[[SUBOBJECT_ADDR]] : !llvm.ptr to !llvm.ptr // CHECK-NEXT: llvm.return +// ----- + // `fir.array` inside a `fir.box` (2d) func @coordinate_box_array_2d(%arg0: !fir.box>, %arg1: index, %arg2: index) { %p = fir.coordinate_of %arg0, %arg1, %arg2 : (!fir.box>, index, index) -> !fir.ref @@ -2357,7 +2349,7 @@ func @coordinate_box_array_2d(%arg0: !fir.box>, %arg1: // There's only one box here. Its index is `0`. Generate it. // CHECK-NEXT: %[[BOX_IDX:.*]] = llvm.mlir.constant(0 : i32) : i32 // CHECK-NEXT: %[[BOX_1ST_ELEM_IDX:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK-NEXT: %[[ARRAY_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX]], %[[BOX_1ST_ELEM_IDX]]] : (!llvm.ptr>>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<2 x array<3 x i64>>)>>, i32, i32) -> !llvm.ptr>>> +// CHECK-NEXT: %[[ARRAY_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX]], 0] : (!llvm.ptr>>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<2 x array<3 x i64>>)>>, i32) -> !llvm.ptr>>> // CHECK-NEXT: %[[ARRAY_OBJECT:.*]] = llvm.load %[[ARRAY_ADDR]] : !llvm.ptr>>> // CHECK-NEXT: %[[OFFSET_INIT:.*]] = llvm.mlir.constant(0 : i64) : i64 // Same as [[BOX_IDX]], just recreated. @@ -2368,7 +2360,7 @@ func @coordinate_box_array_2d(%arg0: !fir.box>, %arg1: // CHECK-NEXT: %[[DIM_1_IDX:.*]] = llvm.mlir.constant(0 : i64) : i64 // Index of the memory stride within a CFI_dim_t object // CHECK-NEXT: %[[DIM_1_MEM_STRIDE:.*]] = llvm.mlir.constant(2 : i32) : i32 -// CHECK-NEXT: %[[DIM_1_MEM_STRIDE_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX_1]], %[[CFI_DIM_IDX]], %[[DIM_1_IDX]], %[[DIM_1_MEM_STRIDE]]] : (!llvm.ptr>>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<2 x array<3 x i64>>)>>, i32, i32, i64, i32) -> !llvm.ptr +// CHECK-NEXT: %[[DIM_1_MEM_STRIDE_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX_1]], 7, %[[DIM_1_IDX]], %[[DIM_1_MEM_STRIDE]]] : (!llvm.ptr>>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<2 x array<3 x i64>>)>>, i32, i64, i32) -> !llvm.ptr // CHECK-NEXT: %[[DIM_1_MEM_STRIDE_VAL:.*]] = llvm.load %[[DIM_1_MEM_STRIDE_ADDR]] : !llvm.ptr // CHECK-NEXT: %[[BYTE_OFFSET_1:.*]] = llvm.mul %[[COORDINATE_1]], %[[DIM_1_MEM_STRIDE_VAL]] : i64 // CHECK-NEXT: %[[SUBOBJECT_OFFSET_1:.*]] = llvm.add %[[BYTE_OFFSET]], %[[OFFSET_INIT]] : i64 @@ -2380,7 +2372,7 @@ func @coordinate_box_array_2d(%arg0: !fir.box>, %arg1: // CHECK-NEXT: %[[DIM_2_IDX:.*]] = llvm.mlir.constant(1 : i64) : i64 // Index of the memory stride within a CFI_dim_t object // CHECK-NEXT: %[[DIM_2_MEM_STRIDE:.*]] = llvm.mlir.constant(2 : i32) : i32 -// CHECK-NEXT: %[[DIM_2_MEM_STRIDE_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX_2]], %[[CFI_DIM_IDX_1]], %[[DIM_2_IDX]], %[[DIM_2_MEM_STRIDE]]] : (!llvm.ptr>>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<2 x array<3 x i64>>)>>, i32, i32, i64, i32) -> !llvm.ptr +// CHECK-NEXT: %[[DIM_2_MEM_STRIDE_ADDR:.*]] = llvm.getelementptr %[[BOX]][%[[BOX_IDX_2]], 7, %[[DIM_2_IDX]], %[[DIM_2_MEM_STRIDE]]] : (!llvm.ptr>>, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, i{{.*}}, array<2 x array<3 x i64>>)>>, i32, i64, i32) -> !llvm.ptr // CHECK-NEXT: %[[DIM_2_MEM_STRIDE_VAL:.*]] = llvm.load %[[DIM_2_MEM_STRIDE_ADDR]] : !llvm.ptr // CHECK-NEXT: %[[BYTE_OFFSET_2:.*]] = llvm.mul %[[COORDINATE_2]], %[[DIM_2_MEM_STRIDE_VAL]] : i64 // CHECK-NEXT: %[[SUBOBJECT_OFFSET_2:.*]] = llvm.add %[[BYTE_OFFSET_2]], %[[SUBOBJECT_OFFSET_1]] : i64 @@ -2402,25 +2394,23 @@ func @coordinate_box_derived_inside_array(%arg0: !fir.box>>, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>>, // CHECK-SAME: %[[COORDINATE_1:.*]]: i64) { -// CHECK: %[[COORDINATE_2:.*]] = llvm.mlir.constant(1 : i32) : i32 // CHECK: %[[VAL_3:.*]] = llvm.mlir.constant(0 : i64) : i64 // CHECK: %[[VAL_4:.*]] = llvm.mlir.constant(0 : i32) : i32 // CHECK: %[[VAL_5:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[VAL_6:.*]] = llvm.getelementptr %[[BOX]]{{\[}}%[[VAL_4]], %[[VAL_5]]] : (!llvm.ptr>>, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>>, i32, i32) -> !llvm.ptr>>> +// CHECK: %[[VAL_6:.*]] = llvm.getelementptr %[[BOX]]{{\[}}%[[VAL_4]], 0] : (!llvm.ptr>>, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>>, i32) -> !llvm.ptr>>> // CHECK: %[[ARRAY:.*]] = llvm.load %[[VAL_6]] : !llvm.ptr>>> // CHECK: %[[VAL_8:.*]] = llvm.mlir.constant(0 : i64) : i64 // CHECK: %[[VAL_9:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[CFI_DIM_IDX:.*]] = llvm.mlir.constant(7 : i32) : i32 // CHECK: %[[DIM_IDX:.*]] = llvm.mlir.constant(0 : i64) : i64 // CHECK: %[[DIM_MEM_STRIDE:.*]] = llvm.mlir.constant(2 : i32) : i32 -// CHECK: %[[VAL_13:.*]] = llvm.getelementptr %[[BOX]][%[[VAL_9]], %[[CFI_DIM_IDX]], %[[DIM_IDX]], %[[DIM_MEM_STRIDE]]] : (!llvm.ptr>>, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>>, i32, i32, i64, i32) -> !llvm.ptr +// CHECK: %[[VAL_13:.*]] = llvm.getelementptr %[[BOX]][%[[VAL_9]], 7, %[[DIM_IDX]], %[[DIM_MEM_STRIDE]]] : (!llvm.ptr>>, i64, i32, i8, i8, i8, i8, array<1 x array<3 x i64>>, ptr, array<1 x i64>)>>, i32, i64, i32) -> !llvm.ptr // CHECK: %[[VAL_14:.*]] = llvm.load %[[VAL_13]] : !llvm.ptr // CHECK: %[[VAL_15:.*]] = llvm.mul %[[COORDINATE_1]], %[[VAL_14]] : i64 // CHECK: %[[OFFSET:.*]] = llvm.add %[[VAL_15]], %[[VAL_8]] : i64 // CHECK: %[[VAL_17:.*]] = llvm.bitcast %[[ARRAY]] : !llvm.ptr>> to !llvm.ptr // CHECK: %[[VAL_18:.*]] = llvm.getelementptr %[[VAL_17]][%[[OFFSET]]] : (!llvm.ptr, i64) -> !llvm.ptr // CHECK: %[[DERIVED:.*]] = llvm.bitcast %[[VAL_18]] : !llvm.ptr to !llvm.ptr> -// CHECK: %[[VAL_20:.*]] = llvm.getelementptr %[[DERIVED]][%[[VAL_3]], %[[COORDINATE_2]]] : (!llvm.ptr>, i64, i32) -> !llvm.ptr +// CHECK: %[[VAL_20:.*]] = llvm.getelementptr %[[DERIVED]][%[[VAL_3]], 1] : (!llvm.ptr>, i64) -> !llvm.ptr // CHECK: %[[VAL_21:.*]] = llvm.bitcast %[[VAL_20]] : !llvm.ptr to !llvm.ptr // CHECK: %[[VAL_22:.*]] = llvm.bitcast %[[VAL_21]] : !llvm.ptr to !llvm.ptr // CHECK: llvm.return @@ -2441,6 +2431,8 @@ func @coordinate_array_unknown_size_1d(%arg0: !fir.ref>, %ar // CHECK: llvm.return // CHECK: } +// ----- + func @coordinate_array_known_size_1d(%arg0: !fir.ref>, %arg1 : index) { %q = fir.coordinate_of %arg0, %arg1 : (!fir.ref>, index) -> !fir.ref return @@ -2453,6 +2445,8 @@ func @coordinate_array_known_size_1d(%arg0: !fir.ref>, %arg // CHECK: llvm.return // CHECK: } +// ----- + func @coordinate_array_known_size_2d(%arg0: !fir.ref>, %arg1 : index, %arg2 : index) { %q = fir.coordinate_of %arg0, %arg1, %arg2 : (!fir.ref>, index, index) -> !fir.ref return @@ -2466,6 +2460,8 @@ func @coordinate_array_known_size_2d(%arg0: !fir.ref>, // CHECK: llvm.return // CHECK: } +// ----- + // 5.2. `fir.derived` func @coordinate_ref_derived(%arg0: !fir.ref>) { %idx = fir.field_index field_2, !fir.type @@ -2474,12 +2470,13 @@ func @coordinate_ref_derived(%arg0: !fir.ref>) { -// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(1 : i32) : i32 // CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i64) : i64 -// CHECK: %[[VAL_3:.*]] = llvm.getelementptr %[[VAL_0]]{{\[}}%[[VAL_2]], %[[VAL_1]]] : (!llvm.ptr>, i64, i32) -> !llvm.ptr +// CHECK: %[[VAL_3:.*]] = llvm.getelementptr %[[VAL_0]]{{\[}}%[[VAL_2]], 1] : (!llvm.ptr>, i64) -> !llvm.ptr // CHECK: llvm.return // CHECK: } +// ----- + func @coordinate_ref_derived_nested(%arg0: !fir.ref, field_2:i32}>>) { %idx0 = fir.field_index field_1, !fir.type, field_2:i32}> %idx1 = fir.field_index inner2, !fir.type @@ -2488,13 +2485,13 @@ func @coordinate_ref_derived_nested(%arg0: !fir.ref, i32)>>) { -// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(0 : i32) : i32 -// CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(1 : i32) : i32 // CHECK: %[[VAL_3:.*]] = llvm.mlir.constant(0 : i64) : i64 -// CHECK: %[[VAL_4:.*]] = llvm.getelementptr %[[VAL_0]]{{\[}}%[[VAL_3]], %[[VAL_1]], %[[VAL_2]]] : (!llvm.ptr, i32)>>, i64, i32, i32) -> !llvm.ptr +// CHECK: %[[VAL_4:.*]] = llvm.getelementptr %[[VAL_0]]{{\[}}%[[VAL_3]], 0, 1] : (!llvm.ptr, i32)>>, i64) -> !llvm.ptr // CHECK: llvm.return // CHECK: } +// ----- + // 5.3 `fir.char` func @test_coordinate_of_char(%arr : !fir.ref>) { %1 = arith.constant 10 : i32 @@ -2508,17 +2505,18 @@ func @test_coordinate_of_char(%arr : !fir.ref>) { // CHECK: llvm.return // CHECK: } +// ----- + // 5.4 `mlir.tuple` func @test_coordinate_of_tuple(%tup : !fir.ref>>) { - %1 = arith.constant 0 : i64 - %2 = fir.coordinate_of %tup, %1 : (!fir.ref>>, i64) -> !fir.ref + %1 = arith.constant 0 : i32 + %2 = fir.coordinate_of %tup, %1 : (!fir.ref>>, i32) -> !fir.ref return } // CHECK-LABEL: llvm.func @test_coordinate_of_tuple( // CHECK-SAME: %[[VAL_0:.*]]: !llvm.ptr)>>) { -// CHECK: %[[VAL_1:.*]] = llvm.mlir.constant(0 : i64) : i64 // CHECK: %[[VAL_2:.*]] = llvm.mlir.constant(0 : i64) : i64 -// CHECK: %[[VAL_3:.*]] = llvm.getelementptr %[[VAL_0]]{{\[}}%[[VAL_2]], %[[VAL_1]]] : (!llvm.ptr)>>, i64, i64) -> !llvm.ptr +// CHECK: %[[VAL_3:.*]] = llvm.getelementptr %[[VAL_0]]{{\[}}%[[VAL_2]], 0] : (!llvm.ptr)>>, i64) -> !llvm.ptr // CHECK: llvm.return // CHECK: }