GCC Middle and Back End API Reference
|
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "backend.h"
#include "rtl.h"
#include "tree.h"
#include "gimple.h"
#include "cfghooks.h"
#include "tree-pass.h"
#include "ssa.h"
#include "fold-const.h"
#include "gimplify.h"
#include "gimple-iterator.h"
#include "tree-cfg.h"
#include "tree-dfa.h"
#include "cfgloop.h"
#include "cfganal.h"
#include "target.h"
#include "tree-ssa-live.h"
#include "tree-ssa-coalesce.h"
#include "domwalk.h"
#include "memmodel.h"
#include "optabs.h"
#include "varasm.h"
#include "gimple-range.h"
#include "value-range.h"
#include "langhooks.h"
#include "gimplify-me.h"
#include "diagnostic-core.h"
#include "tree-eh.h"
#include "tree-pretty-print.h"
#include "alloc-pool.h"
#include "tree-into-ssa.h"
#include "tree-cfgcleanup.h"
#include "tree-switch-conversion.h"
#include "ubsan.h"
#include "stor-layout.h"
#include "gimple-lower-bitint.h"
Enumerations | |
enum | bitint_prec_kind { bitint_prec_small , bitint_prec_middle , bitint_prec_large , bitint_prec_huge } |
Functions | |
static bitint_prec_kind | bitint_precision_kind (int prec) |
static bitint_prec_kind | bitint_precision_kind (tree type) |
static unsigned | bitint_min_cst_precision (tree cst, int &ext) |
void | build_bitint_stmt_ssa_conflicts (gimple *stmt, live_track *live, ssa_conflicts *graph, bitmap names, void(*def)(live_track *, tree, ssa_conflicts *), void(*use)(live_track *, tree)) |
static bitint_prec_kind | arith_overflow_arg_kind (gimple *stmt) |
static unsigned int | gimple_lower_bitint (void) |
gimple_opt_pass * | make_pass_lower_bitint (gcc::context *ctxt) |
gimple_opt_pass * | make_pass_lower_bitint_O0 (gcc::context *ctxt) |
Variables | |
static int | small_max_prec |
static int | mid_min_prec |
static int | large_min_prec |
static int | huge_min_prec |
static int | limb_prec |
enum bitint_prec_kind |
Lower _BitInt(N) operations to scalar operations. Copyright (C) 2023-2024 Free Software Foundation, Inc. Contributed by Jakub Jelinek <jakub@redhat.com>. This file is part of GCC. GCC is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GCC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see <http://www.gnu.org/licenses/>.
Split BITINT_TYPE precisions in 4 categories. Small _BitInt, where target hook says it is a single limb, middle _BitInt which per ABI does not, but there is some INTEGER_TYPE in which arithmetics can be performed (operations on such _BitInt are lowered to casts to that arithmetic type and cast back; e.g. on x86_64 limb is DImode, but target supports TImode, so _BitInt(65) to _BitInt(128) are middle ones), large _BitInt which should by straight line code and finally huge _BitInt which should be handled by loops over the limbs.
Enumerator | |
---|---|
bitint_prec_small | |
bitint_prec_middle | |
bitint_prec_large | |
bitint_prec_huge |
|
static |
If STMT is .{ADD,SUB,MUL}_OVERFLOW with INTEGER_CST arguments, return the largest bitint_prec_kind of them, otherwise return bitint_prec_small.
References a, bitint_prec_small, bitint_precision_kind(), gimple_call_arg(), gimple_call_internal_fn(), gimple_call_internal_p(), i, is_gimple_call(), MAX, TREE_CODE, and TREE_TYPE.
Referenced by gimple_lower_bitint().
|
static |
Return minimum precision needed to describe INTEGER_CST CST. All bits above that precision up to precision of TREE_TYPE (CST) are cleared if EXT is set to 0, or set if EXT is set to -1.
References wi::min_precision(), SIGNED, wi::to_wide(), tree_int_cst_sgn(), TREE_TYPE, TYPE_SIGN, and TYPE_UNSIGNED.
Referenced by gimple_lower_bitint().
|
static |
Categorize _BitInt(PREC) as small, middle, large or huge.
References as_a(), bitint_prec_huge, bitint_prec_large, bitint_prec_middle, bitint_prec_small, gcc_assert, GET_MODE_PRECISION(), huge_min_prec, large_min_prec, bitint_info::limb_mode, limb_prec, MAX_FIXED_MODE_SIZE, mid_min_prec, small_max_prec, and targetm.
Referenced by arith_overflow_arg_kind(), bitint_precision_kind(), build_bitint_stmt_ssa_conflicts(), and gimple_lower_bitint().
|
static |
Same for a TYPE.
References bitint_precision_kind(), and TYPE_PRECISION.
void build_bitint_stmt_ssa_conflicts | ( | gimple * | stmt, |
live_track * | live, | ||
ssa_conflicts * | graph, | ||
bitmap | names, | ||
void(* | def )(live_track *, tree, ssa_conflicts *), | ||
void(* | use )(live_track *, tree) ) |
Replacement for normal processing of STMT in tree-ssa-coalesce.cc build_ssa_conflict_graph. The differences are: 1) don't process assignments with large/huge _BitInt lhs not in NAMES 2) for large/huge _BitInt multiplication/division/modulo process def only after processing uses rather than before to make uses conflict with the definition 3) for large/huge _BitInt uses not in NAMES mark the uses of their SSA_NAME_DEF_STMT (recursively), because those uses will be sunk into the final statement.
References bitint_prec_large, bitint_precision_kind(), bitmap_bit_p, FOR_EACH_SSA_TREE_OPERAND, gimple_assign_lhs(), gimple_assign_rhs_code(), is_gimple_assign(), names, NULL_TREE, SSA_NAME_DEF_STMT, SSA_NAME_VERSION, SSA_OP_DEF, SSA_OP_USE, TREE_CODE, TREE_TYPE, and worklist.
Referenced by build_ssa_conflict_graph().
|
static |
Entry point for _BitInt(N) operation lowering during optimization.
References add_phi_arg(), tree_switch_conversion::switch_decision_tree::analyze_switch_statement(), arith_overflow_arg_kind(), as_a(), basic_block_def::aux, bitint_min_cst_precision(), bitint_prec_large, bitint_prec_middle, bitint_prec_small, bitint_precision_kind(), BITMAP_ALLOC, bitmap_and_compl_into(), bitmap_bit_p, BITMAP_FREE, bitmap_set_bit, build1(), build2(), build_array_type_nelts(), build_bitint_type(), build_fold_addr_expr, build_int_cst(), build_nonstandard_integer_type(), build_pointer_type(), build_zero_cst(), builtin_decl_implicit(), calculate_dominance_info(), CASE_HIGH, CASE_LOW, CDI_DOMINATORS, CDI_POST_DOMINATORS, CEIL, cfun, cleanup_tree_cfg(), clear_aux_for_blocks(), coalesce_ssa_name(), COMPARISON_CLASS_P, copy_ssa_name(), create_phi_node(), create_tmp_reg(), create_tmp_var, DECL_BIT_FIELD_TYPE, disable_ranger(), dom_info_available_p(), dump_file, dump_flags, dump_var_map(), EDGE_COUNT, EDGE_PRED, enable_ranger(), ENTRY_BLOCK_PTR_FOR_FN, profile_probability::even(), EXECUTE_IF_SET_IN_BITMAP, find_fallthru_edge(), fold_build2, fold_convert, FOR_EACH_BB_FN, FOR_EACH_BB_REVERSE_FN, FOR_EACH_IMM_USE_FAST, FOR_EACH_IMM_USE_ON_STMT, FOR_EACH_IMM_USE_STMT, FOR_EACH_SSA_TREE_OPERAND, FOR_EACH_SSA_USE_OPERAND, FOR_EACH_VEC_ELT, free_dominance_info(), g, gcc_assert, gcc_checking_assert, gcc_unreachable, get_or_create_ssa_default_def(), gimple_assign_cast_p(), gimple_assign_lhs(), gimple_assign_load_p(), gimple_assign_rhs1(), gimple_assign_rhs2(), gimple_assign_rhs3(), gimple_assign_rhs_code(), gimple_assign_set_rhs1(), gimple_assign_set_rhs2(), gimple_assign_single_p(), gimple_bb(), gimple_build_assign(), gimple_build_call(), gimple_build_cond(), gimple_build_nop(), gimple_call_lhs(), gimple_clobber_p(), gimple_get_lhs(), gimple_has_volatile_ops(), gimple_location(), gimple_num_ops(), gimple_op(), gimple_phi_arg_def(), gimple_phi_arg_edge(), gimple_phi_num_args(), gimple_phi_result(), gimple_set_lhs(), gimple_set_location(), gimple_set_op(), gimple_store_p(), gimple_switch_index(), gimple_switch_num_labels(), group_case_labels_stmt(), gsi_after_labels(), gsi_bb(), gsi_commit_edge_inserts(), gsi_end_p(), gsi_for_stmt(), gsi_insert_after(), gsi_insert_before(), gsi_insert_on_edge(), gsi_last_bb(), gsi_next(), gsi_prev(), gsi_remove(), gsi_replace(), gsi_safe_insert_before(), GSI_SAME_STMT, gsi_start_phis(), gsi_stmt(), has_single_use(), huge_min_prec, i, init_var_map(), integer_minus_one_node, integer_zerop(), INTEGRAL_TYPE_P, is_gimple_assign(), is_gimple_call(), is_gimple_debug(), large_min_prec, limb_prec, make_edge(), make_ssa_name(), mark_addressable(), mark_virtual_operands_for_renaming(), MAX, MAX_FIXED_MODE_SIZE, mid_min_prec, NULL, NULL_TREE, num_ssa_names, num_var_partitions(), partition_view_normal(), POINTER_TYPE_P, basic_block_def::preds, print_generic_expr(), release_ssa_name(), safe_dyn_cast(), SCALAR_FLOAT_TYPE_P, set_immediate_dominator(), set_ssa_default_def(), SET_USE, single_imm_use(), single_succ_edge(), sizetype, small_max_prec, split_block(), ssa_name, SSA_NAME_DEF_STMT, SSA_NAME_IS_DEFAULT_DEF, SSA_NAME_IS_VIRTUAL_OPERAND, SSA_NAME_OCCURS_IN_ABNORMAL_PHI, SSA_NAME_VAR, SSA_NAME_VERSION, SSA_OP_ALL_OPERANDS, SSA_OP_USE, stmt_ends_bb_p(), suppress_warning(), TDF_DETAILS, TDF_SLIM, TODO_cleanup_cfg, TODO_update_ssa, TODO_update_ssa_only_virtuals, TREE_CODE, tree_int_cst_equal(), TREE_OPERAND, tree_output_constant_def(), tree_to_uhwi(), TREE_TYPE, TYPE_PRECISION, TYPE_SIZE, TYPE_SIZE_UNIT, TYPE_UNSIGNED, UNKNOWN_LOCATION, update_stmt(), USE_FROM_PTR, USE_STMT, VAR_P, and var_to_partition().
gimple_opt_pass * make_pass_lower_bitint | ( | gcc::context * | ctxt | ) |
gimple_opt_pass * make_pass_lower_bitint_O0 | ( | gcc::context * | ctxt | ) |
|
static |
Referenced by bitint_precision_kind(), and gimple_lower_bitint().
|
static |
Referenced by bitint_precision_kind(), and gimple_lower_bitint().
|
static |
Referenced by bitint_precision_kind(), expand_expr_real_1(), and gimple_lower_bitint().
|
static |
Referenced by bitint_precision_kind(), and gimple_lower_bitint().
|
static |
Caches to speed up bitint_precision_kind.
Referenced by bitint_precision_kind(), and gimple_lower_bitint().