[gcc r17-2670] middle-end: Fold averages with equal operands [PR122715]

Jeff Law via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:3b126071b10e5b12e7694f7a237f746e8db6d82c

commit r17-2670-g3b126071b10e5b12e7694f7a237f746e8db6d82c
Author: Odysseas Georgoudis <[email protected]>
Date:   Thu Jul 23 08:46:24 2026 -0600

    middle-end: Fold averages with equal operands [PR122715]
    
    IFN_AVG_FLOOR (x, x) and IFN_AVG_CEIL (x, x) both
    produce x.  Fold these cases in match.pd.
    
            PR middle-end/122715
    
    gcc/ChangeLog:
    
            * match.pd: Fold IFN_AVG_FLOOR and IFN_AVG_CEIL with equal
            operands.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.dg/pr122715.c: New test.

Diff:
---
 gcc/match.pd                    |  6 ++++++
 gcc/testsuite/gcc.dg/pr122715.c | 22 ++++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/gcc/match.pd b/gcc/match.pd
index 723780b8c381..536d5125a0b6 100644
--- a/gcc/match.pd
+++ b/gcc/match.pd
@@ -2320,7 +2320,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
     (view_convert (rshift (view_convert:ntype @0) @1))
     (convert (rshift (convert:ntype @0) @1))))))
 
+/* IFN_AVG_FLOOR (x, x) and IFN_AVG_CEIL (x, x) are both x.  */
 #if GIMPLE
+(for avg (IFN_AVG_FLOOR IFN_AVG_CEIL)
+ (simplify
+  (avg @0 @0)
+  @0))
+
  /* Fold ((x + y) >> 1 into IFN_AVG_FLOOR (x, y) if x and y are vectors in
     which each element is known to have at least one leading zero bit.  */
 (simplify
diff --git a/gcc/testsuite/gcc.dg/pr122715.c b/gcc/testsuite/gcc.dg/pr122715.c
new file mode 100644
index 000000000000..a767c1fe432f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr122715.c
@@ -0,0 +1,22 @@
+/* PR middle-end/122715 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fgimple -fdump-tree-optimized" } */
+
+typedef unsigned int v4u32 __attribute__((vector_size(16)));
+
+v4u32 __GIMPLE() avg_floor(v4u32 x)
+{
+  v4u32 res;
+  res_1 = .AVG_FLOOR (x, x);
+  return res_1;
+}
+
+v4u32 __GIMPLE() avg_ceil(v4u32 x)
+{
+  v4u32 res;
+  res_1 = .AVG_CEIL (x, x);
+  return res_1;
+}
+
+/* { dg-final { scan-tree-dump-not {\.AVG_} "optimized" } } */
+/* { dg-final { scan-tree-dump-times {return x_} 2 "optimized" } } */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.