LLVM for loop statement IR can be generated but there maybe some errors

Hi all,
I’m a llvm beginner and using it to run my own toy-c-compiler. And I use my compiler to C-like code into following llvm IR:

extern void printi(int n); 

int main(){
    int a = 1;
    int b = 2; 
    for(int i = 0; i < 10; i=i+1){
        a = a + b; 
        b = a + b; 
    }
    printi(a);
    return 0; 
}
llvm IR:
declare i32 @printf(ptr, ...)

declare i32 @scanf(ptr, ...)

declare void @printi(i32)

define i32 @main() {
entry:
  %a = alloca i32, align 4, addrspace(4)
  store i32 1, ptr addrspace(4) %a, align 4
  %b = alloca i32, align 4, addrspace(4)
  store i32 2, ptr addrspace(4) %b, align 4
  br label %cond
  %lttmp = icmp slt i32 %i1, 10
  %addtmp = add i32 %a3, %b4
  %addtmp7 = add i32 %a5, %b6
  %addtmp10 = add i32 %i9, 1

cond:                                             ; preds = %step8, %entry
  %i = alloca i32, align 4, addrspace(4)
  store i32 0, ptr addrspace(4) %i, align 4
  %i1 = load i32, ptr addrspace(4) %i, align 4
  br i1 %lttmp, label %body2, label %merge11

body2:                                            ; preds = %cond
  %a3 = load i32, ptr addrspace(4) %a, align 4
  store i32 %a3, ptr addrspace(4) %a, align 4
  %b4 = load i32, ptr addrspace(4) %b, align 4
  %a5 = load i32, ptr addrspace(4) %a, align 4
  store i32 %a5, ptr addrspace(4) %b, align 4
  %b6 = load i32, ptr addrspace(4) %b, align 4
  br label %step8

step8:                                            ; preds = %body2
  %i9 = load i32, ptr addrspace(4) %i, align 4
  store i32 %i9, ptr addrspace(4) %i, align 4
  br label %cond

merge11:                                          ; preds = %cond
  %a12 = load i32, ptr addrspace(4) %a, align 4
  %calltmp = call void @printi(i32 %a12)
  ret i32 0
}

but the program is ended with the ERROR below:

make: *** [Makefile:36: run] Segmentation fault (core dumped)

I don’t know where the problem is and I want to find a solution to debug my function. Thank you in advance!

The given IR isn’t valid; running “opt” on it shows the following error:

opt: <stdin>:19:1: error: expected instruction opcode
cond:                                             ; preds = %step8, %entry
^

(In general, every basic block is required to end with a branch.)

Thanks! But as a beginner I’m sorry for that I can’t understand how can I add the branch

It looks like maybe you accidentally inserted the instructions %lttmp = icmp slt i32 %i1, 10 etc. in the wrong block?

1 Like

THX! How kind you are!