GIMPLE API (GNU Compiler Collection (GCC) Internals)

### 27.1 GIMPLE API ¶

GIMPLE function: `tree` gimple_simplify `(enum tree_code, tree, tree, gimple_seq *, tree (*)(tree))` ¶
GIMPLE function: `tree` gimple_simplify `(enum tree_code, tree, tree, tree, gimple_seq *, tree (*)(tree))` ¶
GIMPLE function: `tree` gimple_simplify `(enum tree_code, tree, tree, tree, tree, gimple_seq *, tree (*)(tree))` ¶
GIMPLE function: `tree` gimple_simplify `(enum built_in_function, tree, tree, gimple_seq *, tree (*)(tree))` ¶
GIMPLE function: `tree` gimple_simplify `(enum built_in_function, tree, tree, tree, gimple_seq *, tree (*)(tree))` ¶
GIMPLE function: `tree` gimple_simplify `(enum built_in_function, tree, tree, tree, tree, gimple_seq *, tree (*)(tree))` ¶

  The main GIMPLE API entry to the expression simplifications mimicking that of the GENERIC fold_{unary,binary,ternary} functions.

thus providing n-ary overloads for operation or function. The additional arguments are a gimple_seq where built statements are inserted on (if `NULL` then simplifications requiring new statements are not performed) and a valueization hook that can be used to tie simplifications to a SSA lattice.

In addition to those APIs `fold_stmt` is overloaded with a valueization hook:

bool: `fold_stmt` (gimple_stmt_iterator `*, tree (*)(tree));` ¶

On top of these a `fold_buildN`-like API for GIMPLE is introduced:

GIMPLE function: `tree` gimple_build `(gimple_seq *, location_t, enum tree_code, tree, tree, tree (*valueize) (tree) = NULL);` ¶
GIMPLE function: `tree` gimple_build `(gimple_seq *, location_t, enum tree_code, tree, tree, tree, tree (*valueize) (tree) = NULL);` ¶
GIMPLE function: `tree` gimple_build `(gimple_seq *, location_t, enum tree_code, tree, tree, tree, tree, tree (*valueize) (tree) = NULL);` ¶
GIMPLE function: `tree` gimple_build `(gimple_seq *, location_t, enum built_in_function, tree, tree, tree (*valueize) (tree) = NULL);` ¶
GIMPLE function: `tree` gimple_build `(gimple_seq *, location_t, enum built_in_function, tree, tree, tree, tree (*valueize) (tree) = NULL);` ¶
GIMPLE function: `tree` gimple_build `(gimple_seq *, location_t, enum built_in_function, tree, tree, tree, tree, tree (*valueize) (tree) = NULL);` ¶
GIMPLE function: `tree` gimple_convert `(gimple_seq *, location_t, tree, tree);` ¶

which is supposed to replace `force_gimple_operand (fold_buildN (...), ...)` and calls to `fold_convert`. Overloads without the `location_t` argument exist. Built statements are inserted on the provided sequence and simplification is performed using the optional valueization hook.