Найти переменную условия завершения цикла - PullRequest
1 голос
/ 14 марта 2012

Я хочу найти переменную, которая используется для проверки завершения цикла,
Например, в цикле ниже я должен получить «% n»:

for.body8:                                        ; preds = %for.body8.preheader,for.body8 
%i.116 = phi i32 [ %inc12, %for.body8 ], [ 0, %for.body8.preheader ]
%inc12 = add nsw i32 %i.116, 1
.....
%6 = load i32* %n, align 4, !tbaa !0
% cmp7 = icmp slt i32 %inc12, %6
br i1 %cmp7, label %for.body8, label %for.end13.loopexit

Есть ли прямой метод для получения этого значения?
Один из способов, который я могу сделать, - это итерация инструкции и проверка инструкции icmp. Но я не думаю, что это правильный метод.
Пожалуйста, предложите мне метод.
Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Хотя для общих циклов это сделать невозможно, в некоторых случаях это можно выяснить. В LLVM есть проход, называемый «-indvars: Canonicalize Induction Variables», который описывается как

Это преобразование анализирует и преобразовывает переменные индукции (и вычисления, полученные из них) в более простые формы, подходящие для последующий анализ и преобразование.

Это преобразование вносит следующие изменения в каждый цикл с идентифицируемая переменная индукции:

  1. Все циклы преобразуются в единую каноническую переменную индукции, которая начинается с нуля и начинается с одного.
  2. Каноническая индукционная переменная гарантированно будет первым узлом PHI в блоке заголовка цикла.
  3. Любые арифметические повторения указателей вызываются для использования индексов массива.

Если счетчик циклов вычислим, этот проход также делает следующие изменения:

  1. Условие выхода для цикла канонизируется для сравнения значения индукции со значением выхода. Это превращает петли как:

    for (i = 7; i*i < 1000; ++i)
    

    в

    for (i = 0; i != 25; ++i)
    
  2. Любое использование вне цикла выражения, полученного из indvar, изменяется для вычисления производного значения вне цикла, устранение зависимости от выходного значения индукции переменная. Если единственной целью цикла является вычисление выходного значения некоторого производного выражения, это преобразование сделает цикл мертв.

Это преобразование должно сопровождаться снижением прочности после всех желаемых преобразований цикла были выполнены. Дополнительно, на цели, где это выгодно, цикл может быть преобразован в обратный отсчет до нуля (оптимизация цикла «do»).

и звучит так, как будто это именно то, что вам нужно.

0 голосов
/ 14 марта 2012

К сожалению, нет общего решения для этого.Ваш вопрос является примером проблемы остановки, которая, как доказали, не имеет общего решения: http://en.wikipedia.org/wiki/Halting_problem

Если вы можете сократить пространство проблемы до чего-то чрезвычайно простого, используя подмножество операций, которые не являютсяturing complete (http://en.wikipedia.org/wiki/Turing-complete),, возможно, вы сможете найти решение. Однако общего решения не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...