Проход, чтобы сгладить (некоторые) вложенные циклы - PullRequest
1 голос
/ 13 февраля 2020

Я хочу автоматически переписывать простые вложенные циклы как не вложенные. Например, у меня есть следующий код:

if (y >= 0)
{
    while (x>y)
    {
        x -= y+1;
        for (z=y; z>0; z--) /* nothing */;
    }
}

И я бы хотел, чтобы какое-то llvm magi c произошло так, чтобы оно стало:

if (y >= 0)
{
    bool outer = true;
    while (x>y)
    {
        if (outer) { z = y;                  }
        if (z > 0) { z--;     outer = false; }
        else       { x-= y+1; outer = true;  }
    }
}

Неужели я слишком оптимистичен, думая, что такой проход существует? Я пытался написать opt --help > /tmp/passes.txt && grep "loop" /tmp/passes.txt, но есть так много проходов l oop, что я не знаю, с чего начать.

1 Ответ

1 голос
/ 14 февраля 2020

Эта оптимизация называется l oop fusion. Я не пробовал ваш код, но Полли должна быть в состоянии соединить такие циклы. Polly - это многогранная структура компилятора, которая поставляется с LLVM, но по умолчанию она должна собираться с LLVM. Если этого не произойдет, вам придется передать -DLLVM_POLLY_BUILD:BOOL=ON в cmake для создания polly с llvm.

Вот документация о том, как вызывать оптимизацию polly с помощью clang / llvm.

https://polly.llvm.org/docs/UsingPollyWithClang.html#optimizing -с-попка

...