Обновление прохода удаления приватных переменных #18
Reference in New Issue
Block a user
Delete Branch "private_removing"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Добавлена поддержка индексных выражений вида 2*i+1 в удаляемом массиве, удаление в тесте EP проходит успешно
bug bugreport_1701358632 - добавлена проверка, если функция, использующая удаляемый массив, не является пользовательской
bug bugreport_1699352305 - исправлена логика нахождения определений (добавлена поддержка случаев, когда в базовый блок приходит несколько определений, но можно выбрать одно нужное)
@@ -97,26 +90,112 @@ static bool isArrayRefInVector(SgArrayRefExp* ref, const vector<SgArrayRefExp*>&return false;}мне кажется, что эта функция уже есть в проекте:
getCoefsOfSubscript из expr_transform.h.
Она также выполняет предвычисления констант, посмотри пожалуйста, может быть лучше использовать ее?
Можно заменить на неё, но эта функция требует, чтобы ей передали имя переменной, относительно которой вычисляются коэффициенты выражения:
void getCoefsOfSubscript(pair<int, int> &retCoefs, SgExpression *exp, SgSymbol *doName)
я на имена переменных не опираюсь в преобразовании, поэтому их нужно откуда-то получать.
Можно просто перед вызовом функции получать из exp и подсовывать в вызов getCoefsOfSubscript.
Если так ок, то могу заменить на вызов getCoefsOfSubscript
а как не привязываться к циклу? у нас же замена связана с переменными цикла или с любыми переменными?. А что будет в случае a(i*i), a(i+k), a(i+k+2), где i,k - переменные цикла? по идее нужно проверять, что выражение точно соответствует тому, что нам нужно. Можно попробовать объединить и взять вычисление констант из той функции и оставить частичный обход у себя, если он проверят больше. Либо сделать проверку, что переменная цикла один раз встречается и что она та самая переменная, что нужна, и уже потом вызывать эту функцию для получения выражения. Также не ясно, что будет для многомерных циклов/массивов - будет ли там все корректно?
В случае a(i*i), a(i+k), a(i+k+2) моя функция вернёт false и подстановка не будет осуществляться, getCoefsOfSubscript вернёт <0, 0>. Замена связана с итерационными переменными, но я не думал учитывать их порядок в индексных выражениях (тут ещё обнаружил, что вообще проверку на них не добавил, это ошибка, исправлю).
Можно в качестве дополнительной проверки строить вектор итерационных переменных и, предполагая, что они должны быть в нужном порядке в индексных выражениях, получать коэффициенты через getCoefsOfSubscript. Но тогда обращение к массиву вида А(i + 1, 1) будет считаться некорректным - нет итерационной переменной во втором индексном выражении. Надо будет проверять, есть что если переменной нет и индексное выражение - это просто константа, то это ок ситуация. Наверно сделаю так
хорошо
Обновил PR
@@ -673,9 +800,26 @@ void removePrivates(SgFile* file, vector<Messages>& messages, int& countOfTransf* PRIVATE_REMOVING_ANALYSIS block of functions: ** ********************************************* */кодировка файла не позволяет прочитать русский комментарий тут (а может быть и в проекте тоже)
оказывается не нажал на кнопку, подтверждающую начало рецензии...
30b2248e39to962b89f502