Rephrase documentation of memoryguard

This commit is contained in:
Daniel Kirchner 2020-09-16 10:47:13 +02:00
parent f4b42d1c72
commit 0eb32b3f60

View File

@ -956,16 +956,22 @@ memoryguard
^^^^^^^^^^^
This function is available in the EVM dialect with objects. The caller of
``let ptr := memoryguard(size)`` promises that they only use memory in either
the range ``[0, size)`` or the unbounded range above ``ptr``. The Yul optimizer
promises to only use the memory range ``[size, ptr)`` for its purposes.
If the optimizer does not need to reserve any memory, it holds that ``ptr := size``.
``let ptr := memoryguard(size)`` (where ``size`` has to be a literal number)
promises that they only use memory in either the range ``[0, size)`` or the
unbounded range above ``ptr``.
Since the presence of a ``memoryguard`` call indicates that all memory access
adheres to this restriction, it allows the optimizer to perform additional
optimization steps, for example the stack limit evader, which attempts to move
stack variables that would otherwise be unreachable to memory.
The Yul optimizer promises to only use the memory range ``[size, ptr)`` for its purposes.
If the optimizer does not need to reserve any memory, it holds that ``ptr == size``.
``memoryguard`` can be called multiple times, but needs to have the same literal as argument
within one Yul subobject. If at least one ``memoryguard`` call is found in a subobject,
the Yul optimiser will try to perform experimental steps like the stack limit evader,
which attempts to move stack variables that would otherwise be unreachable
to memory.
the additional optimiser steps will be run on it.
.. _yul-object: