ahatanak added a comment.

In https://reviews.llvm.org/D27680#642770, @rjmccall wrote:

> Interesting.  That's a pretty heavyweight solution, and you're still missing 
> switches, which have exactly the same "can jump into an arbitrary variable's 
> scope" behavior.


In addition to missing the switches, I realized the code in VisitGotoStmt and 
VisitLabelStmt isn't correct. For example, in function move_lifetime_start in 
the test case, it wouldn't move the lifetime markers for "i "if label "label1" 
were enclosed in a block:

  {
   label1:
     p = 0;
  }
  ...
    int i = 999;
    if (ac != 2) {
      p = &i;
      goto label1;
    }
  ...

I fixed both bugs in my local branch.

> I think maybe an easier solution would be to just remove the begin-lifetime 
> marker completely when there's a label or case statement in its scope.  If we 
> want to improve on that, there's already a jump analysis in Sema that could 
> pretty easily be made to mark variables that have jumps into their lifetimes; 
> we would just need to guarantee that that analysis is done.

I suppose you are suggesting we avoid emitting lifetime begin and end during 
IRGen if there is a label preceding the variable declaration (I don't think we 
have to care about case or default statements since we only have to worry about 
backward jumps), rather than running an analysis pass before IRGen and 
stretching the lifetime at IRGen time. If it doesn't have a large impact on 
performance, we can do that, but otherwise we have to come up with another way 
to fix this bug.


https://reviews.llvm.org/D27680



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to