void genAccessAddress(dat_inst_t *d_inst, inf_node_t* ib) { int dbg = 0; int i,j; insn_t *insn; de_inst_t *inst; char *deritree; d_inst->addr_set = NULL; insn = d_inst->insn; if (isStoreInst(insn->op)) { if (dbg) { fprintf(dbgAddr,"\n Ignore store inst"); printDataRef(dbgAddr,d_inst); } return; } switch (d_inst->addrExpr.varNum) { case 0: if (dbg) { fprintf(dbgAddr,"\nAnalyze scalar access"); fprintf(dbgAddr," L%d ",getIbLoop(ib)->id); printDataRef(dbgAddr,d_inst); } analyze_scalar_access(d_inst,ib); break; default: if (dbg) { fprintf(dbgAddr,"\nAnalyze regular/unpred access"); fprintf(dbgAddr," L%d ",getIbLoop(ib)->id); printDataRef(dbgAddr,d_inst); } analyze_regular_access(d_inst,ib); break; //printf("\n Panic, unknown type %d",d_inst->addrExpr.t); //exit(1); } if (dbg) { fprintf(dbgAddr, "\nGenerated addr "); printSAddrSet(dbgAddr,d_inst->addr_set,1); fprintf(dbgAddr, "\n"); } }
int TestArrayReference() { //int main(int argc, char* argv[]) { int da[10]; for (int i = 0; i < 10; i++) { da[i] = i; } printData(da); std::cout << std::endl << std::endl; printDataRef(da); return getchar(); }
/*** Detect possible AddrSet of scalar access and compute access scope ***/ int analyze_scalar_access(dat_inst_t *d_inst, inf_node_t* ib) { int dbg = 0; int pos; int addr; insn_t* insn; loop_t *loop; saddr_p memblk; ts_p memTS; worklist_p tsNode,orgTS, blkNode; if (d_inst->addrExpr.varNum != 0) { printf("\nERR: not scalar access");printDataRef(stdout, d_inst); } addr = d_inst->addrExpr.k; tsNode = NULL; orgTS = NULL; loop = getIbLoop(ib); while (loop!=NULL) { if (dbg) { fprintf(dbgAddr,"\n In loop L%d, lbound %d",loop->id,loop->bound-1); fflush(dbgAddr);} memTS = (ts_p) malloc(sizeof(ts_s)); memTS->loop_id = loop->id; memTS->lw = 0; memTS->up = max(loop->bound-1,0); memTS->flag = 0; memTS->flag |= RENEWABLE; addAfterNode(memTS, &tsNode, &orgTS); //addToWorkList( &(orgTS),memTS); loop = loop->parent; } blkNode = NULL; insn = (insn_t*)(d_inst->insn); memblk = createSAddr(GET_MEM(addr),hexValue(insn->addr), 1, orgTS); addAfterNode(memblk, &blkNode, &(d_inst->addr_set)); return 0; }