GCC Middle and Back End API Reference
|
#include "config.h"
#include "system.h"
#include "coretypes.h"
#include "backend.h"
#include "tree.h"
#include "gimple-expr.h"
#include "tree-pretty-print.h"
#include "fold-const.h"
#include "cfgloop.h"
#include "tree-ssa-loop-ivopts.h"
#include "tree-ssa-loop-niter.h"
#include "tree-chrec.h"
#include "gimple.h"
#include "tree-ssa-loop.h"
#include "dumpfile.h"
#include "tree-scalar-evolution.h"
Evaluates "CHREC (X)" when the varying variable is VAR. Example: Given the following parameters, var = 1 chrec = {3, +, 4}_1 x = 10 The result is given by the Newton's interpolating formula: 3 * \binom{10}{0} + 4 * \binom{10}{1}.
References automatically_generated_chrec_p(), build_int_cst(), build_polynomial_chrec(), build_real_from_int_cst(), CASE_CONVERT, chrec_apply(), chrec_contains_symbols_defined_in_loop(), chrec_convert(), chrec_convert_rhs(), chrec_dont_know, chrec_evaluate(), chrec_fold_multiply(), chrec_fold_plus(), CHREC_LEFT, CHREC_RIGHT, chrec_type(), CHREC_VARIABLE, dump_file, dump_flags, evolution_function_is_affine_p(), int_fits_type_p(), integer_all_onesp(), INTEGRAL_TYPE_P, NULL, operand_equal_p(), POINTER_TYPE_P, print_generic_expr(), SCALAR_FLOAT_TYPE_P, TDF_SCEV, TREE_CODE, tree_int_cst_sgn(), TREE_OPERAND, TREE_TYPE, TYPE_OVERFLOW_WRAPS, TYPE_PRECISION, and unsigned_type_for().
Referenced by chrec_apply(), chrec_apply_map(), chrec_is_positive(), and compute_overall_effect_of_inner_loop().
For a given CHREC and an induction variable map IV_MAP that maps (loop->num, expr) for every loop number of the current_loops an expression, calls chrec_apply when the expression is not NULL.
References chrec_apply(), FOR_EACH_VEC_ELT, and i.
Returns the evolution part of CHREC in LOOP_NUM when RIGHT is true, otherwise returns the initial condition in LOOP_NUM.
References automatically_generated_chrec_p(), build_polynomial_chrec(), cfun, chrec_component_in_loop_num(), CHREC_LEFT, CHREC_RIGHT, CHREC_VARIABLE, flow_loop_nested_p(), gcc_assert, get_chrec_loop(), get_loop(), NULL_TREE, and TREE_CODE.
Referenced by chrec_component_in_loop_num(), evolution_part_in_loop_num(), and initial_condition_in_loop_num().
bool chrec_contains_symbols | ( | const_tree | chrec, |
class loop * | loop ) |
Return true if CHREC contains any symbols. If LOOP is not NULL, check if CHREC contains any chrec which is invariant wrto the loop (nest), in other words, chrec defined by outer loops of loop, so from LOOP's point of view, the chrec is considered as a SYMBOL.
References chrec_contains_symbols(), and visited.
|
static |
Determines whether the chrec contains symbolic names or not. If LOOP isn't NULL, we also consider chrec wrto outer loops of LOOP as symbol.
References chrec_contains_symbols(), flow_loop_nested_p(), get_chrec_loop(), i, NULL, NULL_TREE, TREE_CODE, TREE_OPERAND, TREE_OPERAND_LENGTH, VAR_P, and visited.
Referenced by analyze_miv_subscript(), analyze_overlapping_iterations(), analyze_siv_subscript(), can_use_analyze_subscript_affine_affine(), chrec_contains_symbols(), chrec_contains_symbols(), and constant_after_peeling().
bool chrec_contains_symbols_defined_in_loop | ( | const_tree | chrec, |
unsigned | loop_nb ) |
Return true when CHREC contains symbolic names defined in LOOP_NB.
References chrec_contains_symbols_defined_in_loop(), and visited.
|
static |
Return true when CHREC contains symbolic names defined in LOOP_NB.
References cfun, chrec_contains_symbols_defined_in_loop(), flow_loop_nested_p(), get_loop(), i, is_gimple_min_invariant(), loop_containing_stmt(), NULL, NULL_TREE, SSA_NAME_DEF_STMT, SSA_NAME_IS_DEFAULT_DEF, TREE_CODE, TREE_OPERAND, TREE_OPERAND_LENGTH, and visited.
Referenced by loop_cand::analyze_carried_vars(), analyze_scalar_evolution_1(), chrec_apply(), chrec_contains_symbols_defined_in_loop(), chrec_contains_symbols_defined_in_loop(), chrec_fold_multiply(), chrec_fold_plus_1(), compute_overall_effect_of_inner_loop(), final_value_replacement_loop(), idx_infer_loop_bounds(), infer_loop_bounds_from_pointer_arith(), infer_loop_bounds_from_signedness(), no_evolution_in_loop_p(), object_address_invariant_in_loop_p(), prepare_perfect_loop_nest(), scev_analyzable_p(), and simple_iv_with_niters().
bool chrec_contains_undetermined | ( | const_tree | chrec | ) |
References chrec_contains_undetermined(), and visited.
|
static |
Determines whether the chrec contains undetermined coefficients.
References chrec_contains_undetermined(), chrec_dont_know, i, NULL_TREE, TREE_OPERAND, TREE_OPERAND_LENGTH, and visited.
Referenced by loop_cand::analyze_carried_vars(), analyze_overlapping_iterations(), build_classic_dist_vector_1(), canonicalize_loop_induction_variables(), chrec_contains_undetermined(), chrec_contains_undetermined(), chrec_is_positive(), compute_access_stride(), constant_after_peeling(), find_loop_niter_by_eval(), gather_chrec_stats(), infer_loop_bounds_from_pointer_arith(), infer_loop_bounds_from_signedness(), predicate_scalar_phi(), scev_analyzable_p(), scev_probably_wraps_p(), simple_iv_with_niters(), vec_init_loop_exit_info(), vect_analyze_loop_form(), and vect_get_loop_niters().
tree chrec_convert | ( | tree | type, |
tree | chrec, | ||
gimple * | at_stmt, | ||
bool | use_overflow_semantics, | ||
tree | from ) |
Convert CHREC to TYPE. When the analyzer knows the context in which the CHREC is built, it sets AT_STMT to the statement that contains the definition of the analyzed variable, otherwise the conversion is less accurate: the information is used for determining a more accurate estimation of the number of iterations. By default AT_STMT could be safely set to NULL_TREE. The following rule is always true: TREE_TYPE (chrec) == TREE_TYPE (CHREC_LEFT (chrec)) == TREE_TYPE (CHREC_RIGHT (chrec)). An example of what could happen when adding two chrecs and the type of the CHREC_RIGHT is different than CHREC_LEFT is: {(uint) 0, +, (uchar) 10} + {(uint) 0, +, (uchar) 250} that would produce a wrong result if CHREC_RIGHT is not (uint): {(uint) 0, +, (uchar) 4} instead of {(uint) 0, +, (uint) 260} USE_OVERFLOW_SEMANTICS is true if this function should assume that the rules for overflow of the given language apply (e.g., that signed arithmetics in C does not overflow) -- i.e., to use them to avoid unnecessary tests, but also to enforce that the result follows them. FROM is the source variable converted if it's not NULL.
References chrec_convert_1().
Referenced by scev_dfs::add_to_evolution_1(), analyze_miv_subscript(), analyze_siv_subscript_cst_affine(), analyze_ziv_subscript(), can_use_analyze_subscript_affine_affine(), chrec_apply(), chrec_convert_aggressive(), chrec_convert_rhs(), chrec_evaluate(), chrec_fold_multiply(), chrec_fold_plus(), chrec_fold_plus_1(), convert_affine_scev(), scev_dfs::follow_ssa_edge_binary(), scev_dfs::follow_ssa_edge_expr(), initialize_matrix_A(), instantiate_scev_binary(), instantiate_scev_convert(), instantiate_scev_not(), and interpret_rhs_expr().
|
static |
Convert CHREC to TYPE. When the analyzer knows the context in which the CHREC is built, it sets AT_STMT to the statement that contains the definition of the analyzed variable, otherwise the conversion is less accurate: the information is used for determining a more accurate estimation of the number of iterations. By default AT_STMT could be safely set to NULL_TREE. USE_OVERFLOW_SEMANTICS is true if this function should assume that the rules for overflow of the given language apply (e.g., that signed arithmetics in C does not overflow) -- i.e., to use them to avoid unnecessary tests, but also to enforce that the result follows them. FROM is the source variable converted if it's not NULL.
References automatically_generated_chrec_p(), build_polynomial_chrec(), chrec_convert_1(), chrec_dont_know, CHREC_LEFT, CHREC_RIGHT, chrec_type(), CHREC_VARIABLE, CONSTANT_CLASS_P, convert_affine_scev(), evolution_function_is_affine_p(), fold_build2, fold_convert, get_chrec_loop(), int_fits_type_p(), loop::num, TREE_CODE, TREE_OPERAND, TREE_OVERFLOW, TYPE_OVERFLOW_UNDEFINED, TYPE_PRECISION, unsigned_type_for(), and useless_type_conversion_p().
Referenced by chrec_convert(), and chrec_convert_1().
Convert CHREC to TYPE, without regard to signed overflows. Returns the new chrec if something else than what chrec_convert would do happens, NULL_TREE otherwise. This function set TRUE to variable pointed by FOLD_CONVERSIONS if the result chrec may overflow.
References automatically_generated_chrec_p(), build_polynomial_chrec(), chrec_convert(), chrec_convert_aggressive(), CHREC_LEFT, CHREC_RIGHT, CHREC_VARIABLE, convert_affine_scev(), evolution_function_is_affine_p(), gcc_assert, get_chrec_loop(), NULL, NULL_TREE, loop::num, POINTER_TYPE_P, sizetype, TREE_CODE, TREE_TYPE, TYPE_PRECISION, and useless_type_conversion_p().
Referenced by chrec_convert_aggressive(), and instantiate_scev_convert().
Convert CHREC for the right hand side of a CHREC. The increment for a pointer type is always sizetype.
References chrec_convert(), POINTER_TYPE_P, and sizetype.
Referenced by scev_dfs::add_to_evolution_1(), chrec_apply(), chrec_fold_multiply(), instantiate_scev_binary(), and instantiate_scev_poly().
Helper function. Use the Newton's interpolating formula for evaluating the value of the evolution function. The result may be in an unsigned type of CHREC.
References cfun, chrec_convert(), chrec_dont_know, chrec_evaluate(), chrec_fold_plus(), CHREC_LEFT, CHREC_RIGHT, CHREC_VARIABLE, flow_loop_nested_p(), fold_build2, get_chrec_loop(), get_loop(), INTEGRAL_TYPE_P, NULL, TREE_CODE, tree_fold_binomial(), TREE_TYPE, TYPE_OVERFLOW_WRAPS, and unsigned_type_for().
Referenced by chrec_apply(), and chrec_evaluate().
When the operands are automatically_generated_chrec_p, the fold has to respect the semantics of the operands.
References chrec_dont_know, chrec_known, and chrec_not_analyzed_yet.
Referenced by chrec_fold_minus(), chrec_fold_multiply(), chrec_fold_plus(), and chrec_fold_plus_1().
Fold the subtraction of two chrecs.
References automatically_generated_chrec_p(), chrec_fold_automatically_generated_operands(), chrec_fold_plus_1(), and integer_zerop().
Referenced by analyze_miv_subscript(), analyze_siv_subscript_cst_affine(), analyze_ziv_subscript(), can_use_analyze_subscript_affine_affine(), chrec_fold_op(), chrec_fold_plus_1(), chrec_fold_plus_poly_poly(), chrec_is_positive(), instantiate_scev_binary(), instantiate_scev_not(), and interpret_rhs_expr().
Fold the multiplication of two chrecs.
References automatically_generated_chrec_p(), build_int_cst(), build_polynomial_chrec(), CASE_CONVERT, chrec_contains_symbols_defined_in_loop(), chrec_convert(), chrec_convert_rhs(), chrec_dont_know, chrec_fold_automatically_generated_operands(), chrec_fold_multiply(), chrec_fold_multiply_poly_poly(), CHREC_LEFT, CHREC_RIGHT, CHREC_VARIABLE, fold_build2, gcc_checking_assert, gcc_unreachable, integer_onep(), integer_zerop(), INTEGRAL_TYPE_P, wi::mul(), NULL, wi::OVF_NONE, wi::to_wide(), TREE_CODE, tree_contains_chrecs(), tree_nop_conversion_p(), TREE_OPERAND, TREE_TYPE, TYPE_OVERFLOW_UNDEFINED, TYPE_SIGN, TYPE_UNSIGNED, and unsigned_type_for().
Referenced by scev_dfs::add_to_evolution(), chrec_apply(), chrec_fold_multiply(), chrec_fold_multiply_poly_poly(), chrec_fold_op(), chrec_fold_plus_1(), chrec_fold_plus_poly_poly(), instantiate_scev_binary(), instantiate_scev_not(), and interpret_rhs_expr().
Fold the multiplication of two polynomial functions.
References build_int_cst(), build_polynomial_chrec(), build_real(), chrec_dont_know, chrec_fold_multiply(), chrec_fold_plus(), CHREC_LEFT, CHREC_RIGHT, chrec_type(), CHREC_VARIABLE, dconst2, flow_loop_nested_p(), gcc_assert, gcc_checking_assert, get_chrec_loop(), LOOP_CLOSED_SSA, loops_state_satisfies_p(), SCALAR_FLOAT_TYPE_P, TREE_CODE, and useless_type_conversion_p().
Referenced by chrec_fold_multiply().
Fold the addition of two chrecs.
References automatically_generated_chrec_p(), chrec_convert(), chrec_fold_automatically_generated_operands(), chrec_fold_plus_1(), integer_zerop(), NULL, and POINTER_TYPE_P.
Referenced by scev_dfs::add_to_evolution_1(), chrec_apply(), chrec_evaluate(), chrec_fold_multiply_poly_poly(), chrec_fold_op(), chrec_fold_plus_1(), chrec_fold_plus_poly_poly(), instantiate_scev_binary(), interpret_rhs_expr(), and simplify_peeled_chrec().
Fold the addition of two chrecs.
References automatically_generated_chrec_p(), build2(), build_int_cst_type(), build_polynomial_chrec(), build_real(), CASE_CONVERT, chrec_contains_symbols_defined_in_loop(), chrec_convert(), chrec_dont_know, chrec_fold_automatically_generated_operands(), chrec_fold_minus(), chrec_fold_multiply(), chrec_fold_plus(), chrec_fold_plus_1(), chrec_fold_plus_poly_poly(), CHREC_LEFT, CHREC_RIGHT, CHREC_VARIABLE, dconstm1, fold_build2, fold_build_pointer_plus, fold_convert, gcc_checking_assert, INTEGRAL_TYPE_P, NULL, SCALAR_FLOAT_TYPE_P, TREE_CODE, tree_contains_chrecs(), tree_nop_conversion_p(), TREE_OPERAND, TREE_TYPE, and TYPE_UNSIGNED.
Referenced by chrec_fold_minus(), chrec_fold_plus(), and chrec_fold_plus_1().
|
inlinestatic |
Chains of recurrences. Copyright (C) 2003-2025 Free Software Foundation, Inc. Contributed by Sebastian Pop <pop@cri.ensmp.fr> 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/>.
This file implements operations on chains of recurrences. Chains of recurrences are used for modeling evolution functions of scalar variables.
Extended folder for chrecs.
Fold the addition of two polynomial functions.
References build_int_cst_type(), build_polynomial_chrec(), build_real(), chrec_dont_know, chrec_fold_minus(), chrec_fold_multiply(), chrec_fold_plus(), CHREC_LEFT, CHREC_RIGHT, chrec_type(), CHREC_VARIABLE, chrec_zerop(), dconstm1, flow_loop_nested_p(), gcc_assert, gcc_checking_assert, get_chrec_loop(), LOOP_CLOSED_SSA, loops_state_satisfies_p(), POINTER_TYPE_P, ptrofftype_p(), SCALAR_FLOAT_TYPE_P, TREE_CODE, and useless_type_conversion_p().
Referenced by chrec_fold_plus_1().
Merges two evolution functions that were found by following two alternate paths of a conditional expression.
References chrec_dont_know, chrec_known, chrec_not_analyzed_yet, and eq_evolutions_p().
Referenced by analyze_evolution_in_loop(), analyze_initial_condition(), scev_dfs::follow_ssa_edge_in_condition_phi(), and interpret_condition_phi().
Replaces the initial condition in CHREC with INIT_COND.
References automatically_generated_chrec_p(), build_polynomial_chrec(), CHREC_LEFT, chrec_replace_initial_condition(), CHREC_RIGHT, chrec_type(), CHREC_VARIABLE, gcc_assert, and TREE_CODE.
Referenced by chrec_replace_initial_condition(), and dr_analyze_indices().
bool convert_affine_scev | ( | class loop * | loop, |
tree | type, | ||
tree * | base, | ||
tree * | step, | ||
gimple * | at_stmt, | ||
bool | use_overflow_semantics, | ||
tree | from ) |
Converts BASE and STEP of affine scev to TYPE. LOOP is the loop whose iv the scev corresponds to. AT_STMT is the statement at that the scev is evaluated. USE_OVERFLOW_SEMANTICS is true if this function should assume that the rules for overflow of the given language apply (e.g., that signed arithmetics in C does not overflow) -- i.e., to use them to avoid unnecessary tests, but also to enforce that the result follows them. FROM is the source variable converted if it's not NULL. Returns true if the conversion succeeded, false otherwise.
References automatically_generated_chrec_p(), build_nonstandard_integer_type(), chrec_convert(), nowrap_type_p(), NULL_TREE, POINTER_TYPE_P, scev_probably_wraps_p(), sizetype, TREE_TYPE, TYPE_PRECISION, and TYPE_UNSIGNED.
Referenced by chrec_convert_1(), chrec_convert_aggressive(), and idx_find_step().
bool eq_evolutions_p | ( | const_tree | chrec0, |
const_tree | chrec1 ) |
Returns true when CHREC0 == CHREC1.
References CASE_CONVERT, CHREC_LEFT, CHREC_RIGHT, CHREC_VARIABLE, eq_evolutions_p(), NULL_TREE, operand_equal_p(), TREE_CODE, TREE_OPERAND, TREE_TYPE, and types_compatible_p().
Referenced by analyze_miv_subscript(), analyze_overlapping_iterations(), analyze_subscript_affine_affine(), chrec_merge(), eq_evolutions_p(), same_access_functions(), and same_data_refs().
bool evolution_function_is_affine_multivariate_p | ( | const_tree | chrec, |
int | loopnum ) |
Determine whether the given tree is an affine multivariate evolution.
References CHREC_LEFT, CHREC_RIGHT, CHREC_VARIABLE, evolution_function_is_affine_multivariate_p(), evolution_function_is_invariant_rec_p(), NULL_TREE, and TREE_CODE.
Referenced by access_functions_are_affine_or_constant_p(), analyze_miv_subscript(), analyze_overlapping_iterations(), evolution_function_is_affine_multivariate_p(), gather_chrec_stats(), and scev_is_linear_expression().
Return true if CHREC is invariant in loop LOOPNUM, false otherwise.
References evolution_function_is_invariant_rec_p().
Referenced by access_functions_are_affine_or_constant_p(), any_access_function_variant_p(), evolution_function_is_affine_in_loop(), evolution_function_is_affine_p(), and invariant_access_functions().
Recursive helper function.
References cfun, CHREC_LEFT, CHREC_RIGHT, CHREC_VARIABLE, evolution_function_is_constant_p(), evolution_function_is_invariant_rec_p(), expr_invariant_in_loop_p(), flow_loop_nested_p(), get_chrec_loop(), get_loop(), TREE_CODE, TREE_OPERAND, and TREE_OPERAND_LENGTH.
Referenced by evolution_function_is_affine_multivariate_p(), evolution_function_is_invariant_p(), and evolution_function_is_invariant_rec_p().
bool evolution_function_is_univariate_p | ( | const_tree | chrec, |
int | loopnum ) |
Determine whether the given tree is a function in zero or one variables with respect to loop specified by LOOPNUM. Note only positive LOOPNUM stands for a real loop.
References cfun, CHREC_LEFT, CHREC_RIGHT, CHREC_VARIABLE, evolution_function_is_univariate_p(), flow_loop_nested_p(), get_chrec_loop(), get_loop(), NULL, NULL_TREE, TREE_CODE, and tree_contains_chrecs().
Referenced by add_other_self_distances(), evolution_function_is_univariate_p(), and siv_subscript_p().
bool evolution_function_right_is_integer_cst | ( | const_tree | chrec | ) |
Determines whether the expression CHREC contains only interger consts in the right parts.
References CASE_CONVERT, CHREC_LEFT, CHREC_RIGHT, evolution_function_right_is_integer_cst(), NULL_TREE, TREE_CODE, and TREE_OPERAND.
Referenced by evolution_function_right_is_integer_cst().
Returns the evolution part in LOOP_NUM. Example: the call evolution_part_in_loop_num ({{0, +, 1}_1, +, 2}_1, 1) returns {1, +, 2}_1
References chrec_component_in_loop_num().
Referenced by get_scev_info(), idx_infer_loop_bounds(), idx_within_array_bound(), infer_loop_bounds_from_pointer_arith(), infer_loop_bounds_from_signedness(), vect_analyze_scalar_cycles_1(), and vect_is_simple_iv_evolution().
Iterates over all the components of SCEV, and calls CBCK.
References for_each_scev_op(), TREE_CODE, TREE_CODE_LENGTH, and TREE_OPERAND.
Referenced by for_each_scev_op().
Returns a univariate function that represents the evolution in LOOP_NUM. Mask the evolution of any other loop.
References automatically_generated_chrec_p(), build_polynomial_chrec(), cfun, chrec_dont_know, CHREC_LEFT, CHREC_RIGHT, flow_loop_nested_p(), get_chrec_loop(), get_loop(), hide_evolution_in_other_loops_than_loop(), initial_condition(), and TREE_CODE.
Referenced by hide_evolution_in_other_loops_than_loop(), and no_evolution_in_loop_p().
Returns the initial condition of a given CHREC.
References automatically_generated_chrec_p(), CHREC_LEFT, initial_condition(), and TREE_CODE.
Referenced by analyze_siv_subscript_cst_affine(), dr_analyze_indices(), hide_evolution_in_other_loops_than_loop(), idx_infer_loop_bounds(), idx_within_array_bound(), and initial_condition().
Returns the initial condition in LOOP_NUM. Example: the call initial_condition_in_loop_num ({{0, +, 1}_1, +, 2}_2, 2) returns {0, +, 1}_1
References chrec_component_in_loop_num().
Referenced by get_scev_info(), idx_infer_loop_bounds(), infer_loop_bounds_from_pointer_arith(), infer_loop_bounds_from_signedness(), nb_vars_in_chrec(), vect_analyze_scalar_cycles_1(), and vect_is_simple_iv_evolution().
bool is_multivariate_chrec | ( | const_tree | chrec | ) |
Determine whether the given chrec is multivariate or not.
References CHREC_LEFT, CHREC_RIGHT, CHREC_VARIABLE, is_multivariate_chrec_rec(), NULL_TREE, and TREE_CODE.
|
static |
Observers.
Helper function for is_multivariate_chrec.
References CHREC_LEFT, CHREC_RIGHT, CHREC_VARIABLE, is_multivariate_chrec_rec(), NULL_TREE, and TREE_CODE.
Referenced by is_multivariate_chrec(), and is_multivariate_chrec_rec().
unsigned nb_vars_in_chrec | ( | tree | chrec | ) |
Returns the number of variables of CHREC. Example: the call nb_vars_in_chrec ({{0, +, 1}_5, +, 2}_6) returns 2.
References CHREC_VARIABLE, initial_condition_in_loop_num(), nb_vars_in_chrec(), NULL_TREE, and TREE_CODE.
Referenced by analyze_subscript_affine_affine(), and nb_vars_in_chrec().
Returns true when the operation can be part of a linear expression.
References CASE_CONVERT, and TREE_CODE.
Referenced by scev_is_linear_expression().
Set or reset the evolution of CHREC to NEW_EVOL in loop LOOP_NUM. This function is essentially used for setting the evolution to chrec_dont_know, for example after having determined that it is impossible to say how many times a loop will execute.
References build_polynomial_chrec(), cfun, CHREC_LEFT, CHREC_RIGHT, chrec_type(), CHREC_VARIABLE, flow_loop_nested_p(), gcc_assert, get_chrec_loop(), get_loop(), POINTER_TYPE_P, ptrofftype_p(), reset_evolution_in_loop(), and TREE_CODE.
Referenced by reset_evolution_in_loop().
enum ev_direction scev_direction | ( | const_tree | chrec | ) |
Returns EV_GROWS if CHREC grows (assuming that it does not overflow), EV_DECREASES if it decreases, and EV_UNKNOWN if we cannot determine which of these cases happens.
References CHREC_RIGHT, EV_DIR_DECREASES, EV_DIR_GROWS, EV_DIR_UNKNOWN, evolution_function_is_affine_p(), TREE_CODE, and tree_int_cst_sign_bit().
Referenced by compute_access_range(), and get_scev_info().
Return true when SCEV is a linear expression. Linear expressions can contain additions, substractions and multiplications. Multiplications are restricted to constant scaling: "cst * x".
References CHREC_VARIABLE, evolution_function_is_affine_multivariate_p(), evolution_function_is_constant_p(), NULL, operator_is_linear(), scev_is_linear_expression(), TREE_CODE, TREE_CODE_LENGTH, tree_contains_chrecs(), and TREE_OPERAND.
Referenced by scev_analyzable_p(), and scev_is_linear_expression().
bool tree_contains_chrecs | ( | const_tree | expr, |
int * | size ) |
References tree_contains_chrecs(), and visited.
Referenced by no_evolution_in_loop_p(), and tree_does_not_contain_chrecs().
|
static |
Determines whether the tree EXPR contains chrecs, and increment SIZE if it is not a NULL pointer by an estimation of the depth of the tree.
References i, NULL_TREE, tree_contains_chrecs(), tree_is_chrec(), TREE_OPERAND, TREE_OPERAND_LENGTH, and visited.
Referenced by loop_cand::analyze_induction_var(), chrec_fold_multiply(), chrec_fold_plus_1(), compute_access_range(), compute_access_stride(), evolution_function_is_univariate_p(), get_base_for_alignment_1(), idx_infer_loop_bounds(), infer_loop_bounds_from_pointer_arith(), infer_loop_bounds_from_signedness(), scev_is_linear_expression(), simple_iv_with_niters(), tree_contains_chrecs(), and tree_contains_chrecs().
Operations.
Evaluate the binomial coefficient. Return NULL_TREE if the intermediate calculation overflows, otherwise return C(n,k) with type TYPE.
References build_int_cst(), wi::fits_to_tree_p(), fold_convert, i, wi::ltu_p(), NULL_TREE, loop::num, wi::smul(), wi::to_widest(), wi::udiv_trunc(), and wide_int_to_tree().
Referenced by chrec_evaluate().