[LLVMdev] optimizer returning wrong variable?

Andrew Ferguson andrewf at idlearts.com
Mon Jul 4 23:27:36 PDT 2011


I'm having some trouble trying to workout how to form functions from the
c interface
I thought I had it sorted but I guess I'm missing something or haven't
understood 
the requirements, a case of trial and error and not really having a clue
to start with!  

I've got  binary ops, cmps, for loops, while loops working but then it
hit the 
wall with a tail cmp loop. 

looking at the output from the c interface it looks ok to me 
but the optimizer is returning the wrong variable
I don't know what to do to avoid it?

source language input 

Procedure TRU(a,b) 
Protected x,y,c 
Repeat 
  y=0
   Repeat  
    c+x+y
    y+1  
  Until y >= b 
   x+1  
Until x >= a 
ProcedureReturn c
EndProcedure 

output generated via the c Interface 

define i32 @TRU(i32 %a, i32 %b) {
Entry:
  %a1 = alloca i32
  store i32 %a, i32* %a1
  %b2 = alloca i32
  store i32 %b, i32* %b2
  %c = alloca i32
  store i32 0, i32* %c
  %x = alloca i32
  store i32 0, i32* %x
  %y = alloca i32
  store i32 0, i32* %y
  br label %Repeat1

Repeat1:                                          ; preds = %Until1, %
Entry
  store i32 0, i32* %y
  br label %Repeat2

Repeat2:                                          ; preds = %Until2, %
Repeat1
  %x3 = load i32* %x
  %y4 = load i32* %y
  %add = add i32 %x3, %y4
  %c5 = load i32* %c
  %add6 = add i32 %c5, %add
  store i32 %add6, i32* %c
  %y7 = load i32* %y
  %add8 = add i32 %y7, 1
  store i32 %add8, i32* %y
  br label %Until2

Until2:                                           ; preds = %Repeat2
  %y9 = load i32* %y
  %b10 = load i32* %b2
  %cond = icmp sge i32 %y9, %b10
  br i1 %cond, label %Repeat2, label %Untilcmp2

Untilcmp2:                                        ; preds = %Until2
  %x11 = load i32* %x
  %add12 = add i32 %x11, 1
  store i32 %add12, i32* %x
  br label %Until1

Until1:                                           ; preds = %Untilcmp2
  %x13 = load i32* %x
  %a14 = load i32* %a1
  %cond15 = icmp sge i32 %x13, %a14
  br i1 %cond15, label %Repeat1, label %Untilcmp1

Untilcmp1:                                        ; preds = %Until1
  %c16 = load i32* %c
  ret i32 %c16
}

verifying module
Optimize Function
Run in JIT
Jit Result:  = 0 
should =  325

dump the optimized module 

define i32 @TRU(i32 %a, i32 %b) {
Entry:
  br label %Repeat1

Repeat1:                                          ; preds = %Untilcmp2,
%Entry
  %c.0 = phi i32 [ 0, %Entry ], [ %add6, %Untilcmp2 ]
  %x.0 = phi i32 [ 0, %Entry ], [ %add12, %Untilcmp2 ]
  br label %Repeat2

Repeat2:                                          ; preds = %Repeat2, %
Repeat1
  %c.1 = phi i32 [ %c.0, %Repeat1 ], [ %add6, %Repeat2 ]
  %y.0 = phi i32 [ 0, %Repeat1 ], [ %add8, %Repeat2 ]
  %add = add i32 %c.1, %x.0
  %add6 = add i32 %add, %y.0
  %add8 = add i32 %y.0, 1
  %cond = icmp slt i32 %add8, %b
  br i1 %cond, label %Untilcmp2, label %Repeat2

Untilcmp2:                                        ; preds = %Repeat2
  %add12 = add i32 %x.0, 1
  %cond15 = icmp slt i32 %add12, %a
  br i1 %cond15, label %Untilcmp1, label %Repeat1

Untilcmp1:                                        ; preds = %Untilcmp2
  ret i32 %add6
}

-- 
Andrew Ferguson

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110705/c36589be/attachment.html>


More information about the llvm-dev mailing list