diff options
author | Tamar Christina <tamar.christina@arm.com> | 2024-07-03 09:31:09 +0100 |
---|---|---|
committer | Tamar Christina <tamar.christina@arm.com> | 2024-07-03 09:31:09 +0100 |
commit | 735edbf1e2479fa2323a2b4a9714fae1a0925f74 (patch) | |
tree | 0b2a4b2fc4e9a0e918f34961ca76bcc93e906515 /gcc | |
parent | 25127123100f04c2d5d70c6933a5f5aedcd69c40 (diff) | |
download | gcc-735edbf1e2479fa2323a2b4a9714fae1a0925f74.zip gcc-735edbf1e2479fa2323a2b4a9714fae1a0925f74.tar.gz gcc-735edbf1e2479fa2323a2b4a9714fae1a0925f74.tar.bz2 |
ivopts: replace constant_multiple_of with aff_combination_constant_multiple_p [PR114932]
The current implementation of constant_multiple_of is doing a more limited
version of aff_combination_constant_multiple_p.
The only non-debug usage of constant_multiple_of will proceed with the values
as affine trees. There is scope for further optimization here, namely I believe
that if constant_multiple_of returns the aff_tree after the conversion then
get_computation_aff_1 can use it instead of manually creating the aff_tree.
However I think it makes sense to first commit this smaller change and then
incrementally change things.
gcc/ChangeLog:
PR tree-optimization/114932
* tree-ssa-loop-ivopts.cc (constant_multiple_of): Use
aff_combination_constant_multiple_p instead.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.cc | 66 |
1 files changed, 8 insertions, 58 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.cc b/gcc/tree-ssa-loop-ivopts.cc index 7cae5bd..c3218a3 100644 --- a/gcc/tree-ssa-loop-ivopts.cc +++ b/gcc/tree-ssa-loop-ivopts.cc @@ -2146,65 +2146,15 @@ idx_record_use (tree base, tree *idx, static bool constant_multiple_of (tree top, tree bot, widest_int *mul) { - tree mby; - enum tree_code code; - unsigned precision = TYPE_PRECISION (TREE_TYPE (top)); - widest_int res, p0, p1; - - STRIP_NOPS (top); - STRIP_NOPS (bot); - - if (operand_equal_p (top, bot, 0)) - { - *mul = 1; - return true; - } - - code = TREE_CODE (top); - switch (code) - { - case MULT_EXPR: - mby = TREE_OPERAND (top, 1); - if (TREE_CODE (mby) != INTEGER_CST) - return false; - - if (!constant_multiple_of (TREE_OPERAND (top, 0), bot, &res)) - return false; - - *mul = wi::sext (res * wi::to_widest (mby), precision); - return true; - - case PLUS_EXPR: - case MINUS_EXPR: - if (!constant_multiple_of (TREE_OPERAND (top, 0), bot, &p0) - || !constant_multiple_of (TREE_OPERAND (top, 1), bot, &p1)) - return false; - - if (code == MINUS_EXPR) - p1 = -p1; - *mul = wi::sext (p0 + p1, precision); - return true; - - case INTEGER_CST: - if (TREE_CODE (bot) != INTEGER_CST) - return false; - - p0 = widest_int::from (wi::to_wide (top), SIGNED); - p1 = widest_int::from (wi::to_wide (bot), SIGNED); - if (p1 == 0) - return false; - *mul = wi::sext (wi::divmod_trunc (p0, p1, SIGNED, &res), precision); - return res == 0; - - default: - if (POLY_INT_CST_P (top) - && POLY_INT_CST_P (bot) - && constant_multiple_p (wi::to_poly_widest (top), - wi::to_poly_widest (bot), mul)) - return true; + aff_tree aff_top, aff_bot; + tree_to_aff_combination (top, TREE_TYPE (top), &aff_top); + tree_to_aff_combination (bot, TREE_TYPE (bot), &aff_bot); + poly_widest_int poly_mul; + if (aff_combination_constant_multiple_p (&aff_top, &aff_bot, &poly_mul) + && poly_mul.is_constant (mul)) + return true; - return false; - } + return false; } /* Return true if memory reference REF with step STEP may be unaligned. */ |