<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>