lebedev.ri added inline comments.

================
Comment at: lib/CodeGen/CGExprScalar.cpp:1694
 // handle things like function to ptr-to-function decay etc.
 Value *ScalarExprEmitter::VisitCastExpr(CastExpr *CE) {
   Expr *E = CE->getSubExpr();
----------------
vsk wrote:
> lebedev.ri wrote:
> > vsk wrote:
> > > lebedev.ri wrote:
> > > > vsk wrote:
> > > > > I think maintaining a stack of visited cast exprs in the emitter be 
> > > > > cheaper/simpler than using ASTContext::getParents. You could push CE 
> > > > > here and use a RAII helper to pop it. The 'isCastPartOfExplicitCast' 
> > > > > check then simplifies to a quick stack traversal.
> > > > Hmm, two things come to mind:
> > > > 1. This pessimizes the (most popular) case when the sanitizer is 
> > > > disabled.
> > > > 2. `ASTContext::getParents()` may return more than one parent. I'm not 
> > > > sure if that matters here?
> > > > I'll take a look..
> > > As for (1), it's not necessary to push/pop the stack when this sanitizer 
> > > is disabled. And for (2), IIUC the only interesting case is 
> > > "explicit-cast <implicit-cast>+", and none of the implicit casts here 
> > > have more than one parent.
> > > I think maintaining a stack of visited cast exprs in the emitter be 
> > > cheaper/simpler than using ASTContext::getParents. 
> > 
> > {F6660377}
> > 
> > So yeah, this could work.
> > Except sadly it breaks in subtle cases like https://godbolt.org/g/5V2czU
> > I have added those tests beforehand.
> > 
> > Is `ASTContext::getParents()` really horribly slow so we want to 
> > duplicate/maintain/track
> > the current AST stack ourselves?
> > If so, we will need to maintain the *entire* stack, not just `CastExpr''s...
> I think the scan in 'IsTopCastPartOfExplicitCast' can be fixed: while 
> traversing backwards, you'd need to check that the previously-visited cast 
> expr is the child of the current expr. That should address the false negative 
> you pointed out in interference1. I don't yet see what the issue is with 
> interference0.
> 
> Could you explain why maintaining a stack of unfinished casts wouldn't work? 
> I don't understand why you'd need the entire stack. My sense is that it's not 
> required to match the "explicit-cast <implicit-cast>+" pattern, but I could 
> easily be missing something here. As for why this might be worth looking 
> into, I think scanning for an explicit cast is much easier to understand when 
> working with a stack.
> 
> + @klimek to comment on what to expect in terms of the overhead of 
> ASTContext::getParents. Regardless of what approach we pick, it would help to 
> see pre/post-patch compile times for a stage2 build of something like clang 
> or llc.
> I think the scan in 'IsTopCastPartOfExplicitCast' can be fixed: while 
> traversing backwards, you'd need to check that the previously-visited cast 
> expr is the child of the current expr. That should address the false negative 
> you pointed out in interference1.
Oh right. That seems to fix the issues.

> Could you explain why maintaining a stack of unfinished casts wouldn't work?
I didn't think it wouldn't work. I just missed the tidbit about checking 
children.
Then it works.


Repository:
  rC Clang

https://reviews.llvm.org/D48958



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

Reply via email to