Hi,
I have a program as:
int main(int argc, char **argv)
{
int a,b,k,l;
scanf("%d%d",&a,&b);
if (argc > 1) {
k=a+b;
} else {
k=5;
}
l=a+b;
printf("%d,%d",k,l);
return 0;
}
Now i run the following on it:
llvm-gcc -O1 -emit-llvm -c -o 1.bc 1.c
llvm-dis 1.bc -o 1.ll
opt -gvnpre 1.bc -o 1p.bc // I believe this line writes
the code to 1p.bc after applying gvnpre to 1.bc
llvm-dis 1p.bc -o 1p.ll
Now 1.ll is as :
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
entry:
%b = alloca i32, align 4 ; <i32*> [#uses=3]
%a = alloca i32, align 4 ; <i32*> [#uses=3]
%0 = call i32 (i8*, ...)* @scanf(i8* getelementptr inbounds ([5 x i8]*
@.str, i32 0, i32 0), i32* %a, i32* %b) nounwind ; <i32> [#uses=0]
%1 = icmp sgt i32 %argc, 1 ; <i1> [#uses=1]
br i1 %1, label %bb, label %bb2
bb: ; preds = %entry
%2 = load i32* %a, align 4 ; <i32> [#uses=1]
%3 = load i32* %b, align 4 ; <i32> [#uses=1]
%4 = add nsw i32 %3, %2 ; <i32> [#uses=1]
br label %bb2
bb2: ; preds = %bb, %entry
%k.0 = phi i32 [ %4, %bb ], [ 5, %entry ] ; <i32> [#uses=1]
%5 = load i32* %a, align 4 ; <i32> [#uses=1]
%6 = load i32* %b, align 4 ; <i32> [#uses=1]
%7 = add nsw i32 %6, %5 ; <i32> [#uses=1]
%8 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x
i8]* @.str1, i32 0, i32 0), i32 %k.0, i32 %7) nounwind ; <i32> [#uses=0]
ret i32 0
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
And 1p.ll as:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
entry:
%b = alloca i32, align 4 ; <i32*> [#uses=3]
%a = alloca i32, align 4 ; <i32*> [#uses=3]
%0 = call i32 (i8*, ...)* @scanf(i8* getelementptr inbounds ([5 x i8]*
@.str, i32 0, i32 0), i32* %a, i32* %b) nounwind ; <i32> [#uses=0]
%1 = icmp sgt i32 %argc, 1 ; <i1> [#uses=1]
br i1 %1, label %bb, label %entry.bb2_crit_edge
entry.bb2_crit_edge: ; preds = %entry
br label %bb2
bb: ; preds = %entry
%2 = load i32* %a, align 4 ; <i32> [#uses=1]
%3 = load i32* %b, align 4 ; <i32> [#uses=1]
%4 = add nsw i32 %3, %2 ; <i32> [#uses=1]
br label %bb2
bb2: ; preds = %bb,
%entry.bb2_crit_edge
%k.0 = phi i32 [ %4, %bb ], [ 5, %entry.bb2_crit_edge ] ; <i32>
[#uses=1]
%5 = load i32* %a, align 4 ; <i32> [#uses=1]
%6 = load i32* %b, align 4 ; <i32> [#uses=1]
%7 = add nsw i32 %6, %5 ; <i32> [#uses=1]
%8 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x
i8]* @.str1, i32 0, i32 0), i32 %k.0, i32 %7) nounwind ; <i32> [#uses=0]
ret i32 0
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
I believe GVNPRE should have remove partial redundancy by introducing an
extra computation in entry.bb2_crit_edge.
But this does not happen, redundancy still remains.
Can someone tell me where am I going wrong.
Thanks and Regards,
Ambika
GVNPRE is unmaintained, slow, and has been removed from trunk. --Owen On Mar 4, 2010, at 12:46 PM, ambika wrote:> Hi, > > I have a program as: > > int main(int argc, char **argv) > { > int a,b,k,l; > scanf("%d%d",&a,&b); > if (argc > 1) { > k=a+b; > } else { > k=5; > } > l=a+b; > printf("%d,%d",k,l); > return 0; > } > > > Now i run the following on it: > > llvm-gcc -O1 -emit-llvm -c -o 1.bc 1.c > llvm-dis 1.bc -o 1.ll > opt -gvnpre 1.bc -o 1p.bc // I believe this line writes > the code to 1p.bc after applying gvnpre to 1.bc > llvm-dis 1p.bc -o 1p.ll > > Now 1.ll is as : > ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > entry: > %b = alloca i32, align 4 ; <i32*> [#uses=3] > %a = alloca i32, align 4 ; <i32*> [#uses=3] > %0 = call i32 (i8*, ...)* @scanf(i8* getelementptr inbounds ([5 x i8]* > @.str, i32 0, i32 0), i32* %a, i32* %b) nounwind ; <i32> [#uses=0] > %1 = icmp sgt i32 %argc, 1 ; <i1> [#uses=1] > br i1 %1, label %bb, label %bb2 > > bb: ; preds = %entry > %2 = load i32* %a, align 4 ; <i32> [#uses=1] > %3 = load i32* %b, align 4 ; <i32> [#uses=1] > %4 = add nsw i32 %3, %2 ; <i32> [#uses=1] > br label %bb2 > > bb2: ; preds = %bb, %entry > %k.0 = phi i32 [ %4, %bb ], [ 5, %entry ] ; <i32> [#uses=1] > %5 = load i32* %a, align 4 ; <i32> [#uses=1] > %6 = load i32* %b, align 4 ; <i32> [#uses=1] > %7 = add nsw i32 %6, %5 ; <i32> [#uses=1] > %8 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x > i8]* @.str1, i32 0, i32 0), i32 %k.0, i32 %7) nounwind ; <i32> [#uses=0] > ret i32 0 > ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > > > And 1p.ll as: > ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > entry: > %b = alloca i32, align 4 ; <i32*> [#uses=3] > %a = alloca i32, align 4 ; <i32*> [#uses=3] > %0 = call i32 (i8*, ...)* @scanf(i8* getelementptr inbounds ([5 x i8]* > @.str, i32 0, i32 0), i32* %a, i32* %b) nounwind ; <i32> [#uses=0] > %1 = icmp sgt i32 %argc, 1 ; <i1> [#uses=1] > br i1 %1, label %bb, label %entry.bb2_crit_edge > > entry.bb2_crit_edge: ; preds = %entry > br label %bb2 > > bb: ; preds = %entry > %2 = load i32* %a, align 4 ; <i32> [#uses=1] > %3 = load i32* %b, align 4 ; <i32> [#uses=1] > %4 = add nsw i32 %3, %2 ; <i32> [#uses=1] > br label %bb2 > > bb2: ; preds = %bb, > %entry.bb2_crit_edge > %k.0 = phi i32 [ %4, %bb ], [ 5, %entry.bb2_crit_edge ] ; <i32> [#uses=1] > %5 = load i32* %a, align 4 ; <i32> [#uses=1] > %6 = load i32* %b, align 4 ; <i32> [#uses=1] > %7 = add nsw i32 %6, %5 ; <i32> [#uses=1] > %8 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([6 x > i8]* @.str1, i32 0, i32 0), i32 %k.0, i32 %7) nounwind ; <i32> [#uses=0] > ret i32 0 > ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > > I believe GVNPRE should have remove partial redundancy by introducing an > extra computation in entry.bb2_crit_edge. > But this does not happen, redundancy still remains. > > Can someone tell me where am I going wrong. > > Thanks and Regards, > Ambika > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev-------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 2620 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100304/97900a0d/attachment.bin>