[llvm] [DAG] Fold mul 0 -> 0 when expanding mul into parts. (PR #168780)
Sergei Barannikov via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 19 14:48:57 PST 2025
================
@@ -1829,67 +1829,53 @@ define i64 @mulhsu_i64(i64 %a, i64 %b) nounwind {
; RV32I-NEXT: sw s5, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s6, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s7, 12(sp) # 4-byte Folded Spill
-; RV32I-NEXT: sw s8, 8(sp) # 4-byte Folded Spill
-; RV32I-NEXT: sw s9, 4(sp) # 4-byte Folded Spill
-; RV32I-NEXT: mv s2, a3
-; RV32I-NEXT: mv s3, a2
-; RV32I-NEXT: mv s0, a1
-; RV32I-NEXT: mv s1, a0
+; RV32I-NEXT: mv s0, a3
+; RV32I-NEXT: mv s1, a2
+; RV32I-NEXT: mv s2, a1
+; RV32I-NEXT: mv s3, a0
; RV32I-NEXT: srai s4, a3, 31
; RV32I-NEXT: li a1, 0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: call __muldi3
; RV32I-NEXT: mv s5, a1
-; RV32I-NEXT: mv a0, s0
+; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: li a1, 0
-; RV32I-NEXT: mv a2, s3
+; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: call __muldi3
; RV32I-NEXT: add s5, a0, s5
; RV32I-NEXT: sltu a0, s5, a0
-; RV32I-NEXT: add s7, a1, a0
-; RV32I-NEXT: mv a0, s1
+; RV32I-NEXT: add s6, a1, a0
+; RV32I-NEXT: mv a0, s3
; RV32I-NEXT: li a1, 0
-; RV32I-NEXT: mv a2, s2
+; RV32I-NEXT: mv a2, s0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: call __muldi3
; RV32I-NEXT: add s5, a0, s5
; RV32I-NEXT: sltu a0, s5, a0
; RV32I-NEXT: add a0, a1, a0
-; RV32I-NEXT: add s8, s7, a0
-; RV32I-NEXT: mv a0, s0
+; RV32I-NEXT: add s5, s6, a0
+; RV32I-NEXT: mv a0, s2
; RV32I-NEXT: li a1, 0
-; RV32I-NEXT: mv a2, s2
+; RV32I-NEXT: mv a2, s0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: call __muldi3
-; RV32I-NEXT: mv s5, a0
-; RV32I-NEXT: mv s6, a1
-; RV32I-NEXT: add s9, a0, s8
-; RV32I-NEXT: mv a0, s3
-; RV32I-NEXT: mv a1, s2
-; RV32I-NEXT: li a2, 0
-; RV32I-NEXT: li a3, 0
-; RV32I-NEXT: call __muldi3
-; RV32I-NEXT: mv s2, a0
-; RV32I-NEXT: mv s3, a1
+; RV32I-NEXT: mv s0, a0
+; RV32I-NEXT: mv s1, a1
+; RV32I-NEXT: add s7, a0, s5
; RV32I-NEXT: mv a0, s4
; RV32I-NEXT: mv a1, s4
-; RV32I-NEXT: mv a2, s1
-; RV32I-NEXT: mv a3, s0
+; RV32I-NEXT: mv a2, s3
+; RV32I-NEXT: mv a3, s2
; RV32I-NEXT: call __muldi3
----------------
s-barannikov wrote:
Note that this multiplies `{a2, a3}` by `s4`, which is either 0 or -1. This is another opportunity for optimization: the multiplication is equivalent to `{-a2 & s4, -a3 & s4}`.
https://alive2.llvm.org/ce/z/C7SJX9
https://github.com/llvm/llvm-project/pull/168780
More information about the llvm-commits
mailing list