diff options
author | Richard Biener <rguenther@suse.de> | 2022-05-16 12:39:30 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-05-16 13:39:26 +0200 |
commit | 6f5b06032eb9e3085611b2e14ca040af465930c1 (patch) | |
tree | 17b17cb65e21c8ed73269e563b54d16e1978ee8a /gcc/gimple-fold.h | |
parent | adace78911705f25a06b48a0559612402065530e (diff) | |
download | gcc-6f5b06032eb9e3085611b2e14ca040af465930c1.zip gcc-6f5b06032eb9e3085611b2e14ca040af465930c1.tar.gz gcc-6f5b06032eb9e3085611b2e14ca040af465930c1.tar.bz2 |
Finish gimple_build API enhancement
This finishes the remaining parts of the gimple_build API enhancement,
converting the remaining workers to receive a gimple_stmt_iterator,
direction and update argument. It also moves the code_helper
receiving functions from gimple-match.h to gimple-fold.h.
2022-05-16 Richard Biener <rguenther@suse.de>
* gimple-match.h (gimple_build): Move code_helper overloads ...
* gimple-fold.h (gimple_build): ... here.
(gimple_build): Transition to new worker API. Provide
overloads from sequence-based API.
(gimple_convert): Likewise.
(gimple_convert_to_ptrofftype): Likewise.
(gimple_build_vector_from_val): Likewise.
(gimple_build_vector): Likewise.
(gimple_build_round_up): Likewise.
* gimple-fold.cc (gimple_build_insert_seq): New helper.
(gimple_build): Use it. Transition combined_fn and code_helper
API parts.
(gimple_convert): Transition to new worker API.
(gimple_convert_to_ptrofftype): Likewise.
(gimple_build_vector_from_val): Likewise.
(gimple_build_vector): Likewise.
(gimple_build_round_up): Likewise.
Diffstat (limited to 'gcc/gimple-fold.h')
-rw-r--r-- | gcc/gimple-fold.h | 145 |
1 files changed, 126 insertions, 19 deletions
diff --git a/gcc/gimple-fold.h b/gcc/gimple-fold.h index 520fde8..7d29ee9 100644 --- a/gcc/gimple-fold.h +++ b/gcc/gimple-fold.h @@ -98,59 +98,166 @@ gimple_build (gimple_seq *seq, enum tree_code code, tree type, Args ...ops) UNKNOWN_LOCATION, code, type, ops...); } -extern tree gimple_build (gimple_seq *, location_t, combined_fn, tree); -extern tree gimple_build (gimple_seq *, location_t, combined_fn, tree, tree); -extern tree gimple_build (gimple_seq *, location_t, combined_fn, - tree, tree, tree); -extern tree gimple_build (gimple_seq *, location_t, combined_fn, - tree, tree, tree, tree); +extern tree gimple_build (gimple_stmt_iterator *, bool, + enum gsi_iterator_update, + location_t, combined_fn, tree); +extern tree gimple_build (gimple_stmt_iterator *, bool, + enum gsi_iterator_update, + location_t, combined_fn, tree, tree); +extern tree gimple_build (gimple_stmt_iterator *, bool, + enum gsi_iterator_update, + location_t, combined_fn, tree, tree, tree); +extern tree gimple_build (gimple_stmt_iterator *, bool, + enum gsi_iterator_update, + location_t, combined_fn, tree, tree, tree, tree); +template<class ...Args> +inline tree +gimple_build (gimple_seq *seq, location_t loc, + combined_fn fn, tree type, Args ...args) +{ + static_assert (sizeof...(args) < 4, + "Number of arguments must be less than four"); + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_build (&gsi, false, GSI_CONTINUE_LINKING, + loc, fn, type, args...); +} template<class ...Args> inline tree gimple_build (gimple_seq *seq, combined_fn fn, tree type, Args ...args) { static_assert (sizeof...(args) < 4, "Number of arguments must be less than four"); - return gimple_build (seq, UNKNOWN_LOCATION, fn, type, args...); + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_build (&gsi, false, GSI_CONTINUE_LINKING, + UNKNOWN_LOCATION, fn, type, args...); } -extern tree gimple_convert (gimple_seq *, location_t, tree, tree); +extern tree gimple_build (gimple_stmt_iterator *, bool, + enum gsi_iterator_update, + location_t, code_helper, tree, tree); +extern tree gimple_build (gimple_stmt_iterator *, bool, + enum gsi_iterator_update, + location_t, code_helper, tree, tree, tree); +extern tree gimple_build (gimple_stmt_iterator *, bool, + enum gsi_iterator_update, + location_t, code_helper, tree, tree, tree, tree); + +template<class ...Args> +inline tree +gimple_build (gimple_seq *seq, location_t loc, + code_helper code, tree type, Args ...ops) +{ + static_assert (sizeof...(ops) < 4, + "Number of operands must be less than four"); + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_build (&gsi, false, GSI_CONTINUE_LINKING, + loc, code, type, ops...); +} +template<class ...Args> +inline tree +gimple_build (gimple_seq *seq, + code_helper code, tree type, Args ...ops) +{ + static_assert (sizeof...(ops) < 4, + "Number of operands must be less than four"); + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_build (&gsi, false, GSI_CONTINUE_LINKING, + UNKNOWN_LOCATION, code, type, ops...); +} + +extern tree gimple_convert (gimple_stmt_iterator *, bool, + enum gsi_iterator_update, + location_t, tree, tree); +inline tree +gimple_convert (gimple_seq *seq, location_t loc, tree type, tree op) +{ + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_convert (&gsi, false, GSI_CONTINUE_LINKING, loc, type, op); +} inline tree gimple_convert (gimple_seq *seq, tree type, tree op) { - return gimple_convert (seq, UNKNOWN_LOCATION, type, op); + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_convert (&gsi, false, GSI_CONTINUE_LINKING, + UNKNOWN_LOCATION, type, op); } -extern tree gimple_convert_to_ptrofftype (gimple_seq *, location_t, tree); +extern tree gimple_convert_to_ptrofftype (gimple_stmt_iterator *, bool, + enum gsi_iterator_update, + location_t, tree); +inline tree +gimple_convert_to_ptrofftype (gimple_seq *seq, location_t loc, tree op) +{ + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_convert_to_ptrofftype (&gsi, false, GSI_CONTINUE_LINKING, + loc, op); +} inline tree gimple_convert_to_ptrofftype (gimple_seq *seq, tree op) { - return gimple_convert_to_ptrofftype (seq, UNKNOWN_LOCATION, op); + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_convert_to_ptrofftype (&gsi, false, GSI_CONTINUE_LINKING, + UNKNOWN_LOCATION, op); } -extern tree gimple_build_vector_from_val (gimple_seq *, location_t, tree, - tree); +extern tree gimple_build_vector_from_val (gimple_stmt_iterator *, bool, + enum gsi_iterator_update, + location_t, tree, tree); +inline tree +gimple_build_vector_from_val (gimple_seq *seq, location_t loc, + tree type, tree op) +{ + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_build_vector_from_val (&gsi, false, GSI_CONTINUE_LINKING, + loc, type, op); +} inline tree gimple_build_vector_from_val (gimple_seq *seq, tree type, tree op) { - return gimple_build_vector_from_val (seq, UNKNOWN_LOCATION, type, op); + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_build_vector_from_val (&gsi, false, GSI_CONTINUE_LINKING, + UNKNOWN_LOCATION, type, op); } class tree_vector_builder; -extern tree gimple_build_vector (gimple_seq *, location_t, - tree_vector_builder *); +extern tree gimple_build_vector (gimple_stmt_iterator *, bool, + enum gsi_iterator_update, + location_t, tree_vector_builder *); +inline tree +gimple_build_vector (gimple_seq *seq, location_t loc, + tree_vector_builder *builder) +{ + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_build_vector (&gsi, false, GSI_CONTINUE_LINKING, + loc, builder); +} inline tree gimple_build_vector (gimple_seq *seq, tree_vector_builder *builder) { - return gimple_build_vector (seq, UNKNOWN_LOCATION, builder); + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_build_vector (&gsi, false, GSI_CONTINUE_LINKING, + UNKNOWN_LOCATION, builder); } -extern tree gimple_build_round_up (gimple_seq *, location_t, tree, tree, +extern tree gimple_build_round_up (gimple_stmt_iterator *, bool, + enum gsi_iterator_update, + location_t, tree, tree, unsigned HOST_WIDE_INT); inline tree +gimple_build_round_up (gimple_seq *seq, location_t loc, + tree type, tree old_size, unsigned HOST_WIDE_INT align) +{ + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_build_round_up (&gsi, false, GSI_CONTINUE_LINKING, + loc, type, old_size, align); +} +inline tree gimple_build_round_up (gimple_seq *seq, tree type, tree old_size, unsigned HOST_WIDE_INT align) { - return gimple_build_round_up (seq, UNKNOWN_LOCATION, type, old_size, align); + gimple_stmt_iterator gsi = gsi_last (*seq); + return gimple_build_round_up (&gsi, false, GSI_CONTINUE_LINKING, + UNKNOWN_LOCATION, type, old_size, align); } extern bool gimple_stmt_nonnegative_warnv_p (gimple *, bool *, int = 0); |