Hello .
I ran opt with -indvars options , got wrong result.
This is my example:
test.cc :
int test(int a)
{
for (int i = 2; i < a; ++i) {
a += ;
}
return a;
}
clang -O3 -emit-llvm -S test.cc -o test.ll
opt -indvards -S test.ll -o indvars.ll > /dev/null
indvars.ll :
; ModuleID = ‘test.ll’
target datalayout = “e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128”
target triple = “i386-pc-linux-gnu”
define i32 @_Z4testi(i32 %a) nounwind readnone {
entry:
%cmp1 = icmp sgt i32 %a, 2
br i1 %cmp1, label %for.body.preheader, label %for.end
for.body.preheader: ; preds = %entry
br label %for.body
for.body: ; preds = %for.body.preheader, %for.body
%a.addr.03 = phi i32 [ %add, %for.body ], [ %a, %for.body.preheader ] //should start at 0 , I think there is no Canonicalize Induction Variable
%i.02 = phi i32 [ %inc, %for.body ], [ 2, %for.body.preheader ]
%add = add nsw i32 %a.addr.03, %i.02
%inc = add nsw i32 %i.02, 1
%cmp = icmp slt i32 %inc, %add
br i1 %cmp, label %for.body, label %for.end.loopexit
for.end.loopexit: ; preds = %for.body
%add.lcssa = phi i32 [ %add, %for.body ]
br label %for.end
for.end: ; preds = %for.end.loopexit, %entry
%a.addr.0.lcssa = phi i32 [ %a, %entry ], [ %add.lcssa, %for.end.loopexit ]
ret i32 %a.addr.0.lcssa
}
Someone can explain why?
Thanks in advance,
Edvard