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>