================ @@ -14189,10 +14196,49 @@ StmtResult SemaOpenMP::ActOnOpenMPTargetTeamsDistributeSimdDirective( getASTContext(), StartLoc, EndLoc, NestedLoopCount, Clauses, AStmt, B); } +/// Overloaded base case function +template <typename T, typename F> static bool tryHandleAs(T *t, F &&) { + return false; +} + +/// +/// Tries to recursively cast `t` to one of the given types and invokes `f` if +/// successful. +/// +/// @tparam Class The first type to check. +/// @tparam Rest The remaining types to check. +/// @tparam T The base type of `t`. +/// @tparam F The callable type for the function to invoke upon a successful +/// cast. +/// @param t The object to be checked. +/// @param f The function to invoke if `t` matches `Class`. +/// @return `true` if `t` matched any type and `f` was called, otherwise +/// `false`. +template <typename Class, typename... Rest, typename T, typename F> +static bool tryHandleAs(T *t, F &&f) { + if (Class *c = dyn_cast<Class>(t)) { + f(c); + return true; + } + return tryHandleAs<Rest...>(t, std::forward<F>(f)); +} + +/// Updates OriginalInits by checking Transform against loop transformation +/// directives and appending their pre-inits if a match is found. +static void updatePreInits(OMPLoopBasedDirective *Transform, + SmallVectorImpl<SmallVector<Stmt *>> &PreInits) { + if (!tryHandleAs<OMPTileDirective, OMPUnrollDirective, OMPReverseDirective, + OMPInterchangeDirective, OMPFuseDirective>( + Transform, [&PreInits](auto *Dir) { + appendFlattenedStmtList(PreInits.back(), Dir->getPreInits()); + })) + llvm_unreachable("Unhandled loop transformation"); +} + bool SemaOpenMP::checkTransformableLoopNest( OpenMPDirectiveKind Kind, Stmt *AStmt, int NumLoops, SmallVectorImpl<OMPLoopBasedDirective::HelperExprs> &LoopHelpers, - Stmt *&Body, SmallVectorImpl<SmallVector<Stmt *, 0>> &OriginalInits) { ---------------- eZWALT wrote:
The same i told you before in the other comment, i refactored it to match the suggestion of alexey. https://github.com/llvm/llvm-project/pull/139293 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits