<div dir="ltr">Problem resolved, <div>sound like a mistake in my source code.</div><div>Just forgot to manage my builders.</div><div class="gmail_extra"><br clear="all"><div><div dir="ltr"><div style="font-family:arial;font-size:small">

<div dir="ltr"><div> ---</div><div>| J. Charles </div><div><br></div></div></div></div></div>
<br><br><div class="gmail_quote">2014-05-05 16:43 GMT+02:00 J. Charles N. M. <span dir="ltr"><<a href="mailto:jcharles.nmbiada@gmail.com" target="_blank">jcharles.nmbiada@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div dir="ltr"><div><div><div><div><div><div><div><div><div>Hello,<br></div>I am currently building a compilator for an extended CIL to LLVM with the OCaml's LLVM API.<br><br></div>For all the branch statements, I need to create some basic block to represente the LLVM branchement.<br>


</div>But after compilation, I got a module error<br><br></div>See message error below :<br><br>Terminator found in the middle of a basic block!<br>label %lbl3<br>Broken module found, compilation aborted!<br>Aborted (core dumped)<br>


<br>-------<br></div>And here is the C source code follows by its compilation in LLVM IR representation.<br><br></div>C Source:<br>int f(void)<br>{<br>  int c;<br>  c = 170;<br>  if (c % 7 > 5) c = 7;<br>  return c;<br>


}<br><br>int main(void)<br>{<br>  int tmp;<br>  tmp = f();<br>  return tmp;<br>}<br><br></div>LLVM module :<br>; ModuleID = 'program'<br><br>define i32 @f() {<br>entry:<br>  %c = alloca i32<br>  store i32 170, i32* %c<br>


  %fclv2 = load i32* %c<br>  %fclv3 = srem i32 %fclv2, 7<br>  %fclv4 = icmp sgt i32 %fclv3, 5<br>  br i1 %fclv4, label %lbl1, label %lbl2<br><br>lbl1:                                             ; preds = %entry<br>  store i32 7, i32* %c<br>


  br label %lbl3<br><br>lbl2:                                             ; preds = %entry<br>  br label %lbl3<br><br>lbl3:                                             ; preds = %lbl2, %lbl1<br>  store i32 7, i32* %c<br>

  %fclv5 = load i32* %c<br>
  ret i32 %fclv5<br>}<br><br></div>Until this optimized form does not work!<br><br>define i32 @f() {<br>entry:<br>  %c = alloca i32<br>  store i32 170, i32* %c<br>  %fclv2 = load i32* %c<br>  %fclv3 = srem i32 %fclv2, 7<br>


  %fclv4 = icmp sgt i32 %fclv3, 5<br>  br i1 %fclv4, label %lbl1, label %lbl3<br><br>lbl1:                                             ; preds = %entry<br>  store i32 7, i32* %c<br>  br label %lbl3<br><br>lbl3:                                             ; preds = %entry, %lbl1<br>


  store i32 7, i32* %c<br>  %fclv5 = load i32* %c<br>  ret i32 %fclv5<br>}<br><br></div>I cannot understand why my module is corrupted. <br>Reference  manuel says <br>"[...] every basic block in a program ends with a “Terminator” instruction, which indicates which block should be executed after the current block is finished. These terminator instructions typically yield a ‘void‘ value: they produce control flow, not values (the one exception being the ‘invoke‘ instruction).<br>


The terminator instructions are: ‘ret‘, ‘br‘, ‘switch‘, ‘indirectbr‘, ‘invoke‘, ‘resume‘, and ‘unreachable‘."<p>So whats happened here ?<br></p><div><div><div><div><div><div><div><div><div><div>Thanks for your helps.<br clear="all">


</div><div><div><div><div><div dir="ltr"><div style="font-family:arial;font-size:small"><div dir="ltr"><div> ---</div><div>| J. Charles </div><br></div></div></div></div>
</div></div></div></div></div></div></div></div></div></div></div></div></div>
</blockquote></div><br></div></div>