cchen updated this revision to Diff 233869. cchen added a comment. Remove debug code and some redundancy
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D71475/new/ https://reviews.llvm.org/D71475 Files: clang/lib/Sema/SemaOpenMP.cpp clang/test/OpenMP/parallel_for_linear_codegen.cpp Index: clang/test/OpenMP/parallel_for_linear_codegen.cpp =================================================================== --- clang/test/OpenMP/parallel_for_linear_codegen.cpp +++ clang/test/OpenMP/parallel_for_linear_codegen.cpp @@ -28,6 +28,19 @@ float f; char cnt; +int a[100]; + +int foo (int i, int k) +{ +#pragma omp parallel for linear (i: k + 1) + for (int j = 16; j < 64; j++) + { + a[i] = j; + i += 4; + } + return i; +} + // CHECK: [[S_FLOAT_TY:%.+]] = type { float } // CHECK: [[S_INT_TY:%.+]] = type { i32 } // CHECK-DAG: [[F:@.+]] = global float 0.0 Index: clang/lib/Sema/SemaOpenMP.cpp =================================================================== --- clang/lib/Sema/SemaOpenMP.cpp +++ clang/lib/Sema/SemaOpenMP.cpp @@ -4404,6 +4404,32 @@ } } +namespace { +class LinearStepVarChecker : public StmtVisitor<LinearStepVarChecker, bool> { + llvm::SmallVector<Expr *, 4> ImplicitFirstprivate; +public: + bool VisitDeclRefExpr(DeclRefExpr *E) { + if (auto *VD = dyn_cast<VarDecl>(E->getDecl())) { + ImplicitFirstprivate.push_back(cast<Expr>(E)); + return true; + } + return false; + } + bool VisitStmt(Stmt *S) { + for (Stmt *Child : S->children()) { + if (Child && Visit(Child)) + return true; + } + return false; + } + ArrayRef<Expr *> getImplicitFirstprivate() const { + return ImplicitFirstprivate; + } + + explicit LinearStepVarChecker() {} +}; +} // namespace + StmtResult Sema::ActOnOpenMPExecutableDirective( OpenMPDirectiveKind Kind, const DeclarationNameInfo &DirName, OpenMPDirectiveKind CancelRegion, ArrayRef<OMPClause *> Clauses, @@ -4460,6 +4486,17 @@ for (Expr *E : IRC->taskgroup_descriptors()) if (E) ImplicitFirstprivates.emplace_back(E); + } else if (auto *LC = dyn_cast<OMPLinearClause>(C)) { + Expr *E = LC->getStep(); + if (E) { + LinearStepVarChecker LSVChecker; + LSVChecker.Visit(E); + ArrayRef<Expr *> LinearVars = LSVChecker.getImplicitFirstprivate(); + ImplicitFirstprivates.insert( + ImplicitFirstprivates.end(), + std::make_move_iterator(LinearVars.begin()), + std::make_move_iterator(LinearVars.end())); + } } } if (!ImplicitFirstprivates.empty()) {
Index: clang/test/OpenMP/parallel_for_linear_codegen.cpp =================================================================== --- clang/test/OpenMP/parallel_for_linear_codegen.cpp +++ clang/test/OpenMP/parallel_for_linear_codegen.cpp @@ -28,6 +28,19 @@ float f; char cnt; +int a[100]; + +int foo (int i, int k) +{ +#pragma omp parallel for linear (i: k + 1) + for (int j = 16; j < 64; j++) + { + a[i] = j; + i += 4; + } + return i; +} + // CHECK: [[S_FLOAT_TY:%.+]] = type { float } // CHECK: [[S_INT_TY:%.+]] = type { i32 } // CHECK-DAG: [[F:@.+]] = global float 0.0 Index: clang/lib/Sema/SemaOpenMP.cpp =================================================================== --- clang/lib/Sema/SemaOpenMP.cpp +++ clang/lib/Sema/SemaOpenMP.cpp @@ -4404,6 +4404,32 @@ } } +namespace { +class LinearStepVarChecker : public StmtVisitor<LinearStepVarChecker, bool> { + llvm::SmallVector<Expr *, 4> ImplicitFirstprivate; +public: + bool VisitDeclRefExpr(DeclRefExpr *E) { + if (auto *VD = dyn_cast<VarDecl>(E->getDecl())) { + ImplicitFirstprivate.push_back(cast<Expr>(E)); + return true; + } + return false; + } + bool VisitStmt(Stmt *S) { + for (Stmt *Child : S->children()) { + if (Child && Visit(Child)) + return true; + } + return false; + } + ArrayRef<Expr *> getImplicitFirstprivate() const { + return ImplicitFirstprivate; + } + + explicit LinearStepVarChecker() {} +}; +} // namespace + StmtResult Sema::ActOnOpenMPExecutableDirective( OpenMPDirectiveKind Kind, const DeclarationNameInfo &DirName, OpenMPDirectiveKind CancelRegion, ArrayRef<OMPClause *> Clauses, @@ -4460,6 +4486,17 @@ for (Expr *E : IRC->taskgroup_descriptors()) if (E) ImplicitFirstprivates.emplace_back(E); + } else if (auto *LC = dyn_cast<OMPLinearClause>(C)) { + Expr *E = LC->getStep(); + if (E) { + LinearStepVarChecker LSVChecker; + LSVChecker.Visit(E); + ArrayRef<Expr *> LinearVars = LSVChecker.getImplicitFirstprivate(); + ImplicitFirstprivates.insert( + ImplicitFirstprivates.end(), + std::make_move_iterator(LinearVars.begin()), + std::make_move_iterator(LinearVars.end())); + } } } if (!ImplicitFirstprivates.empty()) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits