aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTamar Christina <tamar.christina@arm.com>2024-07-03 09:31:09 +0100
committerTamar Christina <tamar.christina@arm.com>2024-07-03 09:31:09 +0100
commit735edbf1e2479fa2323a2b4a9714fae1a0925f74 (patch)
tree0b2a4b2fc4e9a0e918f34961ca76bcc93e906515 /gcc
parent25127123100f04c2d5d70c6933a5f5aedcd69c40 (diff)
downloadgcc-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.cc66
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. */