<div dir="ltr"><p>Hi,<br></p><p>I want to remove a redundant unconditional branch from a Function. In the following example I want to remove <code>br label %26</code> and merge them to a single basic block.</p>
<pre class="gmail-lang-cpp gmail-prettyprint gmail-prettyprinted"><code><span class="gmail-pun">;</span><span class="gmail-pln"> </span><span class="gmail-str"><label></span><span class="gmail-pun">:</span><span class="gmail-lit">9</span><span class="gmail-pun">:</span><span class="gmail-pln"> </span><span class="gmail-pun">;</span><span class="gmail-pln"> preds </span><span class="gmail-pun">=</span><span class="gmail-pln"> </span><span class="gmail-pun">%</span><span class="gmail-lit">7</span><span class="gmail-pln">
</span><span class="gmail-pun">%</span><span class="gmail-lit">10</span><span class="gmail-pln"> </span><span class="gmail-pun">=</span><span class="gmail-pln"> fadd </span><span class="gmail-typ">float</span><span class="gmail-pln"> </span><span class="gmail-pun">%</span><span class="gmail-lit">5</span><span class="gmail-pun">,</span><span class="gmail-pln"> </span><span class="gmail-pun">%</span><span class="gmail-lit">8</span><span class="gmail-pln">
</span><span class="gmail-pun">%</span><span class="gmail-lit">11</span><span class="gmail-pln"> </span><span class="gmail-pun">=</span><span class="gmail-pln"> fmul </span><span class="gmail-typ">float</span><span class="gmail-pln"> </span><span class="gmail-pun">%</span><span class="gmail-lit">5</span><span class="gmail-pun">,</span><span class="gmail-pln"> </span><span class="gmail-pun">%</span><span class="gmail-lit">8</span><span class="gmail-pln">
</span><span class="gmail-pun">%</span><span class="gmail-lit">12</span><span class="gmail-pln"> </span><span class="gmail-pun">=</span><span class="gmail-pln"> fadd </span><span class="gmail-typ">float</span><span class="gmail-pln"> </span><span class="gmail-pun">%</span><span class="gmail-lit">10</span><span class="gmail-pun">,</span><span class="gmail-pln"> </span><span class="gmail-pun">%</span><span class="gmail-lit">11</span><span class="gmail-pln">
</span><span class="gmail-pun">%</span><span class="gmail-lit">13</span><span class="gmail-pln"> </span><span class="gmail-pun">=</span><span class="gmail-pln"> fdiv </span><span class="gmail-typ">float</span><span class="gmail-pln"> </span><span class="gmail-pun">%</span><span class="gmail-lit">5</span><span class="gmail-pun">,</span><span class="gmail-pln"> </span><span class="gmail-pun">%</span><span class="gmail-lit">8</span><span class="gmail-pln">
</span><span class="gmail-pun">%</span><span class="gmail-lit">14</span><span class="gmail-pln"> </span><span class="gmail-pun">=</span><span class="gmail-pln"> fadd </span><span class="gmail-typ">float</span><span class="gmail-pln"> </span><span class="gmail-pun">%</span><span class="gmail-lit">13</span><span class="gmail-pun">,</span><span class="gmail-pln"> </span><span class="gmail-pun">%</span><span class="gmail-lit">12</span><span class="gmail-pln">
br label </span><span class="gmail-pun">%</span><span class="gmail-lit">15</span><span class="gmail-pln">
</span><span class="gmail-pun">;</span><span class="gmail-pln"> </span><span class="gmail-str"><label></span><span class="gmail-pun">:</span><span class="gmail-lit">15</span><span class="gmail-pun">:</span><span class="gmail-pln"> </span><span class="gmail-pun">;</span><span class="gmail-pln"> preds </span><span class="gmail-pun">=</span><span class="gmail-pln"> </span><span class="gmail-pun">%</span><span class="gmail-lit">9</span><span class="gmail-pln">
br label </span><span class="gmail-pun">%</span><span class="gmail-lit">26<br><br></span></code></pre><p>I tried to do this as follow but ended up getting runtime error. Can someone help?</p><p>Thanks</p><p>Charitha<br></p>
<code><span class="gmail-pun">for(auto it1 = F.begin(); it1 != F.end(); it1++){<br> BasicBlock& bb = *it1;<br> auto BI = dyn_cast<BranchInst>(bb.getTerminator());<br> if(BI && BI->isUnconditional() && bb.size() == 1){<br><br> for (BasicBlock *pred : predecessors(&bb)) {<br> auto predBI = dyn_cast<BranchInst>(pred->getTerminator());<br> if(predBI && predBI->isUnconditional()){<br> predBI->setSuccessor(0, bb.getSingleSuccessor());<br> BI->dropAllReferences();<br> BI->removeFromParent();<br> }<br> }<br> } <br><br>}</span></code></div>