efriedma added a comment.

> This fails with the new asm constraint checks, since the dead branch is never 
> pruned.

As far as I know, we didn't touch "i", only "n".  Is there a bug filed for the 
issue you're describing?



================
Comment at: clang/lib/CodeGen/CGStmt.cpp:1852
+        IntResult =
+            llvm::APSInt::get(EVResult.Val.getLValueOffset().getQuantity());
+      else
----------------
hans wrote:
> efriedma wrote:
> > This always returns an APSInt with width 64; is that really right?  I guess 
> > it might not really matter given that it's only going to be used as an 
> > immediate constant anyway, but it seems weird.
> I agree it seems a little strange, but I think in practice it's correct. 
> EVResult.Val.getLValueOffset().getQuantity() returns an int64_t, so we're not 
> losing any data.
> 
> The code that I lifted this from, is using the bitwidth of the casted-to 
> integer type for the result. But it's still only got maximum 64 bits since 
> the source, getLValueOffset().getQuantity(), is the same.
The concern isn't that we would lose data.   I'm more concerned the backend 
might not be prepared for a value of the "wrong" width.


================
Comment at: clang/lib/Sema/SemaStmtAsm.cpp:399
+          IntResult =
+              llvm::APSInt::get(EVResult.Val.getLValueOffset().getQuantity());
+        else
----------------
hans wrote:
> efriedma wrote:
> > I think it makes sense to add a method to APValue specifically to do the 
> > conversion from LValue to an APSInt, whether or not isNullPointer() is 
> > true, and use it both here and in IntExprEvaluator::VisitCastExpr in 
> > lib/AST/ExprConstant.cpp.  The logic is sort of subtle (and I'm not 
> > completely sure it's right for targets where null is not zero, but you 
> > shouldn't try to fix that here).
> I agree (and this was also Bill's suggestion above) that it would be nice to 
> have a utility method for this.
> 
> I'm not sure adding one to APValue would work for 
> IntExprEvaluator::VisitCastExpr though, since that code is actually using its 
> own LValue class, not an APValue until it's time to return a result.
> 
> I frankly also doesn't fully understand what that code is doing. If the 
> LValue has a base value, it seems to just take that as result and ignore any 
> offset? This is unknown territory to me, but the way I read it, if there's an 
> lvalue base, the expression isn't going to come out as an integer constant. I 
> think.
> 
> About null pointers, I'm calling getTargetNullPointerValue() so I think that 
> should be okay, no?
Oh, I didn't realize IntExprEvaluator::VisitCastExpr wasn't using the same 
class to represent the value; that makes it harder to usefully refactor.  But 
still, it would be good to reduce the duplicated code between here and CodeGen.

> If the LValue has a base value, it seems to just take that as result and 
> ignore any offset?

If there's a base value, it returns the whole LValue, including the base and 
offset.

> I'm calling getTargetNullPointerValue() so I think that should be okay

The issue would be the case where you have a null pointer with an offset, like 
the case in the bug.  It's sort of inconsistent if null==-1, but null+1==1.  
But it's not something we handle consistently elsewhere, anyway, so I guess we 
can ignore it for now.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D58821/new/

https://reviews.llvm.org/D58821



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

Reply via email to