нетривиальная развертка l oop - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть следующее нетривиальное l oop, которое делает 10 итераций и останавливается (вычисляет n более k)

#include <stdio.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
    int d=1;
    bool f = true;
    unsigned int j  = 1;
    unsigned int n  = 3;
    unsigned int k  = 2;
    unsigned int m0 = 0;
    unsigned int I[2];
    I[0]=m0;

    while (j != -1)
    {
        if (j == k)             { f=false;               j--;      }
        else if (f)             { f=true ; I[j]=I[j-1]+1;j++;      }
        else if (I[j] >= n-k+j) { f=false;               j--;      }
        else                    { f=true ; I[j]=I[j  ]+1;j++; d++; }
    }
    printf("num subsets = %d\n",d);
    return 0;
}

Я пытаюсь заставить llvm/clang до разверните l oop, но не сделайте этого:

$ clang++ -c -O3 -emit-llvm main.cpp -o main.bc
$ llvm-dis main.bc -o main.ll
$ sed -n '23,34p;35q' main.ll
while.cond:                                       ; preds = %while.cond.backedge, %while.cond.outer
  %j.0 = phi i32 [ %j.0.ph, %while.cond.outer ], [ %j.0.be, %while.cond.backedge ]
  %f.0 = phi i1 [ true, %while.cond.outer ], [ %f.0.be, %while.cond.backedge ]
  switch i32 %j.0, label %if.else [
    i32 -1, label %while.end
    i32 2, label %while.cond.backedge
  ]

while.cond.backedge:                              ; preds = %while.cond, %if.then2, %if.then12
  %j.0.be = phi i32 [ %inc, %if.then2 ], [ %dec13, %if.then12 ], [ 1, %while.cond ]
  %f.0.be = phi i1 [ true, %if.then2 ], [ false, %if.then12 ], [ false, %while.cond ]
  br label %while.cond

Так что, похоже, l oop все еще там, На самом деле, даже я использую n=2, а l oop делает только 4 итерации, развернуть не удастся. Любой способ заставить llvm/clang развернуть это? gcc

...