[PATCH] D27680: [CodeGen] Move lifetime.start of a variable when goto jumps back past its declaration
John McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 3 08:38:50 PST 2017
rjmccall added inline comments.
================
Comment at: lib/CodeGen/CGDecl.cpp:917
+ if (!InsertPt)
+ Builder.SetInsertPoint(BB, BB->begin());
+ // If InsertPt is a terminator, insert it before InsertPt.
----------------
ahatanak wrote:
> ahatanak wrote:
> > rjmccall wrote:
> > > BB->begin() is not necessarily a legal place to insert a call. This could happen if e.g. a scope was unconditionally entered after a statement including a ternary expression.
> > >
> > > Also, I think lexical scopes don't necessarily have an active basic block upon entry, because their entry can be unreachable. This happens most importantly with e.g. switch statements, but can also happen with goto or simply with unreachable code (which it's still important to not crash on).
> > I'm not sure why BB->begin() wouldn't be the right place to insert a call when a scope is entered after a ternary expression. Is it because EmitConditionalOperatorLValue inserts a phi at the beginning of block "cond.end"?
> >
> > Also, I'm not sure when goto or unreachable code might be mis-compiled. Could you elaborate further on that? I can see now why lifetime.start can be inserted at a wrong location when lowering switch statements because EmitSwitchStmt creates and inserts a SwitchInst before a lexical scope is entered, but I'm not sure about the other two cases you mentioned.
> Also, I realized this patch doesn't always insert lifetime.start at the beginning of the block the variable is associated with. For example, when the following code is compiled, lifetime.start for "i" is inserted after the call to foo2, but it should be inserted before the call (at the beginning of the function):
>
> ```
> void foo1(int a) {
> foo2();
> for (int i = 0; i < 10; ++i)
> foo3();
> }
> ```
>
> I'll fix this in my next patch.
Yes, my point was about PHIs and any other instruction that might be required to appear at the start of a block.
https://reviews.llvm.org/D27680
More information about the cfe-commits
mailing list