================ @@ -3889,6 +3889,215 @@ createDeviceArgumentAccessor(MapInfoData &mapData, llvm::Argument &arg, return builder.saveIP(); } +/// Follow uses of `host_eval`-defined block arguments of the given `omp.target` +/// operation and populate output variables with their corresponding host value +/// (i.e. operand evaluated outside of the target region), based on their uses +/// inside of the target region. +/// +/// Loop bounds and steps are only optionally populated, if output vectors are +/// provided. +static void extractHostEvalClauses(omp::TargetOp targetOp, Value &numThreads, + Value &numTeamsLower, Value &numTeamsUpper, + Value &threadLimit) { + auto blockArgIface = llvm::cast<omp::BlockArgOpenMPOpInterface>(*targetOp); + for (auto item : llvm::zip_equal(targetOp.getHostEvalVars(), ---------------- skatrak wrote:
Doing a decomposition declaration for `hostEvalVar` and `blockArg`, and then capturing these values in the `TypeSwitch` lambdas below apparently triggers a [weird corner in the C++ standard](https://stackoverflow.com/questions/46114214/lambda-implicit-capture-fails-with-variable-declared-from-structured-binding) that was disallowed at one point. So, apparently we can only do this if compiling for C++20 or later. https://github.com/llvm/llvm-project/pull/116052 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits