rsmith added inline comments.

================
Comment at: lib/CodeGen/CGExprConstant.cpp:1413
+  } else if (!Init->isEvaluatable(CE.CGM.getContext())) {
+    return false;
+  } else if (InitTy->hasPointerRepresentation()) {
----------------
sepavloff wrote:
> rjmccall wrote:
> > Aren't the null-pointer and integer-constant-expression checks below 
> > already checking this?  Also, `isEvaluatable` actually computes the full 
> > value internally (as an `APValue`), so if you're worried about the memory 
> > and compile-time effects of producing such a value, you really shouldn't 
> > call it.
> > 
> > You could reasonably move this entire function to be a method on `Expr` 
> > that takes an `ASTContext`.
> Comment for `EvaluateAsRValue` says that it tries calculate expression 
> agressively. Indeed, for the code:
> ```
>   decltype(nullptr) null();
>   int *p = null();
> ```
> compiler ignores potential side effect of `null()` and removes the call, 
> leaving only zero initialization. `isNullPointerConstant` behaves similarly.
Nonetheless, it looks like this function could evaluate `Init` up to three 
times, which seems unreasonable. Instead of the checks based on trying to 
evaluate the initializer (`isNullPointerConstant` + `isIntegerConstantExpr`), 
how about calling `VarDecl::evaluateValue()` (which will return a potentially 
pre-computed and cached initializer value) and checking if the result is a zero 
constant?

In fact, `tryEmitPrivateForVarInit` already does most of that for you, and the 
right place to make this change is probably in `tryEmitPrivateForMemory`, where 
you can test to see if the `APValue` is zero-initialized and produce a 
`zeroinitializer` if so. As a side-benefit, putting the change there will mean 
we'll also start using `zeroinitializer` for zero-initialized subobjects of 
objects that have non-zero pieces.


Repository:
  rC Clang

https://reviews.llvm.org/D46241



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

Reply via email to