[LLVMdev] Is it safe to insert instructions in batches into BBs?
Marcello Maggioni
marcello at codeplay.com
Tue Sep 17 16:47:43 PDT 2013
Hi,
I'm getting a very strange behaviour while adding already created
instructions in batches into basicblocks instead of creating and
inserting them immediately.
Because I need to insert instructions in a certain specific order inside
multiple different BBs I found it easy to use the IRBuilder to create
instructions without inserting them into a BB, storing them somewhere
(vector, map ... etc) and later on inserting all of them in one go into
their positions in the BBs.
What I do is similar to this:
IRBuilder<> IB(Context);
Vector.push_back(IB.CreateXXX());
Vector.push_back(IB.CreateXXX());
Vector.push_back(IB.CreateXXX());
...
// Other stuff
for (SmallVectorImpl<Instruction*>::iterator I = Vector.begin(), E =
Vector.end(); I != E; ++I) {
SomeBB->getInstList().insert(SomeInstruction, *I);
}
If I add the instructions like this I get strange results. It's like if
llvm gets corrupted or something similar, because in the backend strange
things happen, like MCRegisterInfo returning wrong register aliasing
information in a random fashion (sometimes happens and sometimes doesn't) .
If I create and add the instructions on the fly like this:
IB.SetInsertionPoint(SomeInstruction);
for () {
IB.CreateXXX();
}
Everything is fine.
So , in the end, is it safe to add instructions like in the first method
I mentioned or actually the only safe way is to use the second way? In
case it should be safe, what could be the cause of the random breakages?
Cheers,
Marcello
PS = Some of the instructions I'm adding are using one the output value
of the other.
More information about the llvm-dev
mailing list