<div dir="ltr">Hi,<div><br></div><div>I am using llvm to do some basic loop transformation practice. My target loop is simple as following:</div><div><br></div><div><div><br></div><div><span class="" style="white-space:pre">        </span>int x[5000][100] = {0};  </div><div>   <span class="" style="white-space:pre">    </span>for (j = 0; j < 100; j = j+1){</div><div>   <span class="" style="white-space:pre">             </span>for (i = 0; i < 5000; i = i+1){</div><div>   <span class="" style="white-space:pre">                    </span>x[i][j] = 2;</div><div>   <span class="" style="white-space:pre">          </span>}<span class="" style="white-space:pre"> </span></div><div>   <span class="" style="white-space:pre">      </span>}</div></div><div><br></div><div><b>What I want to do is to unroll the inner-loop and see how's the speed change.</b></div><div><b>I first tried to use Looppass to achieve my goal:</b></div><div><br></div><div>class IndependentUnroll : public llvm::LoopPass</div><div>{</div><div><span class="" style="white-space:pre">        </span>public:</div><div><br></div><div><span class="" style="white-space:pre">   </span>virtual void unroll(llvm::Loop *L){</div><div><br></div><div>            <span class="" style="white-space:pre">     </span>for (Loop::block_iterator block = L->block_begin(); block != L->block_end(); block++) {</div><div>                <span class="" style="white-space:pre">      </span>BasicBlock *bb = *block;</div><div>                <span class="" style="white-space:pre">   </span>/* Handle loop body.  */</div><div>                <span class="" style="white-space:pre">  </span>if (string(bb->getName()).find("for.body3") != string::npos) {    <span class="" style="white-space:pre">                         </span></div><div>                        <span class="" style="white-space:pre">       </span>Instruction *inst = &bb->back();</div><div>                     <span class="" style="white-space:pre">            </span>BasicBlock *new_bb = bb->splitBasicBlock(inst);</div><div><b>                                /*I try to split the block and insert new instruction</b></div><div><b>                                   But my code crashed here*/</b></div><div>                     <span class="" style="white-space:pre"> </span>}</div><div><span class="" style="white-space:pre">          </span>}</div><div>        }</div><div><span class="" style="white-space:pre">                      </span></div><div><span class="" style="white-space:pre">   </span>IndependentUnroll() : llvm::LoopPass(IndependentUnroll::ID) { }</div><div><br></div><div><span class="" style="white-space:pre">   </span>virtual bool runOnLoop(llvm::Loop *L, llvm::LPPassManager &LPM) {</div><div><br></div><div><span class="" style="white-space:pre">             </span>if (L->getLoopDepth() == 1){</div><div><span class="" style="white-space:pre">                            </span>unroll(L);<span class="" style="white-space:pre">        </span></div><div><span class="" style="white-space:pre">           </span>}</div><div><span class="" style="white-space:pre">  </span>}</div><div><span class="" style="white-space:pre">  </span>static char ID;</div><div><br></div><div>}; </div><div><br></div><div><b>And I get the error:</b></div><div><b><br></b></div><div><div>opt: /home/morris/llvm-3.2/include/llvm/Analysis/LoopInfoImpl.h:297: void llvm::LoopBase<N, M>::verifyLoop() const [with BlockT = llvm::BasicBlock, LoopT = llvm::Loop]: Assertion `HasInsideLoopSuccs && "Loop block has no in-loop successors!"' failed.</div><div>0  opt             0x00000000016befda</div><div>1  opt             0x00000000016becb0</div><div>2  libpthread.so.0 0x00007f95d58e2cb0</div><div>3  libc.so.6       0x00007f95d4d380d5 gsignal + 53</div><div>4  libc.so.6       0x00007f95d4d3b83b abort + 379</div><div>5  libc.so.6       0x00007f95d4d30d9e</div><div>6  libc.so.6       0x00007f95d4d30e42</div><div>7  opt             0x0000000001405631 llvm::LoopBase<llvm::BasicBlock, llvm::Loop>::verifyLoop() const + 1441</div><div>8  opt             0x000000000140e482 llvm::LPPassManager::runOnFunction(llvm::Function&) + 1354</div><div>9  opt             0x00000000015cad3c llvm::FPPassManager::runOnFunction(llvm::Function&) + 388</div><div>10 opt             0x00000000015caf57 llvm::FPPassManager::runOnModule(llvm::Module&) + 107</div><div>11 opt             0x00000000015cb29a llvm::MPPassManager::runOnModule(llvm::Module&) + 456</div><div>12 opt             0x00000000015cb7c9 llvm::PassManagerImpl::run(llvm::Module&) + 125</div><div>13 opt             0x00000000015cb97d llvm::PassManager::run(llvm::Module&) + 39</div><div>14 opt             0x00000000008c1904 main + 5346</div><div>15 libc.so.6       0x00007f95d4d2376d __libc_start_main + 237</div><div>16 opt             0x00000000008b1809</div><div><br></div></div><div><b>Can anyone tell me what is the reason of this situation?</b></div><div><b>By the way I can successfully unroll same loop if I write the my pass with FunctionPass (the same code but traverse by runOnfinction)</b></div><div><b><br></b></div><div><b>Thank you!</b></div></div>