https://gcc.gnu.org/g:ec4f03aae5e81c67e0cb5afd7f5c7cbf199fa411

commit r17-2425-gec4f03aae5e81c67e0cb5afd7f5c7cbf199fa411
Author: Jim Lin <[email protected]>
Date:   Wed Jul 15 13:55:57 2026 -0600

    [PATCH] RISC-V: Fix GE/GEU zicond splitter emitting the wrong comparison
    
    The splitter matching (x >= 1 ? 2^n : 0) lowered it to
    tmp = (x > 1); result = tmp << n, emitting any_gt instead of any_ge.
    At x == 1 the original yields 2^n but the split yields 0, a
    miscompile.  Emit any_ge to reproduce the matched comparison, as the
    sibling GE/GEU splitters already do.
    
    gcc/ChangeLog:
    
            * config/riscv/zicond.md: Emit any_ge instead of any_gt in the
            GE/GEU if-then-else splitter.
    
    Signed-off-by: Jim Lin <[email protected]>

Diff:
---
 gcc/config/riscv/zicond.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/gcc/config/riscv/zicond.md b/gcc/config/riscv/zicond.md
index a890322a5189..b0152cb773f4 100644
--- a/gcc/config/riscv/zicond.md
+++ b/gcc/config/riscv/zicond.md
@@ -458,7 +458,7 @@
         (const_int 0)))
    (clobber (match_operand:X 3 "register_operand"))]
   "exact_log2 (INTVAL (operands[2])) >= 0"
-  [(set (match_dup 3) (any_gt:X (match_dup 1) (const_int 1)))
+  [(set (match_dup 3) (any_ge:X (match_dup 1) (const_int 1)))
    (set (match_dup 0) (ashift:X (match_dup 3) (match_dup 4)))]
   { operands[4] = GEN_INT (exact_log2 (INTVAL (operands[2]))); })

Reply via email to