<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Oct 30, 2014 at 3:46 AM, serge Guelton <span dir="ltr"><<a href="mailto:serge.guelton@enst-bretagne.fr" target="_blank">serge.guelton@enst-bretagne.fr</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class=""><div class="h5">On Wed, Oct 29, 2014 at 05:24:37PM -0400, Xiaoguang Wang wrote:<br>
> Hi all,<br>
><br>
> I'm a beginner in LLVM. Currently, I want to implement a pass that generates a<br>
> jump table. The entry in that table is a jump to some place (may be an<br>
> instruction) in a basic block.<br>
><br>
> I'm reading the JumpTable code in llvm 3.5, there is a table which contains<br>
> jump entries to functions. In AsmPrinter::doFinalization function from file<br>
> lib/CodeGen/AsmPrinter/AsmPrinter.cpp, it gets a MCSymbolRefExpr from the<br>
> function symbol.<br>
><br>
> While my question is, is there a way to insert jump to place inside a basic<br>
> block?<br>
><br>
> Thanks!<br>
<br>
</div></div>ISTM you can split a basic bloc in two using ``llvm::SplitBlock'' then<br>
jump to the begining of the second part?<br>
</blockquote></div><div class="gmail_extra"><br></div> Hi, I tried splitBasicBlock after the specific place in IR, and saved the newly created BasicBlock*. This works well to create a basic block with a LABEL to jump back. Then I modified the doFinalization method in AsmPrinter to add a jump instruction to the LABEL. The result is it can create the jump to the LABEL, but the LABEL just disappeared. It is like:</div><div class="gmail_extra"><div class="gmail_extra"><div class="gmail_extra"><br></div><div class="gmail_extra"><b>The original IR before I use splitBasicBlock:</b></div><div class="gmail_extra">entry:</div><div class="gmail_extra"> %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0))</div><div class="gmail_extra">  ret i32 0</div><div class="gmail_extra"><br></div></div><div class="gmail_extra"><b>The transformed IR code by using splitBasicBlock:</b></div><div class="gmail_extra">entry:</div><div class="gmail_extra">  %call = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([8 x i8]* @.str, i32 0, i32 0)) </div><div class="gmail_extra">  br label %RET_TABLE_0                                                                                                                                                                                      </div><div class="gmail_extra"><br></div><div class="gmail_extra">RET_TABLE_0:                                      ; preds = %entry</div><div class="gmail_extra">  ret i32 0</div><div><br></div></div><div class="gmail_extra"><b>The final assembly when I modified AsmPrinter:doFinalization to print the jump instruction back to LABEL:</b></div><div class="gmail_extra"><div class="gmail_extra"><div class="gmail_extra">    calll   printf</div><div class="gmail_extra">    movl    %eax, -4(%ebp)          # 4-byte Spill</div><div class="gmail_extra"># BB#1:                                 # %.RET_TABLE_0</div><div class="gmail_extra">    movl    $0, %eax</div><div>... ...</div><div><div>    .align  8, 0x90</div><div>__LLVM_RET_TABLE_0:</div><div>    jmp .RET_TABLE_0</div></div><div><br></div></div><div>So the LLVM will optimize this branch in the pass? Can I disable this optimization or is there other way to reserve the LABEL?</div></div></div>