Loading clang/lib/CodeGen/CGKokkos.cpp +32 −24 Original line number Diff line number Diff line Loading @@ -191,19 +191,37 @@ bool CodeGenFunction::EmitKokkosConstruct(const CallExpr *CE, } // hidden/local namespace const ParmVarDecl* std::vector<const ParmVarDecl*> CodeGenFunction::EmitKokkosParallelForInductionVar(const LambdaExpr *Lambda) { const CXXMethodDecl *MD = Lambda->getCallOperator(); assert(MD && "EmitKokkosParallelFor() -- bad method decl from labmda call."); const ParmVarDecl *InductionVarDecl = MD->getParamDecl(0); /*const ParmVarDecl *InductionVarDecl = MD->getParamDecl(0); assert(InductionVarDecl && "EmitKokkosParallelFor() -- bad loop variable decl!"); printf("PARAM COUNT: %d\n\n", MD->getNumParams()); EmitVarDecl(*InductionVarDecl); Address Addr = GetAddrOfLocalVar(InductionVarDecl); llvm::Value *Zero = llvm::ConstantInt::get(ConvertType(InductionVarDecl->getType()), 0); Builder.CreateStore(Zero, Addr); return InductionVarDecl; return InductionVarDecl;*/ std::vector<const ParmVarDecl*> params; for (int i = 0; i<MD->getNumParams(); i++) { const ParmVarDecl *InductionVarDecl = MD->getParamDecl(i); assert(InductionVarDecl && "EmitKokkosParallelFor() -- bad loop variable decl!"); EmitVarDecl(*InductionVarDecl); Address Addr = GetAddrOfLocalVar(InductionVarDecl); llvm::Value *Zero = llvm::ConstantInt::get(ConvertType(InductionVarDecl->getType()), 0); Builder.CreateStore(Zero, Addr); params.push_back(InductionVarDecl); } return params; } void CodeGenFunction::EmitKokkosParallelForCond(const Expr *BoundsExpr, Loading Loading @@ -275,20 +293,6 @@ bool CodeGenFunction::EmitKokkosParallelFor(const CallExpr *CE, return false; } // Handle a potential multi-dimensional array /*if (BE->getStmtClass() == Expr::CXXTemporaryObjectExprClass) { const CXXTemporaryObjectExpr *CXXTO = dyn_cast<CXXTemporaryObjectExpr>(BE); const InitListExpr *UpperBounds = dyn_cast<InitListExpr>(CXXTO->getArg(1)->IgnoreImplicit()); // Create a multiply statement to computer the proper upper bound const Expr *lval = UpperBounds->getInit(0)->IgnoreImplicit(); const Expr *rval = UpperBounds->getInit(1)->IgnoreImplicit(); llvm::Value *lvalue = EmitScalarExpr(lval); llvm::Value *rvalue = EmitScalarExpr(rval); BE = Builder.CreateMul(lvalue, rvalue); }*/ // Create all jump destinations and basic blocks in the order they // appear in the IR. JumpDest Condition = getJumpDestInCurrentScope("kokkos.forall.cond"); Loading Loading @@ -319,8 +323,9 @@ bool CodeGenFunction::EmitKokkosParallelFor(const CallExpr *CE, // // TODO: Do we need to "relax" these assumptions to support broader code coverage? // This is 'equivalent' to the Init statement in a traditional for loop (e.g. int i = 0). const ParmVarDecl *InductionVarDecl; InductionVarDecl = EmitKokkosParallelForInductionVar(Lambda); /*const ParmVarDecl *InductionVarDecl; InductionVarDecl = EmitKokkosParallelForInductionVar(Lambda);*/ std::vector<const ParmVarDecl*> params = EmitKokkosParallelForInductionVar(Lambda); // Create the sync region. PushSyncRegion(); Loading @@ -343,6 +348,7 @@ bool CodeGenFunction::EmitKokkosParallelFor(const CallExpr *CE, LexicalScope ConditionScope(*this, R); // Create the conditional. const ParmVarDecl *InductionVarDecl = params.at(0); EmitKokkosParallelForCond(BE, InductionVarDecl, Detach, End, Sync); if (PForScope.requiresCleanups()) { Loading Loading @@ -403,10 +409,12 @@ bool CodeGenFunction::EmitKokkosParallelFor(const CallExpr *CE, Builder.CreateReattach(Increment, SRStart); EmitBlock(Increment); llvm::Value *IncVal = Builder.CreateLoad(GetAddrOfLocalVar(InductionVarDecl)); llvm::Value *One = llvm::ConstantInt::get(ConvertType(InductionVarDecl->getType()), 1); for (const ParmVarDecl* IVD : params) { llvm::Value *IncVal = Builder.CreateLoad(GetAddrOfLocalVar(IVD)); llvm::Value *One = llvm::ConstantInt::get(ConvertType(IVD->getType()), 1); IncVal = Builder.CreateAdd(IncVal, One); Builder.CreateStore(IncVal, GetAddrOfLocalVar(InductionVarDecl)); Builder.CreateStore(IncVal, GetAddrOfLocalVar(IVD)); } BreakContinueStack.pop_back(); ConditionScope.ForceCleanup(); Loading clang/lib/CodeGen/CodeGenFunction.h +1 −1 Original line number Diff line number Diff line Loading @@ -3520,7 +3520,7 @@ public: // Kitsune support for Kokkos. bool EmitKokkosConstruct(const CallExpr *CE, ArrayRef<const Attr *> Attrs = ArrayRef<const Attr *>()); const ParmVarDecl *EmitKokkosParallelForInductionVar(const LambdaExpr* Lambda); std::vector<const ParmVarDecl*> EmitKokkosParallelForInductionVar(const LambdaExpr* Lambda); void EmitKokkosParallelForCond(const Expr *BoundsExpr, const ParmVarDecl *LoopVar, llvm::BasicBlock *DetachBlock, llvm::BasicBlock *ExitBlock, Loading Loading
clang/lib/CodeGen/CGKokkos.cpp +32 −24 Original line number Diff line number Diff line Loading @@ -191,19 +191,37 @@ bool CodeGenFunction::EmitKokkosConstruct(const CallExpr *CE, } // hidden/local namespace const ParmVarDecl* std::vector<const ParmVarDecl*> CodeGenFunction::EmitKokkosParallelForInductionVar(const LambdaExpr *Lambda) { const CXXMethodDecl *MD = Lambda->getCallOperator(); assert(MD && "EmitKokkosParallelFor() -- bad method decl from labmda call."); const ParmVarDecl *InductionVarDecl = MD->getParamDecl(0); /*const ParmVarDecl *InductionVarDecl = MD->getParamDecl(0); assert(InductionVarDecl && "EmitKokkosParallelFor() -- bad loop variable decl!"); printf("PARAM COUNT: %d\n\n", MD->getNumParams()); EmitVarDecl(*InductionVarDecl); Address Addr = GetAddrOfLocalVar(InductionVarDecl); llvm::Value *Zero = llvm::ConstantInt::get(ConvertType(InductionVarDecl->getType()), 0); Builder.CreateStore(Zero, Addr); return InductionVarDecl; return InductionVarDecl;*/ std::vector<const ParmVarDecl*> params; for (int i = 0; i<MD->getNumParams(); i++) { const ParmVarDecl *InductionVarDecl = MD->getParamDecl(i); assert(InductionVarDecl && "EmitKokkosParallelFor() -- bad loop variable decl!"); EmitVarDecl(*InductionVarDecl); Address Addr = GetAddrOfLocalVar(InductionVarDecl); llvm::Value *Zero = llvm::ConstantInt::get(ConvertType(InductionVarDecl->getType()), 0); Builder.CreateStore(Zero, Addr); params.push_back(InductionVarDecl); } return params; } void CodeGenFunction::EmitKokkosParallelForCond(const Expr *BoundsExpr, Loading Loading @@ -275,20 +293,6 @@ bool CodeGenFunction::EmitKokkosParallelFor(const CallExpr *CE, return false; } // Handle a potential multi-dimensional array /*if (BE->getStmtClass() == Expr::CXXTemporaryObjectExprClass) { const CXXTemporaryObjectExpr *CXXTO = dyn_cast<CXXTemporaryObjectExpr>(BE); const InitListExpr *UpperBounds = dyn_cast<InitListExpr>(CXXTO->getArg(1)->IgnoreImplicit()); // Create a multiply statement to computer the proper upper bound const Expr *lval = UpperBounds->getInit(0)->IgnoreImplicit(); const Expr *rval = UpperBounds->getInit(1)->IgnoreImplicit(); llvm::Value *lvalue = EmitScalarExpr(lval); llvm::Value *rvalue = EmitScalarExpr(rval); BE = Builder.CreateMul(lvalue, rvalue); }*/ // Create all jump destinations and basic blocks in the order they // appear in the IR. JumpDest Condition = getJumpDestInCurrentScope("kokkos.forall.cond"); Loading Loading @@ -319,8 +323,9 @@ bool CodeGenFunction::EmitKokkosParallelFor(const CallExpr *CE, // // TODO: Do we need to "relax" these assumptions to support broader code coverage? // This is 'equivalent' to the Init statement in a traditional for loop (e.g. int i = 0). const ParmVarDecl *InductionVarDecl; InductionVarDecl = EmitKokkosParallelForInductionVar(Lambda); /*const ParmVarDecl *InductionVarDecl; InductionVarDecl = EmitKokkosParallelForInductionVar(Lambda);*/ std::vector<const ParmVarDecl*> params = EmitKokkosParallelForInductionVar(Lambda); // Create the sync region. PushSyncRegion(); Loading @@ -343,6 +348,7 @@ bool CodeGenFunction::EmitKokkosParallelFor(const CallExpr *CE, LexicalScope ConditionScope(*this, R); // Create the conditional. const ParmVarDecl *InductionVarDecl = params.at(0); EmitKokkosParallelForCond(BE, InductionVarDecl, Detach, End, Sync); if (PForScope.requiresCleanups()) { Loading Loading @@ -403,10 +409,12 @@ bool CodeGenFunction::EmitKokkosParallelFor(const CallExpr *CE, Builder.CreateReattach(Increment, SRStart); EmitBlock(Increment); llvm::Value *IncVal = Builder.CreateLoad(GetAddrOfLocalVar(InductionVarDecl)); llvm::Value *One = llvm::ConstantInt::get(ConvertType(InductionVarDecl->getType()), 1); for (const ParmVarDecl* IVD : params) { llvm::Value *IncVal = Builder.CreateLoad(GetAddrOfLocalVar(IVD)); llvm::Value *One = llvm::ConstantInt::get(ConvertType(IVD->getType()), 1); IncVal = Builder.CreateAdd(IncVal, One); Builder.CreateStore(IncVal, GetAddrOfLocalVar(InductionVarDecl)); Builder.CreateStore(IncVal, GetAddrOfLocalVar(IVD)); } BreakContinueStack.pop_back(); ConditionScope.ForceCleanup(); Loading
clang/lib/CodeGen/CodeGenFunction.h +1 −1 Original line number Diff line number Diff line Loading @@ -3520,7 +3520,7 @@ public: // Kitsune support for Kokkos. bool EmitKokkosConstruct(const CallExpr *CE, ArrayRef<const Attr *> Attrs = ArrayRef<const Attr *>()); const ParmVarDecl *EmitKokkosParallelForInductionVar(const LambdaExpr* Lambda); std::vector<const ParmVarDecl*> EmitKokkosParallelForInductionVar(const LambdaExpr* Lambda); void EmitKokkosParallelForCond(const Expr *BoundsExpr, const ParmVarDecl *LoopVar, llvm::BasicBlock *DetachBlock, llvm::BasicBlock *ExitBlock, Loading