Files
SAPFOR/dvm/fdvm/trunk/fdvm/acc_index_analyzer.cpp
2023-09-14 19:43:13 +03:00

58 lines
1.9 KiB
C++

#include "acc_data.h"
extern SgStatement *kernelScope;
static int indexGenerator = 0;
SgExpression* analyzeArrayIndxs(SgSymbol *array, SgExpression *listIdx)
{
SgSymbol *varName = NULL;
char *strNum = new char[32];
char *strArray, *newStr;
if (listIdx == NULL || !autoTransform || dontGenConvertXY || oneCase)
return NULL;
else
{
strArray = array->identifier();
newStr = new char[strlen(strArray) + 32];
Array *tArray = currentLoop->getArray(strArray);
if (tArray)
{
char *charEx = NULL;
SgSymbol *tSymb = tArray->findAccess(listIdx, charEx);
if (tSymb == NULL)
{
newStr[0] = '\0';
strcat(newStr, strArray);
strcat(newStr, "_");
sprintf(strNum, "%d", (int) indexGenerator);
indexGenerator++;
strcat(newStr, strNum);
if (C_Cuda)
varName = new SgSymbol(VARIABLE_NAME, TestAndCorrectName(newStr), *C_DvmType(), *kernelScope);
else
{
if (undefined_Tcuda)
{
SgExpression *le;
le = new SgExpression(LEN_OP);
le->setLhs(new SgValueExp(8));
varName = new SgSymbol(VARIABLE_NAME, TestAndCorrectName(newStr), *new SgType(T_INT, le, SgTypeInt()), *kernelScope);
}
else
varName = new SgSymbol(VARIABLE_NAME, TestAndCorrectName(newStr), *SgTypeInt(), *kernelScope);
}
tArray->addNewCoef(listIdx, charEx, varName);
}
else
varName = tSymb;
}
}
delete[]strNum;
return new SgVarRefExp(varName);
}