Использование метода getSmallConstantTripCount цикла в LLVM

#optimization #compiler-construction #llvm

#оптимизация #компилятор-конструирование #llvm

Вопрос:

В моем проходе я добавляю LoopInfo в качестве обязательного прохода. Затем я хотел бы вывести постоянное количество срабатываний каждого цикла, если оно у него есть. Однако каждый раз, когда я вызываю getSmallConstantTripCount , он возвращает 0, даже для очень простого цикла:

 for(i=0; i<3;   i) {;}  
  

Есть идеи, почему?

Ответ №1:

В LLVM есть принцип, по которому каждая часть выполняет наименьший объем работы. LoopInfo::getSmallConstantTripCount не выполняет никакого сложного анализа, он ищет простой цикл с одним вспомогательным элементом, который каждый раз увеличивает значение на 1 и сравнивается с использованием != с постоянным целым числом.

Когда вы компилируете код, который вы написали в -O0, каждое «i < 3» фактически вызывает загрузку из памяти для чтения последнего значения ‘i’. LoopInfo, конечно, не собирается выполнять анализ, необходимый для определения того, что обращения к памяти не нужны, это работа «opt -mem2reg». Попробуйте запустить эту оптимизацию, и, возможно, -instcombine -loopsimplify -loop-rotate повернет код, чтобы придать ему форму, которую будет обрабатывать getSmallConstantTripCount.