<div>Hmmmm.</div><div>One more guess is that since you used IRBuilder to insert new Instructions, you are still actually modifying the BB and thus invalidated the iterator. I just picked up some old work regarding this and in my example I just wrote something like this:</div><div><div>if (BinaryOperator *BO = dyn_cast<BinaryOperator>(Inst)) {</div><div>     BinaryOperator *newBO = llvm::BinaryOperator::Create(newOp, BO->getOperand(0),BO->getOperand(1));</div><div>     llvm::ReplaceInstWithInst(BO, newBO);</div><div>}</div></div><div><br></div><div>Sorry for the bad formatting, I typed this on mobile. Hope this helps : )</div><div><br></div><div>Zhang</div><div><includetail><div> </div><div style="font:Verdana normal 14px;color:#000;"><div style="FONT-SIZE: 12px;FONT-FAMILY: Arial Narrow;padding:2px 0 2px 0;">------------------ Original ------------------</div><div style="FONT-SIZE: 12px;background:#efefef;padding:8px;"><div id="menu_sender"><b>From: </b> "Ahmad Nouralizadeh"<ahmadnouralizadeh@gmail.com>;</div><div><b>Date: </b> Thu, Aug 9, 2018 02:00 AM</div><div><b>To: </b> "mayuyu.io"<admin@mayuyu.io>; <wbr></div><div><b>Cc: </b> "llvm-dev"<llvm-dev@lists.llvm.org>; <wbr></div><div><b>Subject: </b> Re: [llvm-dev] Error Calling eraseFromParent()</div></div><div> </div><div style="position:relative;"><div dir="ltr"><div>LLVM is built in Release mode. The version is 6.0.0. I think that a similar code worked on verison 3.9.0. It is probably a null pointer dereference occurring in eraseFromParent(). I checked and reconfirmed that the instruction had no uses. <span style="font-size:small;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Perhaps I should rebuild LLVM. Thanks.</span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 8, 2018 at 9:03 PM, <a href="http://mayuyu.io">mayuyu.io</a> <span dir="ltr"><<a href="mailto:admin@mayuyu.io" target="_blank">admin@mayuyu.io</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">Hmmmm that’s strange. Do you get an assert when you build LLVM with this code in Debug Mode or is it simply null pointer dereference? <div>On a side note, usually when doing transforms similar to yours I use IRBuilder’s CreateXXX followed by a ReplaceInstWithInst which works perfectly fine for me.</div><div><br><div id="m_321749027144279699AppleMailSignature">Zhang</div><div><div class="h5"><div><br>在 2018年8月9日,00:29,Ahmad Nouralizadeh <<a href="mailto:ahmadnouralizadeh@gmail.com" target="_blank">ahmadnouralizadeh@gmail.com</a>> 写道:<br><br></div><blockquote type="cite"><div><div dir="ltr">Hi. Thanks. I changed the code but the problem exists. This is my new code which is again very simple:<div><div>...</div><div>bool runOnFunction(Function &F) override {</div><div><br></div><div>vector<Instruction *> dels;</div><div>dels.clear();</div><div><br></div><div>for (inst_iterator It = inst_begin(&F), Ie = inst_end(&F); It != Ie;) {</div><div><span style="white-space:pre-wrap">     </span>Instruction *I = &*(It++);</div><div><br></div><div><span style="white-space:pre-wrap">  </span>if (auto* op = dyn_cast<BinaryOperator>(I)) {</div><div><span style="white-space:pre-wrap">              </span>IRBuilder<NoFolder> builder(op);</div><div><br></div><div><span style="white-space:pre-wrap">          </span>Value* lhs = op->getOperand(0);</div><div><span style="white-space:pre-wrap">               </span>Value* rhs = op->getOperand(1);</div><div><span style="white-space:pre-wrap">               </span>Value* mul = builder.CreateMul(lhs, rhs);</div><div><br></div><div><span style="white-space:pre-wrap">               </span>for (auto& U : op->uses()) {</div><div><span style="white-space:pre-wrap">              </span>  User* user = U.getUser();</div><div><span style="white-space:pre-wrap">         </span>  user->setOperand(U.<wbr>getOperandNo(), mul);</div><div><span style="white-space:pre-wrap">            </span>}</div><div><span style="white-space:pre-wrap">                </span>//I->eraseFromParent();</div><div><span style="white-space:pre-wrap">               </span>dels.push_back(I);</div><div><span style="white-space:pre-wrap">       </span>}</div><div>}<span style="white-space:pre-wrap">       </span></div><div><br></div><div>for (auto &I : dels) {</div><div><span style="white-space:pre-wrap">       </span>I->eraseFromParent();</div><div>}</div></div><div>...</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 8, 2018 at 6:16 PM, <a href="http://mayuyu.io" target="_blank">mayuyu.io</a> <span dir="ltr"><<a href="mailto:admin@mayuyu.io" target="_blank">admin@mayuyu.io</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">Hi:<div>As stated in the documentation you shouldn’t modify it while iterating as this invalidates the iterator. Try save the pointers to a vector outside your loop and perform erasing in a new loop following your current one.<br><br><div id="m_321749027144279699m_-2881597292314478193AppleMailSignature">Zhang</div><div><div class="m_321749027144279699h5"><div><br>在 2018年8月8日,07:54,Ahmad Nouralizadeh via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> 写道:<br><br></div><blockquote type="cite"><div><div dir="ltr">Thanks Bjorn! But The problem is still there.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Aug 8, 2018 at 2:04 AM, Björn Pettersson A <span dir="ltr"><<a href="mailto:bjorn.a.pettersson@ericsson.com" target="_blank">bjorn.a.pettersson@ericsson.c<wbr>om</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span>It looks quite dangerous to erase the instruction I inside the loop when iterating over all instructions in the function.<br>
I guess it depends on how the range based iterator is implemented if that works or not.<br>
<br>
</span>I think that you, for example, can change the range based iteration<br>
<span><br>
   for (auto &I : instructions(F))<br>
<br>
into something like this<br>
<br>
   for (inst_iterator It = inst_begin(&F), Ie = inst_end(&F); It != Ie;) {<br>
      Instruction *I = &*(It++);<br>
      ...<br>
    }<br>
<br>
That will make sure that you step the iterator before modifying the data structure you iterate over.<br>
<br>
Regards,<br>
Björn<br>
______________________________<wbr>__________<br>
From: llvm-dev <<a href="mailto:llvm-dev-bounces@lists.llvm.org" target="_blank">llvm-dev-bounces@lists.llvm.o<wbr>rg</a>> on behalf of Ahmad Nouralizadeh via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>><br>
</span>Sent: Tuesday, August 7, 2018 22:26<br>
<span class="m_321749027144279699m_-2881597292314478193im m_321749027144279699m_-2881597292314478193HOEnZb">To: <a href="mailto:paul.robinson@sony.com" target="_blank">paul.robinson@sony.com</a><br>
Cc: <a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
Subject: Re: [llvm-dev] Error Calling eraseFromParent()<br>
<br>
</span><div class="m_321749027144279699m_-2881597292314478193HOEnZb"><div class="m_321749027144279699m_-2881597292314478193h5">The code is really simple. But I can not the reason for the segmentation fault. I only know that the eraseFromParent() function leads to it. The whole code is:<br>
...<br>
bool runOnFunction(Function &F) override {<br>
<br>
for (auto &I : instructions(F)) {<br>
<br>
if (auto* op = dyn_cast<BinaryOperator>(&I)) {<br>
IRBuilder<> builder(op);<br>
<br>
Value* lhs = op->getOperand(0);<br>
Value* rhs = op->getOperand(1);<br>
Value* mul = builder.CreateMul(lhs, rhs);<br>
<br>
for (auto& U : op->uses()) {<br>
  User* user = U.getUser();<br>
  user->setOperand(U.getOperandN<wbr>o(), mul);<br>
}<br>
<br>
I.eraseFromParent();<br>
    }<br>
<br>
}<br>
...<br>
And I think that the code worked well with LLVM-3.6.0 that I tested one year ago. Now, I use LLVM-6.0.0.<br>
Regards.<br>
</div></div></blockquote></div><br></div>

</div></blockquote></div></div><blockquote type="cite"><div><span>______________________________<wbr>_________________</span><br><span>LLVM Developers mailing list</span><br><span><a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a></span><br><span><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a></span><br></div></blockquote></div></div></blockquote></div><br></div>
</div></blockquote></div></div></div></div></blockquote></div><br></div>

</div></div><!--<![endif]--></includetail></div>