Loading clang/lib/CodeGen/CGKokkos.cpp +31 −1 Original line number Diff line number Diff line Loading @@ -146,6 +146,11 @@ namespace { curArgIndex++; OE = CE->getArg(curArgIndex); SE = SimplifyExpr(OE); } else if (SE->getStmtClass() == Expr::CXXTemporaryObjectExprClass) { BE = SE; curArgIndex++; OE = CE->getArg(curArgIndex); SE = SimplifyExpr(OE); } else { Diags.Report(SE->getExprLoc(), diag::warn_kokkos_unknown_stmt_class); //SE->dump(); Loading Loading @@ -211,6 +216,17 @@ void CodeGenFunction::EmitKokkosParallelForCond(const Expr *BoundsExpr, if (BoundsExpr->getStmtClass() == Expr::BinaryOperatorClass) { RValue RV = EmitAnyExpr(BoundsExpr); LoopEnd = RV.getScalarVal(); } else if (BoundsExpr->getStmtClass() == Expr::CXXTemporaryObjectExprClass) { const CXXTemporaryObjectExpr *CXXTO = dyn_cast<CXXTemporaryObjectExpr>(BoundsExpr); 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); LoopEnd = Builder.CreateMul(lvalue, rvalue); } else { LoopEnd = EmitScalarExpr(BoundsExpr); } Loading Loading @@ -259,6 +275,20 @@ 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
clang/lib/CodeGen/CGKokkos.cpp +31 −1 Original line number Diff line number Diff line Loading @@ -146,6 +146,11 @@ namespace { curArgIndex++; OE = CE->getArg(curArgIndex); SE = SimplifyExpr(OE); } else if (SE->getStmtClass() == Expr::CXXTemporaryObjectExprClass) { BE = SE; curArgIndex++; OE = CE->getArg(curArgIndex); SE = SimplifyExpr(OE); } else { Diags.Report(SE->getExprLoc(), diag::warn_kokkos_unknown_stmt_class); //SE->dump(); Loading Loading @@ -211,6 +216,17 @@ void CodeGenFunction::EmitKokkosParallelForCond(const Expr *BoundsExpr, if (BoundsExpr->getStmtClass() == Expr::BinaryOperatorClass) { RValue RV = EmitAnyExpr(BoundsExpr); LoopEnd = RV.getScalarVal(); } else if (BoundsExpr->getStmtClass() == Expr::CXXTemporaryObjectExprClass) { const CXXTemporaryObjectExpr *CXXTO = dyn_cast<CXXTemporaryObjectExpr>(BoundsExpr); 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); LoopEnd = Builder.CreateMul(lvalue, rvalue); } else { LoopEnd = EmitScalarExpr(BoundsExpr); } Loading Loading @@ -259,6 +275,20 @@ 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