Hi,
everytime one has to add instruction at the beginning of a basic block, one
has to skip past PHI nodes that are already there. How about adding a new
method to BasicBlock, to get that first non-PHI instruction? So, adding an
instruction will be as simple as:
new SomeInstruction(............., BB->getFirstNonPHI())
Patch attached. Comments?
- Volodya
BasicBlock.diff (1.68 KB)
Sure, sounds good. A couple requests:
1. Please add a const version that returns a const Instruction* also.
2. There is no need to check for running off the end of the basic block, you are guaranteed that a block has a terminator, which is not a PHI.
-Chris
Chris Lattner wrote:
everytime one has to add instruction at the beginning of a basic
block, one
has to skip past PHI nodes that are already there. How about adding a new
method to BasicBlock, to get that first non-PHI instruction? So,
adding an
instruction will be as simple as:
new SomeInstruction(............., BB->getFirstNonPHI())
2. There is no need to check for running off the end of the basic block,
you are guaranteed that a block has a terminator, which is not a PHI.
Assuming it's a valid BasicBlock. Which, if I understand correctly,
isn't always true in mid-transformation. Perhaps you should turn it into
an assert instead, to minimize surprises?
I can't check if this actually happens with llvm.org seemingly down, but
I do recall a situation like that. Maybe it was the BB list within a
function?
Nick
2. There is no need to check for running off the end of the basic block,
you are guaranteed that a block has a terminator, which is not a PHI.
Assuming it's a valid BasicBlock. Which, if I understand correctly,
isn't always true in mid-transformation. Perhaps you should turn it into
an assert instead, to minimize surprises?
It should already assert when it attempts to dereference the end iterator.
I can't check if this actually happens with llvm.org seemingly down, but
I do recall a situation like that. Maybe it was the BB list within a
function?
As you say, this can only happen mid-transformation...
-Chris
Chris Lattner wrote:
everytime one has to add instruction at the beginning of a basic block,
one has to skip past PHI nodes that are already there. How about adding a
new method to BasicBlock, to get that first non-PHI instruction? So,
adding an instruction will be as simple as:
new SomeInstruction(............., BB->getFirstNonPHI())
Sure, sounds good. A couple requests:
1. Please add a const version that returns a const Instruction* also.
I was considering it, but then decided that given that you can't pass 'const
Instruction*' as 'insert before' parameter of any other instruction,
there's no point in adding it.
Maybe, the method should be
Instruction* getFirstNonPHI() const
? Given that in C++ constness is generally not deep -- i.e. don't apply to
contained objects.
- Volodya
Sure, sounds good. A couple requests:
1. Please add a const version that returns a const Instruction* also.
I was considering it, but then decided that given that you can't pass 'const
Instruction*' as 'insert before' parameter of any other instruction,
there's no point in adding it.
Ok, that makes sense.
Maybe, the method should be
Instruction* getFirstNonPHI() const
? Given that in C++ constness is generally not deep -- i.e. don't apply to
contained objects.
True, but that would break "logical constness" which is more useful.
I'd prefer either two versions or just the single non-const version.
Thanks,
-Chris