MemoryAccessDetail TransferFunctions::checkStride(Expr *EX, Expr *EY) { bool stride_x=true, stride_y=true; if (isa<IntegerLiteral>(EX->IgnoreParenImpCasts())) { IntegerLiteral *IL = dyn_cast<IntegerLiteral>(EX->IgnoreParenImpCasts()); if (IL->getValue().getSExtValue()==0) { stride_x = false; } } if (isa<IntegerLiteral>(EY->IgnoreParenImpCasts())) { IntegerLiteral *IL = dyn_cast<IntegerLiteral>(EY->IgnoreParenImpCasts()); if (IL->getValue().getSExtValue()==0) { stride_y = false; } } if (stride_x && stride_y) return STRIDE_XY; if (stride_x) return STRIDE_X; if (stride_y) return STRIDE_Y; return NO_STRIDE; }
bool isIntegerLiteral(Expr *expr, int value) { IntegerLiteral *integerLiteral = dyn_cast<IntegerLiteral>(expr); return integerLiteral && integerLiteral->getValue() == value; }
bool FindGPUMacro::VisitForStmt(ForStmt *fstmt) { Stmt *body = fstmt->getBody(); analyze_data_struct(body); int tx = 1, ty = 1, tz = 1 , bx = 1, by = 1, bz = 1, gpu_time = 0, cpu_time = 0, instanceNum = 0; for (Stmt::child_iterator it = body->child_begin(), eit = body->child_end(); it != eit; it++) { Stmt *s = *it; if (DeclStmt *ds = dyn_cast<DeclStmt>(s)){ if (VarDecl *vd = dyn_cast<VarDecl>(ds->getSingleDecl())){ string className = vd->getTypeSourceInfo()->getType().getBaseTypeIdentifier()->getName(); if (className == "profile_time") { if (CXXConstructExpr *ce = dyn_cast<CXXConstructExpr>(vd->getInit()->IgnoreImpCasts())) { if (MaterializeTemporaryExpr *me = dyn_cast<MaterializeTemporaryExpr>(ce->getArg(0)->IgnoreImpCasts())) { if (CXXTemporaryObjectExpr *co = dyn_cast<CXXTemporaryObjectExpr>(me->GetTemporaryExpr()->IgnoreImpCasts())) { IntegerLiteral *x = dyn_cast<IntegerLiteral>(co->getArg(0)); IntegerLiteral *y = dyn_cast<IntegerLiteral>(co->getArg(1)); IntegerLiteral *z = dyn_cast<IntegerLiteral>(co->getArg(2)); instanceNum = x->getValue().getSExtValue(); gpu_time = y->getValue().getSExtValue(); cpu_time = z->getValue().getSExtValue(); } } } } if (className == "sc_gpu_thread_hierarchy") { if (CXXConstructExpr *ce = dyn_cast<CXXConstructExpr>(vd->getInit()->IgnoreImpCasts())) { if (MaterializeTemporaryExpr *me = dyn_cast<MaterializeTemporaryExpr>(ce->getArg(0)->IgnoreImpCasts())) { if (CXXTemporaryObjectExpr *co = dyn_cast<CXXTemporaryObjectExpr>(me->GetTemporaryExpr()->IgnoreImpCasts())) { IntegerLiteral *x = dyn_cast<IntegerLiteral>(co->getArg(1)); IntegerLiteral *y = dyn_cast<IntegerLiteral>(co->getArg(2)); IntegerLiteral *z = dyn_cast<IntegerLiteral>(co->getArg(3)); IntegerLiteral *w = dyn_cast<IntegerLiteral>(co->getArg(4)); instanceNum = x->getValue().getSExtValue(); tx = x->getValue().getSExtValue(); ty = y->getValue().getSExtValue(); tz = z->getValue().getSExtValue(); } } } } if (className == "sc_gpu_block_hierarchy") { if (CXXConstructExpr *ce = dyn_cast<CXXConstructExpr>(vd->getInit()->IgnoreImpCasts())) { if (MaterializeTemporaryExpr *me = dyn_cast<MaterializeTemporaryExpr>(ce->getArg(0)->IgnoreImpCasts())) { if (CXXTemporaryObjectExpr *co = dyn_cast<CXXTemporaryObjectExpr>(me->GetTemporaryExpr()->IgnoreImpCasts())) { IntegerLiteral *x = dyn_cast<IntegerLiteral>(co->getArg(1)); IntegerLiteral *y = dyn_cast<IntegerLiteral>(co->getArg(2)); IntegerLiteral *z = dyn_cast<IntegerLiteral>(co->getArg(3)); IntegerLiteral *w = dyn_cast<IntegerLiteral>(co->getArg(4)); instanceNum = x->getValue().getSExtValue(); bx = y->getValue().getSExtValue(); by = z->getValue().getSExtValue(); bz = w->getValue().getSExtValue(); } } } } } } //_os <<"\n gpu_time : " <<gpu_time<<" cpu_time : " <<cpu_time<<" instanceNum : " <<_instanceNum<<" " <<instanceNum; if (tx && ty && tz && bx && by && bz && gpu_time && cpu_time && (_instanceNum == instanceNum)) { //_os <<"\n instance num : " <<_instanceNum<<" " <<instanceNum; GPUMacro *gm = new GPUMacro(bx, by, bz, tx, ty, tz, gpu_time, cpu_time); //_os <<"\n for stmt : " <<fstmt; forStmtInstanceIdPairType forStmtInstanceId = make_pair(_instanceNum, fstmt); _forStmtGPUMacroMap.insert(forStmtGPUMacroPairType(forStmtInstanceId, gm)); break; } } return true; }