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>