Hi,
As stated in patch for PR104116, 2 issues were found for unsigned division by
power of 2. The {ROUND,CEIL}_DIV_EXPR should not use the canonicalization
pattern, since their semantics are different.
The tests in patch for PR104116 already cover this scenario which currently
fail, therefore I have not added any tests in this patch.
Bootstrapped and regtested on ppc64le and x86_64. Ok for master?
Thanks and regards,
Avinash Jayakar
Canonicalization of unsigned division by power of 2 only applies to
{TRUNC,FLOOR,EXACT}_DIV, therefore remove the same pattern for
{CEIL,ROUND}_DIV, which was added in a previous commit.
2025-10-13 Avinash Jayakar <[email protected]>
gcc/ChangeLog:
PR tree-optimization/122213
* match.pd: Canonicalize unsigned pow2 div only for trunk, floor and
exact div.
---
gcc/match.pd | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/gcc/match.pd b/gcc/match.pd
index 4d0a803eaef..41ec9da8aaa 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -981,16 +981,18 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) && TYPE_UNSIGNED (TREE_TYPE (@0)))
(bit_and @0 (negate @1))))
-(for div (trunc_div ceil_div floor_div round_div exact_div)
+/* Canonicalize unsigned t / 4 to t >> 2. */
#if GIMPLE
- /* Canonicalize unsigned t / 4 to t >> 2. */
+(for div (trunc_div floor_div exact_div)
(simplify
(div @0 integer_pow2p@1)
(if (INTEGRAL_TYPE_P (type)
&& (TYPE_UNSIGNED (type) || tree_expr_nonnegative_p (@0)))
(rshift @0 { build_int_cst (integer_type_node,
- wi::exact_log2 (wi::to_wide (@1))); })))
+ wi::exact_log2 (wi::to_wide (@1))); }))))
#endif
+
+(for div (trunc_div ceil_div floor_div round_div exact_div)
/* Simplify (t * u) / u -> t. */
(simplify
(div (mult:c @0 @1) @1)
--
2.47.3