У меня есть следующее нетривиальное 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