================ @@ -85,67 +135,227 @@ class OMPMapInfoFinalizationPass descriptor = alloca; } + return descriptor; + } + + /// Simple function that will generate a FIR operation accessing + /// the descriptors base address (BoxOffsetOp) and then generate a + /// MapInfoOp for it, the most important thing to note is that + /// we normally move the bounds from the descriptor map onto the + /// base address map. + mlir::omp::MapInfoOp getBaseAddrMap(mlir::Value descriptor, + mlir::OperandRange bounds, + int64_t mapType, + fir::FirOpBuilder &builder) { + mlir::Location loc = descriptor.getLoc(); mlir::Value baseAddrAddr = builder.create<fir::BoxOffsetOp>( loc, descriptor, fir::BoxFieldAttr::base_addr); // Member of the descriptor pointing at the allocated data - mlir::Value baseAddr = builder.create<mlir::omp::MapInfoOp>( + return builder.create<mlir::omp::MapInfoOp>( loc, baseAddrAddr.getType(), descriptor, mlir::TypeAttr::get(llvm::cast<mlir::omp::PointerLikeType>( fir::unwrapRefType(baseAddrAddr.getType())) .getElementType()), - baseAddrAddr, /*members=*/mlir::SmallVector<mlir::Value>{}, - /*member_index=*/mlir::DenseIntElementsAttr{}, op.getBounds(), - builder.getIntegerAttr(builder.getIntegerType(64, false), - op.getMapType().value()), + baseAddrAddr, mlir::SmallVector<mlir::Value>{}, + mlir::DenseIntElementsAttr{}, bounds, + builder.getIntegerAttr(builder.getIntegerType(64, false), mapType), builder.getAttr<mlir::omp::VariableCaptureKindAttr>( mlir::omp::VariableCaptureKind::ByRef), - /*name=*/builder.getStringAttr(""), - /*partial_map=*/builder.getBoolAttr(false)); + builder.getStringAttr("") /*name*/, + builder.getBoolAttr(false) /*partial_map*/); + } - // TODO: map the addendum segment of the descriptor, similarly to the - // above base address/data pointer member. + /// This function adjusts the member indices vector to include a new + /// base address member, we take the position of the descriptor in + /// the member indices list, which is the index data that the base + /// addresses index will be based off of, as the base address is + /// a member of the descriptor, we must also alter other members + /// indices in the list to account for this new addition. This + /// requires extending all members with -1's if the addition of + /// the new base address has increased the member vector past the + /// original size, as we must make sure all member indices are of + /// the same length (think rectangle matrix) due to DenseIntElementsAttr + /// requiring this. We also need to be aware that we are inserting + /// into the middle of a member index vector in some cases (i.e. + /// we could be accessing the member of a descriptor type with a + /// subsequent map, so we must be sure to adjust any of these cases + /// with the addition of the new base address index value). + void adjustMemberIndices( + llvm::SmallVector<llvm::SmallVector<int32_t>> &memberIndices, + size_t memberIndex) { + // Find if the descriptor member we are basing our new base address index + // off of has a -1 somewhere, indicating an empty index already exists (due + // to a larger sized member position elsewhere) which allows us to simplify + // later steps a little + auto baseAddrIndex = memberIndices[memberIndex]; + auto *iterPos = std::find(baseAddrIndex.begin(), baseAddrIndex.end(), -1); - if (auto mapClauseOwner = - llvm::dyn_cast<mlir::omp::MapClauseOwningOpInterface>(target)) { - llvm::SmallVector<mlir::Value> newMapOps; - mlir::OperandRange mapOperandsArr = mapClauseOwner.getMapOperands(); + // If we aren't at the end, as we found a -1, we can simply modify the -1 + // to the base addresses index in the descriptor (which will always be the + // first member in the descriptor, so 0). If not, then we're extending the + // index list and have to push on a 0 and adjust the position to the new + // end. + if (iterPos != baseAddrIndex.end()) { + *iterPos = 0; + } else { + baseAddrIndex.push_back(0); + iterPos = baseAddrIndex.end(); + } - for (size_t i = 0; i < mapOperandsArr.size(); ++i) { - if (mapOperandsArr[i] == op) { - // Push new implicit maps generated for the descriptor. - newMapOps.push_back(baseAddr); + auto isEqual = [](auto first1, auto last1, auto first2, auto last2) { ---------------- ergawy wrote:
Dejavu! Can you create a shared util of this lambda in `Utils.cpp`. The logic here is a bit involved and having a shared well-documented util would be nice. https://github.com/llvm/llvm-project/pull/96266 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits