[PATCH] D46241: [CodeGen] Recognize more cases of zero initialization

Serge Pavlov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu May 10 22:03:37 PDT 2018


sepavloff added inline comments.


================
Comment at: lib/CodeGen/CGExprConstant.cpp:1414-1415
+    Expr::EvalResult Result;
+    if (Init->EvaluateAsRValue(Result, CE.CGM.getContext()) &&
+        !Result.hasUnacceptableSideEffect(Expr::SE_NoSideEffects))
+      return (Result.Val.isInt() && Result.Val.getInt().isNullValue()) ||
----------------
rsmith wrote:
> Please call `D.evaluateValue()` here rather than inventing your own evaluation scheme. That way, we'll cache the evaluated initializer on the variable for other uses or reuse the value if we've already evaluated it, and you don't need to worry about the corner cases involved in getting the evaluation right. (As it happens, you're getting some minor details wrong because evaluating an initializer is not quite the same as evaluating an rvalue, but in practice it's not a big deal here.)

Call of `D.evaluateValue()` may result in substantial memory and time consumption if the variable value is huge, like in:
```
int char data_1[2147483648u] = { 0 };
```
The idea of this patch is to recognize some cases of zero initialization prior to the evaluation of variable initializer. In the example above, value would be evaluated only for part of the initializer, namely `0`, which does not have an associated variable, so call of `D.evaluateValue()` is not possible.



Repository:
  rC Clang

https://reviews.llvm.org/D46241





More information about the cfe-commits mailing list