UnityGame/Library/PackageCache/com.unity.burst/Documentation~/optimization-constant.md
2024-10-27 10:53:47 +03:00

1.8 KiB

Constant intrinsic

Use the IsConstantExpression intrinsic to check if a given expression is constant at compile-time:

using 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 pow-like function for integer powers:

using 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 IsConstantExpression check means that Burst always removes the branch if i isn't constant, because the if condition is false. This means that if i is constant and is equal to 2, you can use a more optimal simple multiply instead.

The result of IsConstantExpression 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 case above: IsConstantExpression(i) is false on its own, because i is a function argument which is obivously not constant. However, if MyAwesomePow gets inlined with a constant value for i, then it will evaluate to true.

But if MyAwesomePow ends up not being inlined for whatever reason, then IsConstantExpression(i) will remain false.

Note

Constant folding only takes place during optimizations. If you've disabled optimizations, the intrinsic returns false.