https://gcc.gnu.org/g:6ce0821aa5ad174979d5fc15db606810b644c8eb

commit 6ce0821aa5ad174979d5fc15db606810b644c8eb
Author: Jin Ma <ji...@linux.alibaba.com>
Date:   Sat Jun 28 19:55:00 2025 +0800

    RISC-V: Refactor the function bitmap_union_of_preds_with_entry
    
    The current implementation of this function is somewhat difficult to
    understand, as it uses a direct break statement within the for loop,
    rendering the loop meaningless. Additionally, during the Coverity check
    on the for loop, a warning appeared: "unreachable: Since the loop
    increment ix++; is unreachable, the loop body will never execute more
    than once." Therefore, I have made some simple refactoring to address
    these issues.
    
    gcc/ChangeLog:
    
            * config/riscv/riscv-vsetvl.cc (bitmap_union_of_preds_with_entry):
            Refactor.
    
    Signed-off-by: Jin Ma <ji...@linux.alibaba.com>
    (cherry picked from commit 2609a7a5971aa8a2ef1bafbf5581dcabd68a466e)

Diff:
---
 gcc/config/riscv/riscv-vsetvl.cc | 41 +++++++++++++++++++---------------------
 1 file changed, 19 insertions(+), 22 deletions(-)

diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc
index 4891b6c95e85..4fe0ae6d97b7 100644
--- a/gcc/config/riscv/riscv-vsetvl.cc
+++ b/gcc/config/riscv/riscv-vsetvl.cc
@@ -100,31 +100,28 @@ using namespace riscv_vector;
 static void
 bitmap_union_of_preds_with_entry (sbitmap dst, sbitmap *src, basic_block b)
 {
-  unsigned int set_size = dst->size;
-  edge e;
-  unsigned ix;
-
-  for (ix = 0; ix < EDGE_COUNT (b->preds); ix++)
+  /* Handle case with no predecessors (including ENTRY block).  */
+  if (EDGE_COUNT (b->preds) == 0)
     {
-      e = EDGE_PRED (b, ix);
-      bitmap_copy (dst, src[e->src->index]);
-      break;
+      bitmap_clear (dst);
+      return;
     }
 
-  if (ix == EDGE_COUNT (b->preds))
-    bitmap_clear (dst);
-  else
-    for (ix++; ix < EDGE_COUNT (b->preds); ix++)
-      {
-       unsigned int i;
-       SBITMAP_ELT_TYPE *p, *r;
-
-       e = EDGE_PRED (b, ix);
-       p = src[e->src->index]->elms;
-       r = dst->elms;
-       for (i = 0; i < set_size; i++)
-         *r++ |= *p++;
-      }
+  edge e;
+  edge_iterator ei;
+  /* Union remaining predecessors' bitmaps.  */
+  FOR_EACH_EDGE (e, ei, b->preds)
+    {
+      /* Initialize with first predecessor's bitmap.  */
+      if (ei.index == 0)
+       {
+         bitmap_copy (dst, src[e->src->index]);
+         continue;
+       }
+
+      /* Perform bitmap OR operation element-wise.  */
+      bitmap_ior (dst, dst, src[e->src->index]);
+    }
 }
 
 /* Compute the reaching definition in and out based on the gen and KILL

Reply via email to