When gimplification encounters a subexpression which is too complex, it
creates a new temporary variable to hold the value of the subexpression,
and adds a new statement to initialize it before the current statement.
These special temporaries are known as expression temporaries, and are
allocated using get_formal_tmp_var
. The compiler tries to
always evaluate identical expressions into the same temporary, to simplify
elimination of redundant calculations.
We can only use expression temporaries when we know that it will not be
reevaluated before its value is used, and that it will not be otherwise
modified1.
Other temporaries can be allocated using
get_initialized_tmp_var
or create_tmp_var
.
Currently, an expression like a = b + 5
is not reduced any
further. We tried converting it to something like
T1 = b + 5; a = T1;
but this bloated the representation for minimal benefit. However, a variable which must live in memory cannot appear in an expression; its value is explicitly loaded into a temporary first. Similarly, storing the value of an expression to a memory variable goes through a temporary.