Check for compile-time constraints
Read time 1 minuteLast updated 13 days ago
Use the intrinsic to check if a given expression is constant at compile-time:
IsConstantExpressionusing static Unity.Burst.CompilerServices.Constant;var somethingWhichWillBeConstantFolded = math.pow(42.0f, 42.0f);if (IsConstantExpression(somethingWhichWillBeConstantFolded)){ // Burst knows that somethingWhichWillBeConstantFolded is a compile-time constant}
This is useful to check if a complex expression is always constant folded. You can use it for optimizations for a known constant value. For example, if you want to implement a -like function for integer powers:
powusing static Unity.Burst.CompilerServices.Constant;public static float MyAwesomePow(float f, int i){ if (IsConstantExpression(i) && (2 == i)) { return f * f; } else { return math.pow(f, (float)i); }}
The check means that Burst always removes the branch if isn't constant, because the if condition is false. This means that if is constant and is equal to 2, you can use a more efficient simple multiply instead.
IsConstantExpressioniiThe result of intentionally depends on the result of the optimizations being run. Therefore the result can change based on whether a function gets inlined or not. For example, in the previous case: is false on its own, because is a function argument which is not constant. However, if gets inlined with a constant value for , then it evaluates true. If ends up not being inlined, then remains false.
IsConstantExpressionIsConstantExpression(i)iMyAwesomePowiMyAwesomePowIsConstantExpression(i)