[llvm] [RISCV] Combine (addi (addi)) and add post riscv-opt-w-instrs machine-combiner (PR #171165)
Piotr Fusik via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 8 09:53:55 PST 2025
https://github.com/pfusik updated https://github.com/llvm/llvm-project/pull/171165
>From 10731b2d496b7499c1af1e30c96b124d702d2870 Mon Sep 17 00:00:00 2001
From: Piotr Fusik <p.fusik at samsung.com>
Date: Mon, 8 Dec 2025 18:07:00 +0100
Subject: [PATCH 1/5] [RISCV][test] Add tests for (addi (addi X, C1), C2) ->
(addi X, C1+C2) combines
---
llvm/test/CodeGen/RISCV/zicond-opts.ll | 58 ++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
diff --git a/llvm/test/CodeGen/RISCV/zicond-opts.ll b/llvm/test/CodeGen/RISCV/zicond-opts.ll
index c6d72981eff32..fdf631e5faac8 100644
--- a/llvm/test/CodeGen/RISCV/zicond-opts.ll
+++ b/llvm/test/CodeGen/RISCV/zicond-opts.ll
@@ -401,3 +401,61 @@ entry:
%clzg = select i1 %iszero, i32 -9, i32 %cast
ret i32 %clzg
}
+
+define i32 @addi_addi(i1 %a, i16 %b) {
+; RV32ZICOND-LABEL: addi_addi:
+; RV32ZICOND: # %bb.0:
+; RV32ZICOND-NEXT: andi a0, a0, 1
+; RV32ZICOND-NEXT: bset a1, zero, a1
+; RV32ZICOND-NEXT: addi a1, a1, -1
+; RV32ZICOND-NEXT: addi a1, a1, -1
+; RV32ZICOND-NEXT: czero.nez a0, a1, a0
+; RV32ZICOND-NEXT: addi a0, a0, 1
+; RV32ZICOND-NEXT: ret
+;
+; RV64ZICOND-LABEL: addi_addi:
+; RV64ZICOND: # %bb.0:
+; RV64ZICOND-NEXT: andi a0, a0, 1
+; RV64ZICOND-NEXT: bset a1, zero, a1
+; RV64ZICOND-NEXT: addi a1, a1, -1
+; RV64ZICOND-NEXT: addi a1, a1, -1
+; RV64ZICOND-NEXT: czero.nez a0, a1, a0
+; RV64ZICOND-NEXT: addi a0, a0, 1
+; RV64ZICOND-NEXT: ret
+ %zext = zext nneg i16 %b to i32
+ %shl = shl nsw i32 -1, %zext
+ %xor = xor i32 %shl, -1
+ %select = select i1 %a, i32 1, i32 %xor
+ ret i32 %select
+}
+
+define i64 @addiw_addi(i32 %x) {
+; RV32ZICOND-LABEL: addiw_addi:
+; RV32ZICOND: # %bb.0:
+; RV32ZICOND-NEXT: addi a1, a0, -64
+; RV32ZICOND-NEXT: czero.eqz a0, a1, a0
+; RV32ZICOND-NEXT: addi a1, a0, 63
+; RV32ZICOND-NEXT: addi a0, a0, 31
+; RV32ZICOND-NEXT: srli a2, a0, 31
+; RV32ZICOND-NEXT: bset a1, zero, a1
+; RV32ZICOND-NEXT: bset a3, zero, a0
+; RV32ZICOND-NEXT: czero.eqz a0, a1, a2
+; RV32ZICOND-NEXT: czero.nez a1, a3, a2
+; RV32ZICOND-NEXT: ret
+;
+; RV64ZICOND-LABEL: addiw_addi:
+; RV64ZICOND: # %bb.0:
+; RV64ZICOND-NEXT: sext.w a1, a0
+; RV64ZICOND-NEXT: addi a0, a0, -1
+; RV64ZICOND-NEXT: addi a0, a0, -63
+; RV64ZICOND-NEXT: czero.eqz a0, a0, a1
+; RV64ZICOND-NEXT: addi a0, a0, 63
+; RV64ZICOND-NEXT: bset a0, zero, a0
+; RV64ZICOND-NEXT: ret
+ %add = add i32 %x, -1
+ %icmp = icmp eq i32 %x, 0
+ %select = select i1 %icmp, i32 63, i32 %add
+ %zext= zext nneg i32 %select to i64
+ %shl = shl nuw i64 1, %zext
+ ret i64 %shl
+}
>From 94430e2ee057a9e7110042713f980d4c4215c68a Mon Sep 17 00:00:00 2001
From: Piotr Fusik <p.fusik at samsung.com>
Date: Mon, 8 Dec 2025 18:09:28 +0100
Subject: [PATCH 2/5] [RISCV][test] Add a test for post opt-w-instrs
MachineCombiner
---
llvm/test/CodeGen/RISCV/rv64zba.ll | 31 ++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/llvm/test/CodeGen/RISCV/rv64zba.ll b/llvm/test/CodeGen/RISCV/rv64zba.ll
index fb26b8b16a290..4af605472220a 100644
--- a/llvm/test/CodeGen/RISCV/rv64zba.ll
+++ b/llvm/test/CodeGen/RISCV/rv64zba.ll
@@ -5087,3 +5087,34 @@ define i64 @exactashr1mul36(i64 %a) {
%d = mul i64 %c, 36
ret i64 %d
}
+
+define i32 @shl_add_shl_add(i32 %a, i32 %b, i32 %c) {
+; RV64I-LABEL: shl_add_shl_add:
+; RV64I: # %bb.0:
+; RV64I-NEXT: slli a2, a2, 5
+; RV64I-NEXT: add a1, a1, a2
+; RV64I-NEXT: slli a0, a0, 3
+; RV64I-NEXT: addw a0, a0, a1
+; RV64I-NEXT: ret
+;
+; RV64ZBA-LABEL: shl_add_shl_add:
+; RV64ZBA: # %bb.0:
+; RV64ZBA-NEXT: slli a2, a2, 5
+; RV64ZBA-NEXT: add a1, a1, a2
+; RV64ZBA-NEXT: sh3add a0, a0, a1
+; RV64ZBA-NEXT: sext.w a0, a0
+; RV64ZBA-NEXT: ret
+;
+; RV64XANDESPERF-LABEL: shl_add_shl_add:
+; RV64XANDESPERF: # %bb.0:
+; RV64XANDESPERF-NEXT: slli a2, a2, 5
+; RV64XANDESPERF-NEXT: add a1, a1, a2
+; RV64XANDESPERF-NEXT: nds.lea.d a0, a1, a0
+; RV64XANDESPERF-NEXT: sext.w a0, a0
+; RV64XANDESPERF-NEXT: ret
+ %shl = shl nsw i32 %c, 5
+ %add = add i32 %b, %shl
+ %shl2 = shl nuw nsw i32 %a, 3
+ %add2= add i32 %shl2, %add
+ ret i32 %add2
+}
>From ea5d1fefe8dd8d960a3b2a78b8af9201d1de5f4c Mon Sep 17 00:00:00 2001
From: Piotr Fusik <p.fusik at samsung.com>
Date: Mon, 8 Dec 2025 18:10:56 +0100
Subject: [PATCH 3/5] [RISCV] Combine (addi (addi X, C1), C2) -> (addi X,
C1+C2)
---
llvm/lib/Target/RISCV/RISCVInstrInfo.cpp | 43 ++++++++++++++++++++++++
llvm/lib/Target/RISCV/RISCVInstrInfo.h | 1 +
llvm/test/CodeGen/RISCV/rv64zba.ll | 3 +-
llvm/test/CodeGen/RISCV/zicond-opts.ll | 6 ++--
4 files changed, 47 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
index a3bacfbfe5214..37dec648b6b53 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
@@ -2654,6 +2654,22 @@ static bool getSHXADDPatterns(const MachineInstr &Root,
return Found;
}
+// Check (addi (addi X, C1), C2) -> (addi X, C1+C2) pattern.
+static bool getADDIADDIPatterns(const MachineInstr &Root,
+ SmallVectorImpl<unsigned> &Patterns) {
+ if (Root.getOpcode() != RISCV::ADDI)
+ return false;
+ const MachineBasicBlock &MBB = *Root.getParent();
+ const MachineInstr *Inner = canCombine(MBB, Root.getOperand(1), RISCV::ADDI);
+ if (!Inner || !Inner->getOperand(1).isReg())
+ return false;
+ int64_t Sum = Inner->getOperand(2).getImm() + Root.getOperand(2).getImm();
+ if (!isInt<12>(Sum))
+ return false;
+ Patterns.push_back(RISCVMachineCombinerPattern::ADDI_ADDI);
+ return true;
+}
+
CombinerObjective RISCVInstrInfo::getCombinerObjective(unsigned Pattern) const {
switch (Pattern) {
case RISCVMachineCombinerPattern::FMADD_AX:
@@ -2676,6 +2692,9 @@ bool RISCVInstrInfo::getMachineCombinerPatterns(
if (getSHXADDPatterns(Root, Patterns))
return true;
+ if (getADDIADDIPatterns(Root, Patterns))
+ return true;
+
return TargetInstrInfo::getMachineCombinerPatterns(Root, Patterns,
DoRegPressureReduce);
}
@@ -2819,6 +2838,27 @@ genShXAddAddShift(MachineInstr &Root, unsigned AddOpIdx,
DelInstrs.push_back(&Root);
}
+// Fold (addi (addi X, C1), C2) -> (addi X, C1+C2)
+static void combineADDIADDI(MachineInstr &Root,
+ SmallVectorImpl<MachineInstr *> &InsInstrs,
+ SmallVectorImpl<MachineInstr *> &DelInstrs) {
+ MachineFunction *MF = Root.getMF();
+ MachineRegisterInfo &MRI = MF->getRegInfo();
+ const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
+
+ MachineInstr *Inner = MRI.getUniqueVRegDef(Root.getOperand(1).getReg());
+ const MachineOperand &X = Inner->getOperand(1);
+ int64_t Sum = Inner->getOperand(2).getImm() + Root.getOperand(2).getImm();
+
+ auto MIB = BuildMI(*MF, MIMetadata(Root), TII->get(RISCV::ADDI),
+ Root.getOperand(0).getReg())
+ .addReg(X.getReg(), getKillRegState(X.isKill()))
+ .addImm(Sum);
+ InsInstrs.push_back(MIB);
+ DelInstrs.push_back(Inner);
+ DelInstrs.push_back(&Root);
+}
+
void RISCVInstrInfo::genAlternativeCodeSequence(
MachineInstr &Root, unsigned Pattern,
SmallVectorImpl<MachineInstr *> &InsInstrs,
@@ -2848,6 +2888,9 @@ void RISCVInstrInfo::genAlternativeCodeSequence(
case RISCVMachineCombinerPattern::SHXADD_ADD_SLLI_OP2:
genShXAddAddShift(Root, 2, InsInstrs, DelInstrs, InstrIdxForVirtReg);
return;
+ case RISCVMachineCombinerPattern::ADDI_ADDI:
+ combineADDIADDI(Root, InsInstrs, DelInstrs);
+ return;
}
}
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.h b/llvm/lib/Target/RISCV/RISCVInstrInfo.h
index 0ffe015b9fac8..2f91dd4698a84 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.h
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.h
@@ -76,6 +76,7 @@ enum RISCVMachineCombinerPattern : unsigned {
FNMSUB,
SHXADD_ADD_SLLI_OP1,
SHXADD_ADD_SLLI_OP2,
+ ADDI_ADDI,
};
class RISCVInstrInfo : public RISCVGenInstrInfo {
diff --git a/llvm/test/CodeGen/RISCV/rv64zba.ll b/llvm/test/CodeGen/RISCV/rv64zba.ll
index 4af605472220a..0afd6f5727934 100644
--- a/llvm/test/CodeGen/RISCV/rv64zba.ll
+++ b/llvm/test/CodeGen/RISCV/rv64zba.ll
@@ -4609,8 +4609,7 @@ define i64 @add_u32simm32_zextw(i64 %x) nounwind {
; RV64XANDESPERF-NEXT: nds.lea.b.ze a0, a0, a1
; RV64XANDESPERF-NEXT: li a1, 1
; RV64XANDESPERF-NEXT: slli a1, a1, 32
-; RV64XANDESPERF-NEXT: addi a1, a1, -2
-; RV64XANDESPERF-NEXT: addi a1, a1, 1
+; RV64XANDESPERF-NEXT: addi a1, a1, -1
; RV64XANDESPERF-NEXT: and a0, a0, a1
; RV64XANDESPERF-NEXT: ret
entry:
diff --git a/llvm/test/CodeGen/RISCV/zicond-opts.ll b/llvm/test/CodeGen/RISCV/zicond-opts.ll
index fdf631e5faac8..47ff6edb0499d 100644
--- a/llvm/test/CodeGen/RISCV/zicond-opts.ll
+++ b/llvm/test/CodeGen/RISCV/zicond-opts.ll
@@ -407,8 +407,7 @@ define i32 @addi_addi(i1 %a, i16 %b) {
; RV32ZICOND: # %bb.0:
; RV32ZICOND-NEXT: andi a0, a0, 1
; RV32ZICOND-NEXT: bset a1, zero, a1
-; RV32ZICOND-NEXT: addi a1, a1, -1
-; RV32ZICOND-NEXT: addi a1, a1, -1
+; RV32ZICOND-NEXT: addi a1, a1, -2
; RV32ZICOND-NEXT: czero.nez a0, a1, a0
; RV32ZICOND-NEXT: addi a0, a0, 1
; RV32ZICOND-NEXT: ret
@@ -417,8 +416,7 @@ define i32 @addi_addi(i1 %a, i16 %b) {
; RV64ZICOND: # %bb.0:
; RV64ZICOND-NEXT: andi a0, a0, 1
; RV64ZICOND-NEXT: bset a1, zero, a1
-; RV64ZICOND-NEXT: addi a1, a1, -1
-; RV64ZICOND-NEXT: addi a1, a1, -1
+; RV64ZICOND-NEXT: addi a1, a1, -2
; RV64ZICOND-NEXT: czero.nez a0, a1, a0
; RV64ZICOND-NEXT: addi a0, a0, 1
; RV64ZICOND-NEXT: ret
>From dbb75f0c6c6408fb2a2b02171a69de25dd4c2aa5 Mon Sep 17 00:00:00 2001
From: Piotr Fusik <p.fusik at samsung.com>
Date: Mon, 8 Dec 2025 18:12:44 +0100
Subject: [PATCH 4/5] [RISCV] Add post opt-w-instrs MachineCombiner
---
llvm/lib/Target/RISCV/RISCVTargetMachine.cpp | 1 +
.../RISCV/GlobalISel/float-intrinsics.ll | 8 +-
llvm/test/CodeGen/RISCV/O3-pipeline.ll | 3 +
.../calling-conv-lp64-lp64f-lp64d-common.ll | 2 +-
llvm/test/CodeGen/RISCV/ctlz-cttz-ctpop.ll | 52 +--
.../CodeGen/RISCV/ctz_zero_return_test.ll | 196 +++++------
llvm/test/CodeGen/RISCV/mul-expand.ll | 184 +++++-----
llvm/test/CodeGen/RISCV/rv64xtheadbb.ll | 106 +++---
llvm/test/CodeGen/RISCV/rv64zba.ll | 3 +-
llvm/test/CodeGen/RISCV/rv64zbb.ll | 106 +++---
.../rvv/fixed-vectors-int-explodevector.ll | 319 ++++++++++++------
.../CodeGen/RISCV/rvv/known-never-zero.ll | 26 +-
.../CodeGen/RISCV/srem-seteq-illegal-types.ll | 116 +++----
llvm/test/CodeGen/RISCV/zicond-opts.ll | 3 +-
14 files changed, 615 insertions(+), 510 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
index 52dc38564059c..e461cc3fab8b4 100644
--- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
+++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
@@ -597,6 +597,7 @@ void RISCVPassConfig::addMachineSSAOptimization() {
if (TM->getTargetTriple().isRISCV64()) {
addPass(createRISCVOptWInstrsPass());
+ addILPOpts();
}
}
diff --git a/llvm/test/CodeGen/RISCV/GlobalISel/float-intrinsics.ll b/llvm/test/CodeGen/RISCV/GlobalISel/float-intrinsics.ll
index 01d9ceb0a0860..5351061273676 100644
--- a/llvm/test/CodeGen/RISCV/GlobalISel/float-intrinsics.ll
+++ b/llvm/test/CodeGen/RISCV/GlobalISel/float-intrinsics.ll
@@ -1235,12 +1235,12 @@ define i1 @fpclass(float %x) {
; RV64I-NEXT: seqz a2, a2
; RV64I-NEXT: snez a0, a0
; RV64I-NEXT: seqz a6, a6
-; RV64I-NEXT: sltu a4, a5, a4
-; RV64I-NEXT: and a3, a3, a0
-; RV64I-NEXT: or a2, a2, a6
; RV64I-NEXT: or a1, a2, a1
+; RV64I-NEXT: sltu a2, a5, a4
+; RV64I-NEXT: and a3, a3, a0
+; RV64I-NEXT: or a1, a1, a6
; RV64I-NEXT: or a1, a1, a3
-; RV64I-NEXT: and a0, a4, a0
+; RV64I-NEXT: and a0, a2, a0
; RV64I-NEXT: or a0, a1, a0
; RV64I-NEXT: ret
%cmp = call i1 @llvm.is.fpclass.f32(float %x, i32 639)
diff --git a/llvm/test/CodeGen/RISCV/O3-pipeline.ll b/llvm/test/CodeGen/RISCV/O3-pipeline.ll
index 85027a56a1348..325d69f91b2c4 100644
--- a/llvm/test/CodeGen/RISCV/O3-pipeline.ll
+++ b/llvm/test/CodeGen/RISCV/O3-pipeline.ll
@@ -124,6 +124,9 @@
; CHECK-NEXT: Peephole Optimizations
; CHECK-NEXT: Remove dead machine instructions
; RV64-NEXT: RISC-V Optimize W Instructions
+; RV64-NEXT: Machine Trace Metrics
+; RV64-NEXT: Lazy Machine Block Frequency Analysis
+; RV64-NEXT: Machine InstCombiner
; CHECK-NEXT: RISC-V Pre-RA pseudo instruction expansion pass
; CHECK-NEXT: RISC-V Merge Base Offset
; CHECK-NEXT: MachineDominator Tree Construction
diff --git a/llvm/test/CodeGen/RISCV/calling-conv-lp64-lp64f-lp64d-common.ll b/llvm/test/CodeGen/RISCV/calling-conv-lp64-lp64f-lp64d-common.ll
index a63dc0ef3a3a7..066379501e3c2 100644
--- a/llvm/test/CodeGen/RISCV/calling-conv-lp64-lp64f-lp64d-common.ll
+++ b/llvm/test/CodeGen/RISCV/calling-conv-lp64-lp64f-lp64d-common.ll
@@ -53,12 +53,12 @@ define i32 @callee_many_scalars(i8 %a, i16 %b, i32 %c, i128 %d, i32 %e, i32 %f,
; RV64I-NEXT: zext.b a0, a0
; RV64I-NEXT: slli a1, a1, 48
; RV64I-NEXT: xor a3, a3, a7
+; RV64I-NEXT: add a5, a5, a6
; RV64I-NEXT: srli a1, a1, 48
; RV64I-NEXT: add a0, a0, a2
; RV64I-NEXT: add a0, a0, a1
; RV64I-NEXT: add a0, a0, a5
; RV64I-NEXT: xor a1, a4, t1
-; RV64I-NEXT: add a0, a0, a6
; RV64I-NEXT: or a1, a3, a1
; RV64I-NEXT: seqz a1, a1
; RV64I-NEXT: add a0, a0, t0
diff --git a/llvm/test/CodeGen/RISCV/ctlz-cttz-ctpop.ll b/llvm/test/CodeGen/RISCV/ctlz-cttz-ctpop.ll
index 976c57e422761..1e2bfccdb0a14 100644
--- a/llvm/test/CodeGen/RISCV/ctlz-cttz-ctpop.ll
+++ b/llvm/test/CodeGen/RISCV/ctlz-cttz-ctpop.ll
@@ -255,23 +255,23 @@ define i32 @test_cttz_i32(i32 %a) nounwind {
; RV64I-NEXT: slli a2, a0, 8
; RV64I-NEXT: slli a3, a0, 10
; RV64I-NEXT: slli a4, a0, 12
+; RV64I-NEXT: slli a5, a0, 16
; RV64I-NEXT: add a1, a1, a2
-; RV64I-NEXT: slli a2, a0, 16
-; RV64I-NEXT: sub a3, a3, a4
-; RV64I-NEXT: slli a4, a0, 18
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a4, a0, 4
-; RV64I-NEXT: sub a4, a0, a4
-; RV64I-NEXT: add a1, a4, a1
-; RV64I-NEXT: slli a4, a0, 14
+; RV64I-NEXT: slli a2, a0, 18
; RV64I-NEXT: sub a3, a3, a4
; RV64I-NEXT: slli a4, a0, 23
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a0, a0, 27
+; RV64I-NEXT: sub a5, a5, a2
+; RV64I-NEXT: slli a2, a0, 27
+; RV64I-NEXT: sub a4, a4, a2
+; RV64I-NEXT: slli a2, a0, 4
+; RV64I-NEXT: sub a2, a0, a2
+; RV64I-NEXT: add a1, a2, a1
+; RV64I-NEXT: slli a0, a0, 14
+; RV64I-NEXT: sub a3, a3, a0
+; RV64I-NEXT: sub a5, a5, a4
; RV64I-NEXT: add a1, a1, a3
-; RV64I-NEXT: add a0, a2, a0
-; RV64I-NEXT: add a0, a1, a0
-; RV64I-NEXT: srliw a0, a0, 27
+; RV64I-NEXT: add a1, a1, a5
+; RV64I-NEXT: srliw a0, a1, 27
; RV64I-NEXT: lui a1, %hi(.LCPI2_0)
; RV64I-NEXT: addi a1, a1, %lo(.LCPI2_0)
; RV64I-NEXT: add a0, a1, a0
@@ -736,23 +736,23 @@ define i32 @test_cttz_i32_zero_undef(i32 %a) nounwind {
; RV64I-NEXT: slli a2, a0, 8
; RV64I-NEXT: slli a3, a0, 10
; RV64I-NEXT: slli a4, a0, 12
+; RV64I-NEXT: slli a5, a0, 16
; RV64I-NEXT: add a1, a1, a2
-; RV64I-NEXT: slli a2, a0, 16
-; RV64I-NEXT: sub a3, a3, a4
-; RV64I-NEXT: slli a4, a0, 18
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a4, a0, 4
-; RV64I-NEXT: sub a4, a0, a4
-; RV64I-NEXT: add a1, a4, a1
-; RV64I-NEXT: slli a4, a0, 14
+; RV64I-NEXT: slli a2, a0, 18
; RV64I-NEXT: sub a3, a3, a4
; RV64I-NEXT: slli a4, a0, 23
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a0, a0, 27
+; RV64I-NEXT: sub a5, a5, a2
+; RV64I-NEXT: slli a2, a0, 27
+; RV64I-NEXT: sub a4, a4, a2
+; RV64I-NEXT: slli a2, a0, 4
+; RV64I-NEXT: sub a2, a0, a2
+; RV64I-NEXT: add a1, a2, a1
+; RV64I-NEXT: slli a0, a0, 14
+; RV64I-NEXT: sub a3, a3, a0
+; RV64I-NEXT: sub a5, a5, a4
; RV64I-NEXT: add a1, a1, a3
-; RV64I-NEXT: add a0, a2, a0
-; RV64I-NEXT: add a0, a1, a0
-; RV64I-NEXT: srliw a0, a0, 27
+; RV64I-NEXT: add a1, a1, a5
+; RV64I-NEXT: srliw a0, a1, 27
; RV64I-NEXT: lui a1, %hi(.LCPI6_0)
; RV64I-NEXT: addi a1, a1, %lo(.LCPI6_0)
; RV64I-NEXT: add a0, a1, a0
diff --git a/llvm/test/CodeGen/RISCV/ctz_zero_return_test.ll b/llvm/test/CodeGen/RISCV/ctz_zero_return_test.ll
index e92ff1a1b1b40..660bc5e7a9354 100644
--- a/llvm/test/CodeGen/RISCV/ctz_zero_return_test.ll
+++ b/llvm/test/CodeGen/RISCV/ctz_zero_return_test.ll
@@ -166,23 +166,23 @@ define i64 @ctz_dereferencing_pointer_zext(ptr %b) nounwind {
; RV64I-NEXT: slli a3, a1, 8
; RV64I-NEXT: slli a4, a1, 10
; RV64I-NEXT: slli a5, a1, 12
+; RV64I-NEXT: slli a6, a1, 16
; RV64I-NEXT: add a2, a2, a3
-; RV64I-NEXT: slli a3, a1, 16
-; RV64I-NEXT: sub a4, a4, a5
-; RV64I-NEXT: slli a5, a1, 18
-; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a5, a1, 4
-; RV64I-NEXT: sub a5, a1, a5
-; RV64I-NEXT: add a2, a5, a2
-; RV64I-NEXT: slli a5, a1, 14
+; RV64I-NEXT: slli a3, a1, 18
; RV64I-NEXT: sub a4, a4, a5
; RV64I-NEXT: slli a5, a1, 23
+; RV64I-NEXT: sub a3, a6, a3
+; RV64I-NEXT: slli a6, a1, 27
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a1, 4
+; RV64I-NEXT: sub a6, a1, a6
+; RV64I-NEXT: add a2, a6, a2
+; RV64I-NEXT: slli a1, a1, 14
+; RV64I-NEXT: sub a4, a4, a1
; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a1, a1, 27
; RV64I-NEXT: add a2, a2, a4
-; RV64I-NEXT: add a1, a3, a1
-; RV64I-NEXT: add a1, a2, a1
-; RV64I-NEXT: srliw a1, a1, 27
+; RV64I-NEXT: add a2, a2, a3
+; RV64I-NEXT: srliw a1, a2, 27
; RV64I-NEXT: lui a2, %hi(.LCPI1_0)
; RV64I-NEXT: addi a2, a2, %lo(.LCPI1_0)
; RV64I-NEXT: add a1, a2, a1
@@ -248,23 +248,23 @@ define signext i32 @ctz1(i32 signext %x) nounwind {
; RV64I-NEXT: slli a3, a1, 8
; RV64I-NEXT: slli a4, a1, 10
; RV64I-NEXT: slli a5, a1, 12
+; RV64I-NEXT: slli a6, a1, 16
; RV64I-NEXT: add a2, a2, a3
-; RV64I-NEXT: slli a3, a1, 16
-; RV64I-NEXT: sub a4, a4, a5
-; RV64I-NEXT: slli a5, a1, 18
-; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a5, a1, 4
-; RV64I-NEXT: sub a5, a1, a5
-; RV64I-NEXT: add a2, a5, a2
-; RV64I-NEXT: slli a5, a1, 14
+; RV64I-NEXT: slli a3, a1, 18
; RV64I-NEXT: sub a4, a4, a5
; RV64I-NEXT: slli a5, a1, 23
+; RV64I-NEXT: sub a3, a6, a3
+; RV64I-NEXT: slli a6, a1, 27
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a1, 4
+; RV64I-NEXT: sub a6, a1, a6
+; RV64I-NEXT: add a2, a6, a2
+; RV64I-NEXT: slli a1, a1, 14
+; RV64I-NEXT: sub a4, a4, a1
; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a1, a1, 27
; RV64I-NEXT: add a2, a2, a4
-; RV64I-NEXT: add a1, a3, a1
-; RV64I-NEXT: add a1, a2, a1
-; RV64I-NEXT: srliw a1, a1, 27
+; RV64I-NEXT: add a2, a2, a3
+; RV64I-NEXT: srliw a1, a2, 27
; RV64I-NEXT: lui a2, %hi(.LCPI2_0)
; RV64I-NEXT: addi a2, a2, %lo(.LCPI2_0)
; RV64I-NEXT: add a1, a2, a1
@@ -328,23 +328,23 @@ define signext i32 @ctz1_flipped(i32 signext %x) nounwind {
; RV64I-NEXT: slli a3, a1, 8
; RV64I-NEXT: slli a4, a1, 10
; RV64I-NEXT: slli a5, a1, 12
+; RV64I-NEXT: slli a6, a1, 16
; RV64I-NEXT: add a2, a2, a3
-; RV64I-NEXT: slli a3, a1, 16
-; RV64I-NEXT: sub a4, a4, a5
-; RV64I-NEXT: slli a5, a1, 18
-; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a5, a1, 4
-; RV64I-NEXT: sub a5, a1, a5
-; RV64I-NEXT: add a2, a5, a2
-; RV64I-NEXT: slli a5, a1, 14
+; RV64I-NEXT: slli a3, a1, 18
; RV64I-NEXT: sub a4, a4, a5
; RV64I-NEXT: slli a5, a1, 23
+; RV64I-NEXT: sub a3, a6, a3
+; RV64I-NEXT: slli a6, a1, 27
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a1, 4
+; RV64I-NEXT: sub a6, a1, a6
+; RV64I-NEXT: add a2, a6, a2
+; RV64I-NEXT: slli a1, a1, 14
+; RV64I-NEXT: sub a4, a4, a1
; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a1, a1, 27
; RV64I-NEXT: add a2, a2, a4
-; RV64I-NEXT: add a1, a3, a1
-; RV64I-NEXT: add a1, a2, a1
-; RV64I-NEXT: srliw a1, a1, 27
+; RV64I-NEXT: add a2, a2, a3
+; RV64I-NEXT: srliw a1, a2, 27
; RV64I-NEXT: lui a2, %hi(.LCPI3_0)
; RV64I-NEXT: addi a2, a2, %lo(.LCPI3_0)
; RV64I-NEXT: add a1, a2, a1
@@ -406,23 +406,23 @@ define signext i32 @ctz2(i32 signext %x) nounwind {
; RV64I-NEXT: slli a2, a0, 8
; RV64I-NEXT: slli a3, a0, 10
; RV64I-NEXT: slli a4, a0, 12
+; RV64I-NEXT: slli a5, a0, 16
; RV64I-NEXT: add a1, a1, a2
-; RV64I-NEXT: slli a2, a0, 16
-; RV64I-NEXT: sub a3, a3, a4
-; RV64I-NEXT: slli a4, a0, 18
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a4, a0, 4
-; RV64I-NEXT: sub a4, a0, a4
-; RV64I-NEXT: add a1, a4, a1
-; RV64I-NEXT: slli a4, a0, 14
+; RV64I-NEXT: slli a2, a0, 18
; RV64I-NEXT: sub a3, a3, a4
; RV64I-NEXT: slli a4, a0, 23
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a0, a0, 27
+; RV64I-NEXT: sub a5, a5, a2
+; RV64I-NEXT: slli a2, a0, 27
+; RV64I-NEXT: sub a4, a4, a2
+; RV64I-NEXT: slli a2, a0, 4
+; RV64I-NEXT: sub a2, a0, a2
+; RV64I-NEXT: add a1, a2, a1
+; RV64I-NEXT: slli a0, a0, 14
+; RV64I-NEXT: sub a3, a3, a0
+; RV64I-NEXT: sub a5, a5, a4
; RV64I-NEXT: add a1, a1, a3
-; RV64I-NEXT: add a0, a2, a0
-; RV64I-NEXT: add a0, a1, a0
-; RV64I-NEXT: srliw a0, a0, 27
+; RV64I-NEXT: add a1, a1, a5
+; RV64I-NEXT: srliw a0, a1, 27
; RV64I-NEXT: lui a1, %hi(.LCPI4_0)
; RV64I-NEXT: addi a1, a1, %lo(.LCPI4_0)
; RV64I-NEXT: add a0, a1, a0
@@ -481,23 +481,23 @@ define signext i32 @ctz3(i32 signext %x) nounwind {
; RV64I-NEXT: slli a2, a0, 8
; RV64I-NEXT: slli a3, a0, 10
; RV64I-NEXT: slli a4, a0, 12
+; RV64I-NEXT: slli a5, a0, 16
; RV64I-NEXT: add a1, a1, a2
-; RV64I-NEXT: slli a2, a0, 16
-; RV64I-NEXT: sub a3, a3, a4
-; RV64I-NEXT: slli a4, a0, 18
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a4, a0, 4
-; RV64I-NEXT: sub a4, a0, a4
-; RV64I-NEXT: add a1, a4, a1
-; RV64I-NEXT: slli a4, a0, 14
+; RV64I-NEXT: slli a2, a0, 18
; RV64I-NEXT: sub a3, a3, a4
; RV64I-NEXT: slli a4, a0, 23
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a0, a0, 27
+; RV64I-NEXT: sub a5, a5, a2
+; RV64I-NEXT: slli a2, a0, 27
+; RV64I-NEXT: sub a4, a4, a2
+; RV64I-NEXT: slli a2, a0, 4
+; RV64I-NEXT: sub a2, a0, a2
+; RV64I-NEXT: add a1, a2, a1
+; RV64I-NEXT: slli a0, a0, 14
+; RV64I-NEXT: sub a3, a3, a0
+; RV64I-NEXT: sub a5, a5, a4
; RV64I-NEXT: add a1, a1, a3
-; RV64I-NEXT: add a0, a2, a0
-; RV64I-NEXT: add a0, a1, a0
-; RV64I-NEXT: srliw a0, a0, 27
+; RV64I-NEXT: add a1, a1, a5
+; RV64I-NEXT: srliw a0, a1, 27
; RV64I-NEXT: lui a1, %hi(.LCPI5_0)
; RV64I-NEXT: addi a1, a1, %lo(.LCPI5_0)
; RV64I-NEXT: add a0, a1, a0
@@ -806,23 +806,23 @@ define signext i32 @ctz5(i32 signext %x) nounwind {
; RV64I-NEXT: slli a3, a1, 8
; RV64I-NEXT: slli a4, a1, 10
; RV64I-NEXT: slli a5, a1, 12
+; RV64I-NEXT: slli a6, a1, 16
; RV64I-NEXT: add a2, a2, a3
-; RV64I-NEXT: slli a3, a1, 16
-; RV64I-NEXT: sub a4, a4, a5
-; RV64I-NEXT: slli a5, a1, 18
-; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a5, a1, 4
-; RV64I-NEXT: sub a5, a1, a5
-; RV64I-NEXT: add a2, a5, a2
-; RV64I-NEXT: slli a5, a1, 14
+; RV64I-NEXT: slli a3, a1, 18
; RV64I-NEXT: sub a4, a4, a5
; RV64I-NEXT: slli a5, a1, 23
+; RV64I-NEXT: sub a3, a6, a3
+; RV64I-NEXT: slli a6, a1, 27
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a1, 4
+; RV64I-NEXT: sub a6, a1, a6
+; RV64I-NEXT: add a2, a6, a2
+; RV64I-NEXT: slli a1, a1, 14
+; RV64I-NEXT: sub a4, a4, a1
; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a1, a1, 27
; RV64I-NEXT: add a2, a2, a4
-; RV64I-NEXT: add a1, a3, a1
-; RV64I-NEXT: add a1, a2, a1
-; RV64I-NEXT: srliw a1, a1, 27
+; RV64I-NEXT: add a2, a2, a3
+; RV64I-NEXT: srliw a1, a2, 27
; RV64I-NEXT: lui a2, %hi(.LCPI8_0)
; RV64I-NEXT: addi a2, a2, %lo(.LCPI8_0)
; RV64I-NEXT: add a1, a2, a1
@@ -886,23 +886,23 @@ define signext i32 @ctz6(i32 signext %x) nounwind {
; RV64I-NEXT: slli a3, a1, 8
; RV64I-NEXT: slli a4, a1, 10
; RV64I-NEXT: slli a5, a1, 12
+; RV64I-NEXT: slli a6, a1, 16
; RV64I-NEXT: add a2, a2, a3
-; RV64I-NEXT: slli a3, a1, 16
-; RV64I-NEXT: sub a4, a4, a5
-; RV64I-NEXT: slli a5, a1, 18
-; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a5, a1, 4
-; RV64I-NEXT: sub a5, a1, a5
-; RV64I-NEXT: add a2, a5, a2
-; RV64I-NEXT: slli a5, a1, 14
+; RV64I-NEXT: slli a3, a1, 18
; RV64I-NEXT: sub a4, a4, a5
; RV64I-NEXT: slli a5, a1, 23
+; RV64I-NEXT: sub a3, a6, a3
+; RV64I-NEXT: slli a6, a1, 27
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a1, 4
+; RV64I-NEXT: sub a6, a1, a6
+; RV64I-NEXT: add a2, a6, a2
+; RV64I-NEXT: slli a1, a1, 14
+; RV64I-NEXT: sub a4, a4, a1
; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a1, a1, 27
; RV64I-NEXT: add a2, a2, a4
-; RV64I-NEXT: add a1, a3, a1
-; RV64I-NEXT: add a1, a2, a1
-; RV64I-NEXT: srliw a1, a1, 27
+; RV64I-NEXT: add a2, a2, a3
+; RV64I-NEXT: srliw a1, a2, 27
; RV64I-NEXT: lui a2, %hi(.LCPI9_0)
; RV64I-NEXT: addi a2, a2, %lo(.LCPI9_0)
; RV64I-NEXT: add a1, a2, a1
@@ -973,23 +973,23 @@ define signext i32 @globalVar() nounwind {
; RV64I-NEXT: slli a3, a1, 8
; RV64I-NEXT: slli a4, a1, 10
; RV64I-NEXT: slli a5, a1, 12
+; RV64I-NEXT: slli a6, a1, 16
; RV64I-NEXT: add a2, a2, a3
-; RV64I-NEXT: slli a3, a1, 16
-; RV64I-NEXT: sub a4, a4, a5
-; RV64I-NEXT: slli a5, a1, 18
-; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a5, a1, 4
-; RV64I-NEXT: sub a5, a1, a5
-; RV64I-NEXT: add a2, a5, a2
-; RV64I-NEXT: slli a5, a1, 14
+; RV64I-NEXT: slli a3, a1, 18
; RV64I-NEXT: sub a4, a4, a5
; RV64I-NEXT: slli a5, a1, 23
+; RV64I-NEXT: sub a3, a6, a3
+; RV64I-NEXT: slli a6, a1, 27
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a1, 4
+; RV64I-NEXT: sub a6, a1, a6
+; RV64I-NEXT: add a2, a6, a2
+; RV64I-NEXT: slli a1, a1, 14
+; RV64I-NEXT: sub a4, a4, a1
; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a1, a1, 27
; RV64I-NEXT: add a2, a2, a4
-; RV64I-NEXT: add a1, a3, a1
-; RV64I-NEXT: add a1, a2, a1
-; RV64I-NEXT: srliw a1, a1, 27
+; RV64I-NEXT: add a2, a2, a3
+; RV64I-NEXT: srliw a1, a2, 27
; RV64I-NEXT: lui a2, %hi(.LCPI10_0)
; RV64I-NEXT: addi a2, a2, %lo(.LCPI10_0)
; RV64I-NEXT: add a1, a2, a1
diff --git a/llvm/test/CodeGen/RISCV/mul-expand.ll b/llvm/test/CodeGen/RISCV/mul-expand.ll
index a75a7355fa407..9e02af9581c83 100644
--- a/llvm/test/CodeGen/RISCV/mul-expand.ll
+++ b/llvm/test/CodeGen/RISCV/mul-expand.ll
@@ -107,31 +107,31 @@ define i32 @muli32_0x33333333(i32 %a) nounwind {
; RV64I-NEXT: slli a3, a0, 8
; RV64I-NEXT: slli a4, a0, 10
; RV64I-NEXT: slli a5, a0, 14
+; RV64I-NEXT: slli a6, a0, 16
+; RV64I-NEXT: slli a7, a0, 18
; RV64I-NEXT: sub a1, a1, a2
-; RV64I-NEXT: slli a2, a0, 16
+; RV64I-NEXT: slli a2, a0, 20
; RV64I-NEXT: sub a3, a3, a4
; RV64I-NEXT: slli a4, a0, 22
-; RV64I-NEXT: sub a5, a5, a2
-; RV64I-NEXT: slli a2, a0, 24
-; RV64I-NEXT: sub a4, a4, a2
-; RV64I-NEXT: slli a2, a0, 2
-; RV64I-NEXT: sub a2, a2, a0
-; RV64I-NEXT: sub a2, a2, a1
-; RV64I-NEXT: slli a1, a0, 12
-; RV64I-NEXT: add a1, a3, a1
-; RV64I-NEXT: slli a3, a0, 18
-; RV64I-NEXT: add a3, a5, a3
-; RV64I-NEXT: slli a5, a0, 26
-; RV64I-NEXT: add a4, a4, a5
-; RV64I-NEXT: sub a2, a2, a1
-; RV64I-NEXT: slli a1, a0, 20
-; RV64I-NEXT: sub a3, a3, a1
-; RV64I-NEXT: slli a1, a0, 28
-; RV64I-NEXT: sub a4, a4, a1
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a0, 24
+; RV64I-NEXT: sub a2, a7, a2
+; RV64I-NEXT: slli a7, a0, 26
+; RV64I-NEXT: sub a4, a4, a6
+; RV64I-NEXT: slli a6, a0, 28
+; RV64I-NEXT: sub a6, a7, a6
+; RV64I-NEXT: slli a7, a0, 2
+; RV64I-NEXT: sub a7, a7, a0
+; RV64I-NEXT: sub a1, a7, a1
+; RV64I-NEXT: slli a7, a0, 12
+; RV64I-NEXT: add a3, a3, a7
+; RV64I-NEXT: add a2, a5, a2
+; RV64I-NEXT: add a4, a4, a6
; RV64I-NEXT: slli a0, a0, 30
-; RV64I-NEXT: add a2, a2, a3
+; RV64I-NEXT: sub a1, a1, a3
+; RV64I-NEXT: add a1, a1, a2
; RV64I-NEXT: add a0, a4, a0
-; RV64I-NEXT: add a0, a2, a0
+; RV64I-NEXT: add a0, a1, a0
; RV64I-NEXT: ret
%a1 = mul i32 %a, 858993459
ret i32 %a1
@@ -157,31 +157,31 @@ define i64 @muli64_0x33333333(i64 %a) nounwind {
; RV64I-NEXT: slli a3, a0, 8
; RV64I-NEXT: slli a4, a0, 10
; RV64I-NEXT: slli a5, a0, 14
+; RV64I-NEXT: slli a6, a0, 16
+; RV64I-NEXT: slli a7, a0, 18
; RV64I-NEXT: sub a1, a1, a2
-; RV64I-NEXT: slli a2, a0, 16
+; RV64I-NEXT: slli a2, a0, 20
; RV64I-NEXT: sub a3, a3, a4
; RV64I-NEXT: slli a4, a0, 22
-; RV64I-NEXT: sub a5, a5, a2
-; RV64I-NEXT: slli a2, a0, 24
-; RV64I-NEXT: sub a4, a4, a2
-; RV64I-NEXT: slli a2, a0, 2
-; RV64I-NEXT: sub a2, a2, a0
-; RV64I-NEXT: sub a2, a2, a1
-; RV64I-NEXT: slli a1, a0, 12
-; RV64I-NEXT: add a1, a3, a1
-; RV64I-NEXT: slli a3, a0, 18
-; RV64I-NEXT: add a3, a5, a3
-; RV64I-NEXT: slli a5, a0, 26
-; RV64I-NEXT: add a4, a4, a5
-; RV64I-NEXT: sub a2, a2, a1
-; RV64I-NEXT: slli a1, a0, 20
-; RV64I-NEXT: sub a3, a3, a1
-; RV64I-NEXT: slli a1, a0, 28
-; RV64I-NEXT: sub a4, a4, a1
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a0, 24
+; RV64I-NEXT: sub a2, a7, a2
+; RV64I-NEXT: slli a7, a0, 26
+; RV64I-NEXT: sub a4, a4, a6
+; RV64I-NEXT: slli a6, a0, 28
+; RV64I-NEXT: sub a6, a7, a6
+; RV64I-NEXT: slli a7, a0, 2
+; RV64I-NEXT: sub a7, a7, a0
+; RV64I-NEXT: sub a1, a7, a1
+; RV64I-NEXT: slli a7, a0, 12
+; RV64I-NEXT: add a3, a3, a7
+; RV64I-NEXT: add a2, a5, a2
+; RV64I-NEXT: add a4, a4, a6
; RV64I-NEXT: slli a0, a0, 30
-; RV64I-NEXT: add a2, a2, a3
+; RV64I-NEXT: sub a1, a1, a3
+; RV64I-NEXT: add a1, a1, a2
; RV64I-NEXT: add a0, a4, a0
-; RV64I-NEXT: add a0, a2, a0
+; RV64I-NEXT: add a0, a1, a0
; RV64I-NEXT: ret
%a1 = mul i64 %a, 858993459
ret i64 %a1
@@ -231,30 +231,30 @@ define i32 @muli32_0xaaaaaaaa(i32 %a) nounwind {
; RV64I-NEXT: slli a4, a0, 7
; RV64I-NEXT: slli a5, a0, 9
; RV64I-NEXT: slli a6, a0, 11
+; RV64I-NEXT: slli a7, a0, 15
+; RV64I-NEXT: slli t0, a0, 17
; RV64I-NEXT: add a1, a2, a1
-; RV64I-NEXT: slli a2, a0, 15
+; RV64I-NEXT: slli a2, a0, 19
; RV64I-NEXT: add a3, a3, a4
-; RV64I-NEXT: slli a4, a0, 17
+; RV64I-NEXT: slli a4, a0, 21
; RV64I-NEXT: add a5, a5, a6
; RV64I-NEXT: slli a6, a0, 23
+; RV64I-NEXT: add a7, a7, t0
+; RV64I-NEXT: slli t0, a0, 25
; RV64I-NEXT: add a2, a2, a4
-; RV64I-NEXT: slli a4, a0, 25
-; RV64I-NEXT: add a4, a6, a4
+; RV64I-NEXT: slli a4, a0, 27
+; RV64I-NEXT: add a6, a6, t0
+; RV64I-NEXT: slli t0, a0, 29
+; RV64I-NEXT: add a4, a4, t0
; RV64I-NEXT: add a1, a1, a3
; RV64I-NEXT: slli a3, a0, 13
; RV64I-NEXT: add a3, a5, a3
-; RV64I-NEXT: slli a5, a0, 19
-; RV64I-NEXT: add a2, a2, a5
-; RV64I-NEXT: slli a5, a0, 27
-; RV64I-NEXT: add a4, a4, a5
-; RV64I-NEXT: add a1, a1, a3
-; RV64I-NEXT: slli a3, a0, 21
-; RV64I-NEXT: add a2, a2, a3
-; RV64I-NEXT: slli a3, a0, 29
-; RV64I-NEXT: add a3, a4, a3
+; RV64I-NEXT: add a2, a7, a2
+; RV64I-NEXT: add a4, a6, a4
; RV64I-NEXT: slli a0, a0, 31
+; RV64I-NEXT: add a1, a1, a3
; RV64I-NEXT: add a1, a1, a2
-; RV64I-NEXT: sub a0, a3, a0
+; RV64I-NEXT: sub a0, a4, a0
; RV64I-NEXT: add a0, a1, a0
; RV64I-NEXT: ret
%a1 = mul i32 %a, -1431655766
@@ -282,30 +282,30 @@ define i64 @muli64_0xaaaaaaaa(i64 %a) nounwind {
; RV64I-NEXT: slli a4, a0, 7
; RV64I-NEXT: slli a5, a0, 9
; RV64I-NEXT: slli a6, a0, 11
+; RV64I-NEXT: slli a7, a0, 15
+; RV64I-NEXT: slli t0, a0, 17
; RV64I-NEXT: add a1, a2, a1
-; RV64I-NEXT: slli a2, a0, 15
+; RV64I-NEXT: slli a2, a0, 19
; RV64I-NEXT: add a3, a3, a4
-; RV64I-NEXT: slli a4, a0, 17
+; RV64I-NEXT: slli a4, a0, 21
; RV64I-NEXT: add a5, a5, a6
; RV64I-NEXT: slli a6, a0, 23
+; RV64I-NEXT: add a7, a7, t0
+; RV64I-NEXT: slli t0, a0, 25
; RV64I-NEXT: add a2, a2, a4
-; RV64I-NEXT: slli a4, a0, 25
-; RV64I-NEXT: add a4, a6, a4
+; RV64I-NEXT: slli a4, a0, 27
+; RV64I-NEXT: add a6, a6, t0
+; RV64I-NEXT: slli t0, a0, 29
+; RV64I-NEXT: add a4, a4, t0
; RV64I-NEXT: add a1, a1, a3
; RV64I-NEXT: slli a3, a0, 13
; RV64I-NEXT: add a3, a5, a3
-; RV64I-NEXT: slli a5, a0, 19
-; RV64I-NEXT: add a2, a2, a5
-; RV64I-NEXT: slli a5, a0, 27
-; RV64I-NEXT: add a4, a4, a5
-; RV64I-NEXT: add a1, a1, a3
-; RV64I-NEXT: slli a3, a0, 21
-; RV64I-NEXT: add a2, a2, a3
-; RV64I-NEXT: slli a3, a0, 29
-; RV64I-NEXT: add a3, a4, a3
+; RV64I-NEXT: add a2, a7, a2
+; RV64I-NEXT: add a4, a6, a4
; RV64I-NEXT: slli a0, a0, 31
+; RV64I-NEXT: add a1, a1, a3
; RV64I-NEXT: add a1, a1, a2
-; RV64I-NEXT: add a0, a3, a0
+; RV64I-NEXT: add a0, a4, a0
; RV64I-NEXT: add a0, a1, a0
; RV64I-NEXT: ret
%a1 = mul i64 %a, 2863311530
@@ -745,22 +745,22 @@ define i32 @muli32_0x12345678(i32 %a) nounwind {
; RV64I-NEXT: slli a3, a0, 9
; RV64I-NEXT: slli a4, a0, 11
; RV64I-NEXT: slli a5, a0, 13
+; RV64I-NEXT: slli a6, a0, 15
; RV64I-NEXT: sub a2, a2, a1
-; RV64I-NEXT: slli a1, a0, 15
+; RV64I-NEXT: slli a1, a0, 20
; RV64I-NEXT: add a3, a3, a4
-; RV64I-NEXT: slli a4, a0, 20
-; RV64I-NEXT: sub a5, a5, a1
-; RV64I-NEXT: slli a1, a0, 22
-; RV64I-NEXT: sub a4, a4, a1
+; RV64I-NEXT: slli a4, a0, 22
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a0, 25
+; RV64I-NEXT: sub a1, a1, a4
+; RV64I-NEXT: slli a4, a0, 28
+; RV64I-NEXT: add a4, a6, a4
; RV64I-NEXT: sub a2, a2, a3
-; RV64I-NEXT: slli a1, a0, 18
-; RV64I-NEXT: sub a5, a5, a1
-; RV64I-NEXT: slli a1, a0, 25
-; RV64I-NEXT: sub a4, a4, a1
-; RV64I-NEXT: slli a0, a0, 28
+; RV64I-NEXT: slli a0, a0, 18
+; RV64I-NEXT: sub a5, a5, a0
; RV64I-NEXT: sub a2, a2, a5
-; RV64I-NEXT: sub a4, a4, a0
-; RV64I-NEXT: sub a0, a2, a4
+; RV64I-NEXT: sub a1, a1, a4
+; RV64I-NEXT: sub a0, a2, a1
; RV64I-NEXT: ret
%a1 = mul i32 %a, 305419896
ret i32 %a1
@@ -786,22 +786,22 @@ define i64 @muli64_0x12345678(i64 %a) nounwind {
; RV64I-NEXT: slli a3, a0, 9
; RV64I-NEXT: slli a4, a0, 11
; RV64I-NEXT: slli a5, a0, 13
+; RV64I-NEXT: slli a6, a0, 15
; RV64I-NEXT: sub a2, a2, a1
-; RV64I-NEXT: slli a1, a0, 15
+; RV64I-NEXT: slli a1, a0, 20
; RV64I-NEXT: add a3, a3, a4
-; RV64I-NEXT: slli a4, a0, 20
-; RV64I-NEXT: sub a5, a5, a1
-; RV64I-NEXT: slli a1, a0, 22
-; RV64I-NEXT: sub a4, a4, a1
+; RV64I-NEXT: slli a4, a0, 22
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a0, 25
+; RV64I-NEXT: sub a1, a1, a4
+; RV64I-NEXT: slli a4, a0, 28
+; RV64I-NEXT: add a4, a6, a4
; RV64I-NEXT: sub a2, a2, a3
-; RV64I-NEXT: slli a1, a0, 18
-; RV64I-NEXT: sub a5, a5, a1
-; RV64I-NEXT: slli a1, a0, 25
-; RV64I-NEXT: sub a4, a4, a1
-; RV64I-NEXT: slli a0, a0, 28
+; RV64I-NEXT: slli a0, a0, 18
+; RV64I-NEXT: sub a5, a5, a0
; RV64I-NEXT: sub a2, a2, a5
-; RV64I-NEXT: sub a4, a4, a0
-; RV64I-NEXT: sub a0, a2, a4
+; RV64I-NEXT: sub a1, a1, a4
+; RV64I-NEXT: sub a0, a2, a1
; RV64I-NEXT: ret
%a1 = mul i64 %a, 305419896
ret i64 %a1
diff --git a/llvm/test/CodeGen/RISCV/rv64xtheadbb.ll b/llvm/test/CodeGen/RISCV/rv64xtheadbb.ll
index c62fb0ae63555..cbccfcb37dc3a 100644
--- a/llvm/test/CodeGen/RISCV/rv64xtheadbb.ll
+++ b/llvm/test/CodeGen/RISCV/rv64xtheadbb.ll
@@ -395,23 +395,23 @@ define signext i32 @cttz_i32(i32 signext %a) nounwind {
; RV64I-NEXT: slli a2, a0, 8
; RV64I-NEXT: slli a3, a0, 10
; RV64I-NEXT: slli a4, a0, 12
+; RV64I-NEXT: slli a5, a0, 16
; RV64I-NEXT: add a1, a1, a2
-; RV64I-NEXT: slli a2, a0, 16
-; RV64I-NEXT: sub a3, a3, a4
-; RV64I-NEXT: slli a4, a0, 18
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a4, a0, 4
-; RV64I-NEXT: sub a4, a0, a4
-; RV64I-NEXT: add a1, a4, a1
-; RV64I-NEXT: slli a4, a0, 14
+; RV64I-NEXT: slli a2, a0, 18
; RV64I-NEXT: sub a3, a3, a4
; RV64I-NEXT: slli a4, a0, 23
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a0, a0, 27
+; RV64I-NEXT: sub a5, a5, a2
+; RV64I-NEXT: slli a2, a0, 27
+; RV64I-NEXT: sub a4, a4, a2
+; RV64I-NEXT: slli a2, a0, 4
+; RV64I-NEXT: sub a2, a0, a2
+; RV64I-NEXT: add a1, a2, a1
+; RV64I-NEXT: slli a0, a0, 14
+; RV64I-NEXT: sub a3, a3, a0
+; RV64I-NEXT: sub a5, a5, a4
; RV64I-NEXT: add a1, a1, a3
-; RV64I-NEXT: add a0, a2, a0
-; RV64I-NEXT: add a0, a1, a0
-; RV64I-NEXT: srliw a0, a0, 27
+; RV64I-NEXT: add a1, a1, a5
+; RV64I-NEXT: srliw a0, a1, 27
; RV64I-NEXT: lui a1, %hi(.LCPI6_0)
; RV64I-NEXT: addi a1, a1, %lo(.LCPI6_0)
; RV64I-NEXT: add a0, a1, a0
@@ -453,23 +453,23 @@ define signext i32 @cttz_zero_undef_i32(i32 signext %a) nounwind {
; RV64I-NEXT: slli a2, a0, 8
; RV64I-NEXT: slli a3, a0, 10
; RV64I-NEXT: slli a4, a0, 12
+; RV64I-NEXT: slli a5, a0, 16
; RV64I-NEXT: add a1, a1, a2
-; RV64I-NEXT: slli a2, a0, 16
-; RV64I-NEXT: sub a3, a3, a4
-; RV64I-NEXT: slli a4, a0, 18
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a4, a0, 4
-; RV64I-NEXT: sub a4, a0, a4
-; RV64I-NEXT: add a1, a4, a1
-; RV64I-NEXT: slli a4, a0, 14
+; RV64I-NEXT: slli a2, a0, 18
; RV64I-NEXT: sub a3, a3, a4
; RV64I-NEXT: slli a4, a0, 23
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a0, a0, 27
+; RV64I-NEXT: sub a5, a5, a2
+; RV64I-NEXT: slli a2, a0, 27
+; RV64I-NEXT: sub a4, a4, a2
+; RV64I-NEXT: slli a2, a0, 4
+; RV64I-NEXT: sub a2, a0, a2
+; RV64I-NEXT: add a1, a2, a1
+; RV64I-NEXT: slli a0, a0, 14
+; RV64I-NEXT: sub a3, a3, a0
+; RV64I-NEXT: sub a5, a5, a4
; RV64I-NEXT: add a1, a1, a3
-; RV64I-NEXT: add a0, a2, a0
-; RV64I-NEXT: add a0, a1, a0
-; RV64I-NEXT: srliw a0, a0, 27
+; RV64I-NEXT: add a1, a1, a5
+; RV64I-NEXT: srliw a0, a1, 27
; RV64I-NEXT: lui a1, %hi(.LCPI7_0)
; RV64I-NEXT: addi a1, a1, %lo(.LCPI7_0)
; RV64I-NEXT: add a0, a1, a0
@@ -503,23 +503,23 @@ define signext i32 @findFirstSet_i32(i32 signext %a) nounwind {
; RV64I-NEXT: slli a3, a1, 8
; RV64I-NEXT: slli a4, a1, 10
; RV64I-NEXT: slli a5, a1, 12
+; RV64I-NEXT: slli a6, a1, 16
; RV64I-NEXT: add a2, a2, a3
-; RV64I-NEXT: slli a3, a1, 16
-; RV64I-NEXT: sub a4, a4, a5
-; RV64I-NEXT: slli a5, a1, 18
-; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a5, a1, 4
-; RV64I-NEXT: sub a5, a1, a5
-; RV64I-NEXT: add a2, a5, a2
-; RV64I-NEXT: slli a5, a1, 14
+; RV64I-NEXT: slli a3, a1, 18
; RV64I-NEXT: sub a4, a4, a5
; RV64I-NEXT: slli a5, a1, 23
+; RV64I-NEXT: sub a3, a6, a3
+; RV64I-NEXT: slli a6, a1, 27
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a1, 4
+; RV64I-NEXT: sub a6, a1, a6
+; RV64I-NEXT: add a2, a6, a2
+; RV64I-NEXT: slli a1, a1, 14
+; RV64I-NEXT: sub a4, a4, a1
; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a1, a1, 27
; RV64I-NEXT: add a2, a2, a4
-; RV64I-NEXT: add a1, a3, a1
-; RV64I-NEXT: add a1, a2, a1
-; RV64I-NEXT: srliw a1, a1, 27
+; RV64I-NEXT: add a2, a2, a3
+; RV64I-NEXT: srliw a1, a2, 27
; RV64I-NEXT: lui a2, %hi(.LCPI8_0)
; RV64I-NEXT: addi a2, a2, %lo(.LCPI8_0)
; RV64I-NEXT: add a1, a2, a1
@@ -564,26 +564,26 @@ define signext i32 @ffs_i32(i32 signext %a) nounwind {
; RV64I-NEXT: slli a3, a1, 8
; RV64I-NEXT: slli a4, a1, 10
; RV64I-NEXT: slli a5, a1, 12
+; RV64I-NEXT: slli a6, a1, 16
; RV64I-NEXT: add a2, a2, a3
-; RV64I-NEXT: slli a3, a1, 16
-; RV64I-NEXT: sub a4, a4, a5
-; RV64I-NEXT: slli a5, a1, 18
-; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a5, a1, 4
-; RV64I-NEXT: sub a5, a1, a5
-; RV64I-NEXT: add a2, a5, a2
-; RV64I-NEXT: slli a5, a1, 14
+; RV64I-NEXT: slli a3, a1, 18
; RV64I-NEXT: sub a4, a4, a5
; RV64I-NEXT: slli a5, a1, 23
+; RV64I-NEXT: sub a3, a6, a3
+; RV64I-NEXT: slli a6, a1, 27
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a1, 4
+; RV64I-NEXT: sub a6, a1, a6
+; RV64I-NEXT: add a2, a6, a2
+; RV64I-NEXT: slli a1, a1, 14
+; RV64I-NEXT: sub a4, a4, a1
; RV64I-NEXT: sub a3, a3, a5
+; RV64I-NEXT: lui a1, %hi(.LCPI9_0)
+; RV64I-NEXT: addi a1, a1, %lo(.LCPI9_0)
; RV64I-NEXT: add a2, a2, a4
-; RV64I-NEXT: lui a4, %hi(.LCPI9_0)
-; RV64I-NEXT: addi a4, a4, %lo(.LCPI9_0)
-; RV64I-NEXT: slli a1, a1, 27
-; RV64I-NEXT: add a1, a3, a1
-; RV64I-NEXT: add a1, a2, a1
-; RV64I-NEXT: srliw a1, a1, 27
-; RV64I-NEXT: add a1, a4, a1
+; RV64I-NEXT: add a2, a2, a3
+; RV64I-NEXT: srliw a2, a2, 27
+; RV64I-NEXT: add a1, a1, a2
; RV64I-NEXT: lbu a1, 0(a1)
; RV64I-NEXT: seqz a0, a0
; RV64I-NEXT: addi a1, a1, 1
diff --git a/llvm/test/CodeGen/RISCV/rv64zba.ll b/llvm/test/CodeGen/RISCV/rv64zba.ll
index 0afd6f5727934..5f1cb3ff41665 100644
--- a/llvm/test/CodeGen/RISCV/rv64zba.ll
+++ b/llvm/test/CodeGen/RISCV/rv64zba.ll
@@ -5098,8 +5098,7 @@ define i32 @shl_add_shl_add(i32 %a, i32 %b, i32 %c) {
;
; RV64ZBA-LABEL: shl_add_shl_add:
; RV64ZBA: # %bb.0:
-; RV64ZBA-NEXT: slli a2, a2, 5
-; RV64ZBA-NEXT: add a1, a1, a2
+; RV64ZBA-NEXT: sh2add a0, a2, a0
; RV64ZBA-NEXT: sh3add a0, a0, a1
; RV64ZBA-NEXT: sext.w a0, a0
; RV64ZBA-NEXT: ret
diff --git a/llvm/test/CodeGen/RISCV/rv64zbb.ll b/llvm/test/CodeGen/RISCV/rv64zbb.ll
index b3581459c2622..f47aaefb06ca5 100644
--- a/llvm/test/CodeGen/RISCV/rv64zbb.ll
+++ b/llvm/test/CodeGen/RISCV/rv64zbb.ll
@@ -347,23 +347,23 @@ define signext i32 @cttz_i32(i32 signext %a) nounwind {
; RV64I-NEXT: slli a2, a0, 8
; RV64I-NEXT: slli a3, a0, 10
; RV64I-NEXT: slli a4, a0, 12
+; RV64I-NEXT: slli a5, a0, 16
; RV64I-NEXT: add a1, a1, a2
-; RV64I-NEXT: slli a2, a0, 16
-; RV64I-NEXT: sub a3, a3, a4
-; RV64I-NEXT: slli a4, a0, 18
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a4, a0, 4
-; RV64I-NEXT: sub a4, a0, a4
-; RV64I-NEXT: add a1, a4, a1
-; RV64I-NEXT: slli a4, a0, 14
+; RV64I-NEXT: slli a2, a0, 18
; RV64I-NEXT: sub a3, a3, a4
; RV64I-NEXT: slli a4, a0, 23
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a0, a0, 27
+; RV64I-NEXT: sub a5, a5, a2
+; RV64I-NEXT: slli a2, a0, 27
+; RV64I-NEXT: sub a4, a4, a2
+; RV64I-NEXT: slli a2, a0, 4
+; RV64I-NEXT: sub a2, a0, a2
+; RV64I-NEXT: add a1, a2, a1
+; RV64I-NEXT: slli a0, a0, 14
+; RV64I-NEXT: sub a3, a3, a0
+; RV64I-NEXT: sub a5, a5, a4
; RV64I-NEXT: add a1, a1, a3
-; RV64I-NEXT: add a0, a2, a0
-; RV64I-NEXT: add a0, a1, a0
-; RV64I-NEXT: srliw a0, a0, 27
+; RV64I-NEXT: add a1, a1, a5
+; RV64I-NEXT: srliw a0, a1, 27
; RV64I-NEXT: lui a1, %hi(.LCPI6_0)
; RV64I-NEXT: addi a1, a1, %lo(.LCPI6_0)
; RV64I-NEXT: add a0, a1, a0
@@ -390,23 +390,23 @@ define signext i32 @cttz_zero_undef_i32(i32 signext %a) nounwind {
; RV64I-NEXT: slli a2, a0, 8
; RV64I-NEXT: slli a3, a0, 10
; RV64I-NEXT: slli a4, a0, 12
+; RV64I-NEXT: slli a5, a0, 16
; RV64I-NEXT: add a1, a1, a2
-; RV64I-NEXT: slli a2, a0, 16
-; RV64I-NEXT: sub a3, a3, a4
-; RV64I-NEXT: slli a4, a0, 18
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a4, a0, 4
-; RV64I-NEXT: sub a4, a0, a4
-; RV64I-NEXT: add a1, a4, a1
-; RV64I-NEXT: slli a4, a0, 14
+; RV64I-NEXT: slli a2, a0, 18
; RV64I-NEXT: sub a3, a3, a4
; RV64I-NEXT: slli a4, a0, 23
-; RV64I-NEXT: sub a2, a2, a4
-; RV64I-NEXT: slli a0, a0, 27
+; RV64I-NEXT: sub a5, a5, a2
+; RV64I-NEXT: slli a2, a0, 27
+; RV64I-NEXT: sub a4, a4, a2
+; RV64I-NEXT: slli a2, a0, 4
+; RV64I-NEXT: sub a2, a0, a2
+; RV64I-NEXT: add a1, a2, a1
+; RV64I-NEXT: slli a0, a0, 14
+; RV64I-NEXT: sub a3, a3, a0
+; RV64I-NEXT: sub a5, a5, a4
; RV64I-NEXT: add a1, a1, a3
-; RV64I-NEXT: add a0, a2, a0
-; RV64I-NEXT: add a0, a1, a0
-; RV64I-NEXT: srliw a0, a0, 27
+; RV64I-NEXT: add a1, a1, a5
+; RV64I-NEXT: srliw a0, a1, 27
; RV64I-NEXT: lui a1, %hi(.LCPI7_0)
; RV64I-NEXT: addi a1, a1, %lo(.LCPI7_0)
; RV64I-NEXT: add a0, a1, a0
@@ -430,23 +430,23 @@ define signext i32 @findFirstSet_i32(i32 signext %a) nounwind {
; RV64I-NEXT: slli a3, a1, 8
; RV64I-NEXT: slli a4, a1, 10
; RV64I-NEXT: slli a5, a1, 12
+; RV64I-NEXT: slli a6, a1, 16
; RV64I-NEXT: add a2, a2, a3
-; RV64I-NEXT: slli a3, a1, 16
-; RV64I-NEXT: sub a4, a4, a5
-; RV64I-NEXT: slli a5, a1, 18
-; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a5, a1, 4
-; RV64I-NEXT: sub a5, a1, a5
-; RV64I-NEXT: add a2, a5, a2
-; RV64I-NEXT: slli a5, a1, 14
+; RV64I-NEXT: slli a3, a1, 18
; RV64I-NEXT: sub a4, a4, a5
; RV64I-NEXT: slli a5, a1, 23
+; RV64I-NEXT: sub a3, a6, a3
+; RV64I-NEXT: slli a6, a1, 27
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a1, 4
+; RV64I-NEXT: sub a6, a1, a6
+; RV64I-NEXT: add a2, a6, a2
+; RV64I-NEXT: slli a1, a1, 14
+; RV64I-NEXT: sub a4, a4, a1
; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a1, a1, 27
; RV64I-NEXT: add a2, a2, a4
-; RV64I-NEXT: add a1, a3, a1
-; RV64I-NEXT: add a1, a2, a1
-; RV64I-NEXT: srliw a1, a1, 27
+; RV64I-NEXT: add a2, a2, a3
+; RV64I-NEXT: srliw a1, a2, 27
; RV64I-NEXT: lui a2, %hi(.LCPI8_0)
; RV64I-NEXT: addi a2, a2, %lo(.LCPI8_0)
; RV64I-NEXT: add a1, a2, a1
@@ -478,26 +478,26 @@ define signext i32 @ffs_i32(i32 signext %a) nounwind {
; RV64I-NEXT: slli a3, a1, 8
; RV64I-NEXT: slli a4, a1, 10
; RV64I-NEXT: slli a5, a1, 12
+; RV64I-NEXT: slli a6, a1, 16
; RV64I-NEXT: add a2, a2, a3
-; RV64I-NEXT: slli a3, a1, 16
-; RV64I-NEXT: sub a4, a4, a5
-; RV64I-NEXT: slli a5, a1, 18
-; RV64I-NEXT: sub a3, a3, a5
-; RV64I-NEXT: slli a5, a1, 4
-; RV64I-NEXT: sub a5, a1, a5
-; RV64I-NEXT: add a2, a5, a2
-; RV64I-NEXT: slli a5, a1, 14
+; RV64I-NEXT: slli a3, a1, 18
; RV64I-NEXT: sub a4, a4, a5
; RV64I-NEXT: slli a5, a1, 23
+; RV64I-NEXT: sub a3, a6, a3
+; RV64I-NEXT: slli a6, a1, 27
+; RV64I-NEXT: sub a5, a5, a6
+; RV64I-NEXT: slli a6, a1, 4
+; RV64I-NEXT: sub a6, a1, a6
+; RV64I-NEXT: add a2, a6, a2
+; RV64I-NEXT: slli a1, a1, 14
+; RV64I-NEXT: sub a4, a4, a1
; RV64I-NEXT: sub a3, a3, a5
+; RV64I-NEXT: lui a1, %hi(.LCPI9_0)
+; RV64I-NEXT: addi a1, a1, %lo(.LCPI9_0)
; RV64I-NEXT: add a2, a2, a4
-; RV64I-NEXT: lui a4, %hi(.LCPI9_0)
-; RV64I-NEXT: addi a4, a4, %lo(.LCPI9_0)
-; RV64I-NEXT: slli a1, a1, 27
-; RV64I-NEXT: add a1, a3, a1
-; RV64I-NEXT: add a1, a2, a1
-; RV64I-NEXT: srliw a1, a1, 27
-; RV64I-NEXT: add a1, a4, a1
+; RV64I-NEXT: add a2, a2, a3
+; RV64I-NEXT: srliw a2, a2, 27
+; RV64I-NEXT: add a1, a1, a2
; RV64I-NEXT: lbu a1, 0(a1)
; RV64I-NEXT: seqz a0, a0
; RV64I-NEXT: addi a1, a1, 1
diff --git a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-int-explodevector.ll b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-int-explodevector.ll
index 719659823ed91..7cb4fd7bb2e65 100644
--- a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-int-explodevector.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-int-explodevector.ll
@@ -88,56 +88,107 @@ define i8 @explode_8xi8(<8 x i8> %v) {
}
define i8 @explode_16xi8(<16 x i8> %v) {
-; CHECK-LABEL: explode_16xi8:
-; CHECK: # %bb.0:
-; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma
-; CHECK-NEXT: vslidedown.vi v9, v8, 2
-; CHECK-NEXT: vmv.x.s a0, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 3
-; CHECK-NEXT: vmv.x.s a1, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 4
-; CHECK-NEXT: vmv.x.s a2, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 5
-; CHECK-NEXT: vmv.x.s a3, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 6
-; CHECK-NEXT: vmv.x.s a4, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 7
-; CHECK-NEXT: vmv.x.s a5, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 8
-; CHECK-NEXT: vmv.x.s a6, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 9
-; CHECK-NEXT: vmv.x.s a7, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 10
-; CHECK-NEXT: vmv.x.s t0, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 11
-; CHECK-NEXT: vmv.x.s t1, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 12
-; CHECK-NEXT: vmv.x.s t2, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 13
-; CHECK-NEXT: vmv.x.s t3, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 14
-; CHECK-NEXT: vmv.x.s t4, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 15
-; CHECK-NEXT: vmv.x.s t5, v9
-; CHECK-NEXT: vmv.s.x v9, zero
-; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
-; CHECK-NEXT: vredxor.vs v8, v8, v9
-; CHECK-NEXT: vmv.x.s t6, v8
-; CHECK-NEXT: add a0, a0, a1
-; CHECK-NEXT: add a2, a2, a3
-; CHECK-NEXT: add a5, a5, a6
-; CHECK-NEXT: add t1, t1, t2
-; CHECK-NEXT: add a0, t6, a0
-; CHECK-NEXT: add a2, a2, a4
-; CHECK-NEXT: add a5, a5, a7
-; CHECK-NEXT: add t1, t1, t3
-; CHECK-NEXT: add a0, a0, a2
-; CHECK-NEXT: add a5, a5, t0
-; CHECK-NEXT: add t1, t1, t4
-; CHECK-NEXT: add a0, a0, a5
-; CHECK-NEXT: add t1, t1, t5
-; CHECK-NEXT: add a0, a0, t1
-; CHECK-NEXT: ret
+; RV32-LABEL: explode_16xi8:
+; RV32: # %bb.0:
+; RV32-NEXT: vsetivli zero, 1, e8, m1, ta, ma
+; RV32-NEXT: vslidedown.vi v9, v8, 2
+; RV32-NEXT: vmv.x.s a0, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 3
+; RV32-NEXT: vmv.x.s a1, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 4
+; RV32-NEXT: vmv.x.s a2, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 5
+; RV32-NEXT: vmv.x.s a3, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 6
+; RV32-NEXT: vmv.x.s a4, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 7
+; RV32-NEXT: vmv.x.s a5, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 8
+; RV32-NEXT: vmv.x.s a6, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 9
+; RV32-NEXT: vmv.x.s a7, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 10
+; RV32-NEXT: vmv.x.s t0, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 11
+; RV32-NEXT: vmv.x.s t1, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 12
+; RV32-NEXT: vmv.x.s t2, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 13
+; RV32-NEXT: vmv.x.s t3, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 14
+; RV32-NEXT: vmv.x.s t4, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 15
+; RV32-NEXT: vmv.x.s t5, v9
+; RV32-NEXT: vmv.s.x v9, zero
+; RV32-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
+; RV32-NEXT: vredxor.vs v8, v8, v9
+; RV32-NEXT: vmv.x.s t6, v8
+; RV32-NEXT: add a0, a0, a1
+; RV32-NEXT: add a2, a2, a3
+; RV32-NEXT: add a5, a5, a6
+; RV32-NEXT: add t1, t1, t2
+; RV32-NEXT: add a0, t6, a0
+; RV32-NEXT: add a2, a2, a4
+; RV32-NEXT: add a5, a5, a7
+; RV32-NEXT: add t1, t1, t3
+; RV32-NEXT: add a0, a0, a2
+; RV32-NEXT: add a5, a5, t0
+; RV32-NEXT: add t1, t1, t4
+; RV32-NEXT: add a0, a0, a5
+; RV32-NEXT: add t1, t1, t5
+; RV32-NEXT: add a0, a0, t1
+; RV32-NEXT: ret
+;
+; RV64-LABEL: explode_16xi8:
+; RV64: # %bb.0:
+; RV64-NEXT: vsetivli zero, 1, e8, m1, ta, ma
+; RV64-NEXT: vslidedown.vi v9, v8, 2
+; RV64-NEXT: vmv.x.s a0, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 3
+; RV64-NEXT: vmv.x.s a1, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 4
+; RV64-NEXT: vmv.x.s a2, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 5
+; RV64-NEXT: vmv.x.s a3, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 6
+; RV64-NEXT: vmv.x.s a4, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 7
+; RV64-NEXT: vmv.x.s a5, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 8
+; RV64-NEXT: vmv.x.s a6, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 9
+; RV64-NEXT: vmv.x.s a7, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 10
+; RV64-NEXT: vmv.x.s t0, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 11
+; RV64-NEXT: vmv.x.s t1, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 12
+; RV64-NEXT: vmv.x.s t2, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 13
+; RV64-NEXT: vmv.x.s t3, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 14
+; RV64-NEXT: vmv.x.s t4, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 15
+; RV64-NEXT: vmv.x.s t5, v9
+; RV64-NEXT: vmv.s.x v9, zero
+; RV64-NEXT: vsetivli zero, 2, e8, mf8, ta, ma
+; RV64-NEXT: vredxor.vs v8, v8, v9
+; RV64-NEXT: vmv.x.s t6, v8
+; RV64-NEXT: add a0, a0, a1
+; RV64-NEXT: add a2, a2, a3
+; RV64-NEXT: add a5, a5, a6
+; RV64-NEXT: add a7, a7, t0
+; RV64-NEXT: add t1, t1, t2
+; RV64-NEXT: add t3, t3, t4
+; RV64-NEXT: add a0, t6, a0
+; RV64-NEXT: add a2, a2, a4
+; RV64-NEXT: add a5, a5, a7
+; RV64-NEXT: add t1, t1, t3
+; RV64-NEXT: add a0, a0, a2
+; RV64-NEXT: add a0, a0, a5
+; RV64-NEXT: add t1, t1, t5
+; RV64-NEXT: add a0, a0, t1
+; RV64-NEXT: ret
%e0 = extractelement <16 x i8> %v, i32 0
%e1 = extractelement <16 x i8> %v, i32 1
%e2 = extractelement <16 x i8> %v, i32 2
@@ -258,57 +309,109 @@ define i16 @explode_8xi16(<8 x i16> %v) {
}
define i16 @explode_16xi16(<16 x i16> %v) {
-; CHECK-LABEL: explode_16xi16:
-; CHECK: # %bb.0:
-; CHECK-NEXT: vsetivli zero, 1, e16, m2, ta, ma
-; CHECK-NEXT: vslidedown.vi v10, v8, 8
-; CHECK-NEXT: vmv.x.s a0, v10
-; CHECK-NEXT: vslidedown.vi v10, v8, 9
-; CHECK-NEXT: vmv.x.s a1, v10
-; CHECK-NEXT: vslidedown.vi v10, v8, 10
-; CHECK-NEXT: vmv.x.s a2, v10
-; CHECK-NEXT: vslidedown.vi v10, v8, 11
-; CHECK-NEXT: vmv.x.s a3, v10
-; CHECK-NEXT: vslidedown.vi v10, v8, 12
-; CHECK-NEXT: vmv.x.s a4, v10
-; CHECK-NEXT: vslidedown.vi v10, v8, 13
-; CHECK-NEXT: vmv.x.s a5, v10
-; CHECK-NEXT: vslidedown.vi v10, v8, 14
-; CHECK-NEXT: vmv.x.s a6, v10
-; CHECK-NEXT: vslidedown.vi v10, v8, 15
-; CHECK-NEXT: vmv.x.s a7, v10
-; CHECK-NEXT: vsetivli zero, 1, e16, m1, ta, ma
-; CHECK-NEXT: vslidedown.vi v9, v8, 2
-; CHECK-NEXT: vslidedown.vi v10, v8, 3
-; CHECK-NEXT: vmv.x.s t0, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 4
-; CHECK-NEXT: vmv.x.s t1, v10
-; CHECK-NEXT: vslidedown.vi v10, v8, 5
-; CHECK-NEXT: vmv.x.s t2, v9
-; CHECK-NEXT: vslidedown.vi v9, v8, 6
-; CHECK-NEXT: vmv.x.s t3, v10
-; CHECK-NEXT: vslidedown.vi v10, v8, 7
-; CHECK-NEXT: vmv.x.s t4, v9
-; CHECK-NEXT: vmv.s.x v9, zero
-; CHECK-NEXT: vmv.x.s t5, v10
-; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
-; CHECK-NEXT: vredxor.vs v8, v8, v9
-; CHECK-NEXT: vmv.x.s t6, v8
-; CHECK-NEXT: add t0, t0, t1
-; CHECK-NEXT: add t2, t2, t3
-; CHECK-NEXT: add a0, t5, a0
-; CHECK-NEXT: add a3, a3, a4
-; CHECK-NEXT: add t0, t6, t0
-; CHECK-NEXT: add t2, t2, t4
-; CHECK-NEXT: add a0, a0, a1
-; CHECK-NEXT: add a3, a3, a5
-; CHECK-NEXT: add t0, t0, t2
-; CHECK-NEXT: add a0, a0, a2
-; CHECK-NEXT: add a3, a3, a6
-; CHECK-NEXT: add a0, t0, a0
-; CHECK-NEXT: add a3, a3, a7
-; CHECK-NEXT: add a0, a0, a3
-; CHECK-NEXT: ret
+; RV32-LABEL: explode_16xi16:
+; RV32: # %bb.0:
+; RV32-NEXT: vsetivli zero, 1, e16, m2, ta, ma
+; RV32-NEXT: vslidedown.vi v10, v8, 8
+; RV32-NEXT: vmv.x.s a0, v10
+; RV32-NEXT: vslidedown.vi v10, v8, 9
+; RV32-NEXT: vmv.x.s a1, v10
+; RV32-NEXT: vslidedown.vi v10, v8, 10
+; RV32-NEXT: vmv.x.s a2, v10
+; RV32-NEXT: vslidedown.vi v10, v8, 11
+; RV32-NEXT: vmv.x.s a3, v10
+; RV32-NEXT: vslidedown.vi v10, v8, 12
+; RV32-NEXT: vmv.x.s a4, v10
+; RV32-NEXT: vslidedown.vi v10, v8, 13
+; RV32-NEXT: vmv.x.s a5, v10
+; RV32-NEXT: vslidedown.vi v10, v8, 14
+; RV32-NEXT: vmv.x.s a6, v10
+; RV32-NEXT: vslidedown.vi v10, v8, 15
+; RV32-NEXT: vmv.x.s a7, v10
+; RV32-NEXT: vsetivli zero, 1, e16, m1, ta, ma
+; RV32-NEXT: vslidedown.vi v9, v8, 2
+; RV32-NEXT: vslidedown.vi v10, v8, 3
+; RV32-NEXT: vmv.x.s t0, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 4
+; RV32-NEXT: vmv.x.s t1, v10
+; RV32-NEXT: vslidedown.vi v10, v8, 5
+; RV32-NEXT: vmv.x.s t2, v9
+; RV32-NEXT: vslidedown.vi v9, v8, 6
+; RV32-NEXT: vmv.x.s t3, v10
+; RV32-NEXT: vslidedown.vi v10, v8, 7
+; RV32-NEXT: vmv.x.s t4, v9
+; RV32-NEXT: vmv.s.x v9, zero
+; RV32-NEXT: vmv.x.s t5, v10
+; RV32-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
+; RV32-NEXT: vredxor.vs v8, v8, v9
+; RV32-NEXT: vmv.x.s t6, v8
+; RV32-NEXT: add t0, t0, t1
+; RV32-NEXT: add t2, t2, t3
+; RV32-NEXT: add a0, t5, a0
+; RV32-NEXT: add a3, a3, a4
+; RV32-NEXT: add t0, t6, t0
+; RV32-NEXT: add t2, t2, t4
+; RV32-NEXT: add a0, a0, a1
+; RV32-NEXT: add a3, a3, a5
+; RV32-NEXT: add t0, t0, t2
+; RV32-NEXT: add a0, a0, a2
+; RV32-NEXT: add a3, a3, a6
+; RV32-NEXT: add a0, t0, a0
+; RV32-NEXT: add a3, a3, a7
+; RV32-NEXT: add a0, a0, a3
+; RV32-NEXT: ret
+;
+; RV64-LABEL: explode_16xi16:
+; RV64: # %bb.0:
+; RV64-NEXT: vsetivli zero, 1, e16, m2, ta, ma
+; RV64-NEXT: vslidedown.vi v10, v8, 8
+; RV64-NEXT: vmv.x.s a0, v10
+; RV64-NEXT: vslidedown.vi v10, v8, 9
+; RV64-NEXT: vmv.x.s a1, v10
+; RV64-NEXT: vslidedown.vi v10, v8, 10
+; RV64-NEXT: vmv.x.s a2, v10
+; RV64-NEXT: vslidedown.vi v10, v8, 11
+; RV64-NEXT: vmv.x.s a3, v10
+; RV64-NEXT: vslidedown.vi v10, v8, 12
+; RV64-NEXT: vmv.x.s a4, v10
+; RV64-NEXT: vslidedown.vi v10, v8, 13
+; RV64-NEXT: vmv.x.s a5, v10
+; RV64-NEXT: vslidedown.vi v10, v8, 14
+; RV64-NEXT: vmv.x.s a6, v10
+; RV64-NEXT: vslidedown.vi v10, v8, 15
+; RV64-NEXT: vmv.x.s a7, v10
+; RV64-NEXT: vsetivli zero, 1, e16, m1, ta, ma
+; RV64-NEXT: vslidedown.vi v9, v8, 2
+; RV64-NEXT: vslidedown.vi v10, v8, 3
+; RV64-NEXT: vmv.x.s t0, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 4
+; RV64-NEXT: vmv.x.s t1, v10
+; RV64-NEXT: vslidedown.vi v10, v8, 5
+; RV64-NEXT: vmv.x.s t2, v9
+; RV64-NEXT: vslidedown.vi v9, v8, 6
+; RV64-NEXT: vmv.x.s t3, v10
+; RV64-NEXT: vslidedown.vi v10, v8, 7
+; RV64-NEXT: vmv.x.s t4, v9
+; RV64-NEXT: vmv.s.x v9, zero
+; RV64-NEXT: vmv.x.s t5, v10
+; RV64-NEXT: vsetivli zero, 2, e16, mf4, ta, ma
+; RV64-NEXT: vredxor.vs v8, v8, v9
+; RV64-NEXT: vmv.x.s t6, v8
+; RV64-NEXT: add t0, t0, t1
+; RV64-NEXT: add t2, t2, t3
+; RV64-NEXT: add a0, t5, a0
+; RV64-NEXT: add a1, a1, a2
+; RV64-NEXT: add a3, a3, a4
+; RV64-NEXT: add a5, a5, a6
+; RV64-NEXT: add t0, t6, t0
+; RV64-NEXT: add t2, t2, t4
+; RV64-NEXT: add a0, a0, a1
+; RV64-NEXT: add a3, a3, a5
+; RV64-NEXT: add t0, t0, t2
+; RV64-NEXT: add a0, t0, a0
+; RV64-NEXT: add a3, a3, a7
+; RV64-NEXT: add a0, a0, a3
+; RV64-NEXT: ret
%e0 = extractelement <16 x i16> %v, i32 0
%e1 = extractelement <16 x i16> %v, i32 1
%e2 = extractelement <16 x i16> %v, i32 2
@@ -585,11 +688,11 @@ define i32 @explode_16xi32(<16 x i32> %v) {
; RV64-NEXT: add a3, a3, a4
; RV64-NEXT: add a7, a7, t0
; RV64-NEXT: add t2, t2, t3
+; RV64-NEXT: add t4, t4, t5
; RV64-NEXT: add a0, a0, a3
; RV64-NEXT: add a7, a7, t1
-; RV64-NEXT: add t2, t2, t4
; RV64-NEXT: add a0, a0, a7
-; RV64-NEXT: add t2, t2, t5
+; RV64-NEXT: add t2, t2, t4
; RV64-NEXT: addw a0, a0, t2
; RV64-NEXT: addi sp, s0, -128
; RV64-NEXT: .cfi_def_cfa sp, 128
@@ -1070,14 +1173,14 @@ define i64 @explode_16xi64(<16 x i64> %v) {
; RV64-NEXT: add a3, a3, a4
; RV64-NEXT: add a5, a5, a6
; RV64-NEXT: add t0, t0, t1
+; RV64-NEXT: add t2, t2, t3
+; RV64-NEXT: add t4, t4, t5
; RV64-NEXT: add a0, a0, a3
; RV64-NEXT: add a5, a5, a7
; RV64-NEXT: add t0, t0, t2
; RV64-NEXT: add a0, a0, a5
-; RV64-NEXT: add t0, t0, t3
+; RV64-NEXT: add t0, t0, t4
; RV64-NEXT: add a0, a0, t0
-; RV64-NEXT: add t4, t4, t5
-; RV64-NEXT: add a0, a0, t4
; RV64-NEXT: addi sp, s0, -256
; RV64-NEXT: .cfi_def_cfa sp, 256
; RV64-NEXT: ld ra, 248(sp) # 8-byte Folded Reload
@@ -1205,14 +1308,14 @@ define i32 @explode_16xi32_exact_vlen(<16 x i32> %v) vscale_range(2, 2) {
; RV64-NEXT: add a0, a0, a2
; RV64-NEXT: add a1, a1, a3
; RV64-NEXT: add a5, a6, a5
+; RV64-NEXT: add a7, a7, t0
; RV64-NEXT: add t1, t2, t1
+; RV64-NEXT: add t3, t3, t4
; RV64-NEXT: add a0, t6, a0
; RV64-NEXT: add a1, a1, a4
; RV64-NEXT: add a5, a5, a7
; RV64-NEXT: add t1, t1, t3
; RV64-NEXT: add a0, a0, a1
-; RV64-NEXT: add a5, a5, t0
-; RV64-NEXT: add t1, t1, t4
; RV64-NEXT: add a0, a0, a5
; RV64-NEXT: add t1, t1, t5
; RV64-NEXT: addw a0, a0, t1
diff --git a/llvm/test/CodeGen/RISCV/rvv/known-never-zero.ll b/llvm/test/CodeGen/RISCV/rvv/known-never-zero.ll
index 749b2041aa63d..41ead021b4dc9 100644
--- a/llvm/test/CodeGen/RISCV/rvv/known-never-zero.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/known-never-zero.ll
@@ -17,23 +17,23 @@ define i32 @vscale_known_nonzero() {
; CHECK-NEXT: slli a2, a0, 8
; CHECK-NEXT: slli a3, a0, 10
; CHECK-NEXT: slli a4, a0, 12
+; CHECK-NEXT: slli a5, a0, 16
; CHECK-NEXT: add a1, a1, a2
-; CHECK-NEXT: slli a2, a0, 16
-; CHECK-NEXT: sub a3, a3, a4
-; CHECK-NEXT: slli a4, a0, 18
-; CHECK-NEXT: sub a2, a2, a4
-; CHECK-NEXT: slli a4, a0, 4
-; CHECK-NEXT: sub a4, a0, a4
-; CHECK-NEXT: add a1, a4, a1
-; CHECK-NEXT: slli a4, a0, 14
+; CHECK-NEXT: slli a2, a0, 18
; CHECK-NEXT: sub a3, a3, a4
; CHECK-NEXT: slli a4, a0, 23
-; CHECK-NEXT: sub a2, a2, a4
-; CHECK-NEXT: slli a0, a0, 27
+; CHECK-NEXT: sub a5, a5, a2
+; CHECK-NEXT: slli a2, a0, 27
+; CHECK-NEXT: sub a4, a4, a2
+; CHECK-NEXT: slli a2, a0, 4
+; CHECK-NEXT: sub a2, a0, a2
+; CHECK-NEXT: add a1, a2, a1
+; CHECK-NEXT: slli a0, a0, 14
+; CHECK-NEXT: sub a3, a3, a0
+; CHECK-NEXT: sub a5, a5, a4
; CHECK-NEXT: add a1, a1, a3
-; CHECK-NEXT: add a0, a2, a0
-; CHECK-NEXT: add a0, a1, a0
-; CHECK-NEXT: srliw a0, a0, 27
+; CHECK-NEXT: add a1, a1, a5
+; CHECK-NEXT: srliw a0, a1, 27
; CHECK-NEXT: lui a1, %hi(.LCPI0_0)
; CHECK-NEXT: addi a1, a1, %lo(.LCPI0_0)
; CHECK-NEXT: add a0, a1, a0
diff --git a/llvm/test/CodeGen/RISCV/srem-seteq-illegal-types.ll b/llvm/test/CodeGen/RISCV/srem-seteq-illegal-types.ll
index 06bbe5209df35..14fcb95a83056 100644
--- a/llvm/test/CodeGen/RISCV/srem-seteq-illegal-types.ll
+++ b/llvm/test/CodeGen/RISCV/srem-seteq-illegal-types.ll
@@ -431,77 +431,77 @@ define void @test_srem_vec(ptr %X) nounwind {
; RV64-NEXT: slli a4, s4, 10
; RV64-NEXT: slli a5, s4, 14
; RV64-NEXT: slli a6, s4, 16
-; RV64-NEXT: slli a7, s4, 22
+; RV64-NEXT: slli a7, s4, 18
+; RV64-NEXT: slli t0, s4, 20
+; RV64-NEXT: slli t1, s4, 22
+; RV64-NEXT: slli t2, s4, 24
+; RV64-NEXT: slli t3, s4, 26
+; RV64-NEXT: slli t4, s4, 28
+; RV64-NEXT: slli t5, s3, 32
; RV64-NEXT: add a1, a1, a2
-; RV64-NEXT: slli a2, s4, 24
+; RV64-NEXT: slli a2, s3, 34
; RV64-NEXT: add a3, a3, a4
-; RV64-NEXT: slli a4, s3, 32
+; RV64-NEXT: slli a4, s3, 36
; RV64-NEXT: add a5, a5, a6
-; RV64-NEXT: slli a6, s3, 34
-; RV64-NEXT: add a2, a7, a2
-; RV64-NEXT: slli a7, s3, 48
+; RV64-NEXT: slli a6, s3, 38
+; RV64-NEXT: add a7, a7, t0
+; RV64-NEXT: slli t0, s3, 40
+; RV64-NEXT: add t1, t1, t2
+; RV64-NEXT: slli t2, s3, 42
+; RV64-NEXT: add t3, t3, t4
+; RV64-NEXT: slli t4, s3, 48
+; RV64-NEXT: add a2, t5, a2
+; RV64-NEXT: slli t5, s3, 50
; RV64-NEXT: add a4, a4, a6
-; RV64-NEXT: slli a6, s3, 50
-; RV64-NEXT: add a6, a7, a6
-; RV64-NEXT: slli a7, s4, 2
-; RV64-NEXT: add a7, s4, a7
-; RV64-NEXT: add a1, a7, a1
-; RV64-NEXT: slli a7, s4, 12
-; RV64-NEXT: add a3, a3, a7
-; RV64-NEXT: slli a7, s4, 18
+; RV64-NEXT: slli a6, s3, 52
+; RV64-NEXT: add t0, t0, t2
+; RV64-NEXT: slli t2, s3, 54
+; RV64-NEXT: add t4, t4, t5
+; RV64-NEXT: slli t5, s3, 56
+; RV64-NEXT: add a6, a6, t2
+; RV64-NEXT: slli t2, s3, 58
+; RV64-NEXT: add t2, t5, t2
+; RV64-NEXT: slli t5, s4, 2
+; RV64-NEXT: add t5, s4, t5
+; RV64-NEXT: add a1, t5, a1
+; RV64-NEXT: slli t5, s4, 12
+; RV64-NEXT: add a3, a3, t5
; RV64-NEXT: add a5, a5, a7
-; RV64-NEXT: slli a7, s4, 26
-; RV64-NEXT: add a2, a2, a7
-; RV64-NEXT: slli a7, s3, 36
-; RV64-NEXT: add a4, a4, a7
-; RV64-NEXT: slli a7, s3, 52
-; RV64-NEXT: add a6, a6, a7
-; RV64-NEXT: add a1, a1, a3
-; RV64-NEXT: slli a3, s4, 20
-; RV64-NEXT: add a3, a5, a3
-; RV64-NEXT: slli a5, s4, 28
-; RV64-NEXT: add a2, a2, a5
-; RV64-NEXT: slli a5, s3, 38
-; RV64-NEXT: add a4, a4, a5
-; RV64-NEXT: slli a5, s3, 54
-; RV64-NEXT: add a5, a6, a5
+; RV64-NEXT: add t1, t1, t3
+; RV64-NEXT: add a2, a2, a4
+; RV64-NEXT: slli a4, s3, 44
+; RV64-NEXT: add a4, t0, a4
+; RV64-NEXT: add a6, t4, a6
+; RV64-NEXT: slli a7, s3, 60
+; RV64-NEXT: add a7, t2, a7
; RV64-NEXT: add a1, a1, a3
; RV64-NEXT: slli s4, s4, 30
-; RV64-NEXT: add a2, a2, s4
-; RV64-NEXT: slli a3, s3, 40
-; RV64-NEXT: add a3, a4, a3
-; RV64-NEXT: slli a4, s3, 56
-; RV64-NEXT: add a4, a5, a4
-; RV64-NEXT: slli a5, s3, 42
-; RV64-NEXT: add a1, a1, a2
-; RV64-NEXT: slli a2, s3, 58
+; RV64-NEXT: add t1, t1, s4
+; RV64-NEXT: add a2, a2, a4
+; RV64-NEXT: add a6, a6, a7
+; RV64-NEXT: add a1, a1, a5
+; RV64-NEXT: slli a3, s3, 46
+; RV64-NEXT: slli s3, s3, 62
; RV64-NEXT: addi a0, a0, -2
; RV64-NEXT: addi s1, s1, -1
; RV64-NEXT: seqz a0, a0
-; RV64-NEXT: seqz a6, s1
-; RV64-NEXT: addi a6, a6, -1
+; RV64-NEXT: seqz a4, s1
+; RV64-NEXT: addi a4, a4, -1
; RV64-NEXT: addi a0, a0, -1
-; RV64-NEXT: add a3, a3, a5
-; RV64-NEXT: slli a5, a0, 2
-; RV64-NEXT: add a2, a4, a2
-; RV64-NEXT: slli a4, a6, 31
-; RV64-NEXT: srli a4, a4, 62
-; RV64-NEXT: or a4, a4, a5
-; RV64-NEXT: slli a5, s3, 44
-; RV64-NEXT: add a3, a3, a5
-; RV64-NEXT: slli a5, s3, 60
-; RV64-NEXT: add a2, a2, a5
-; RV64-NEXT: slli a5, s3, 46
-; RV64-NEXT: add a3, a3, a5
-; RV64-NEXT: slli s3, s3, 62
-; RV64-NEXT: add a2, a2, s3
+; RV64-NEXT: add a2, a2, a3
+; RV64-NEXT: slli a3, a0, 2
+; RV64-NEXT: add a2, t1, a2
+; RV64-NEXT: slli a5, a4, 31
+; RV64-NEXT: srli a5, a5, 62
+; RV64-NEXT: or a3, a5, a3
; RV64-NEXT: lui a5, %hi(.LCPI3_0)
; RV64-NEXT: ld a5, %lo(.LCPI3_0)(a5)
; RV64-NEXT: slli a0, a0, 29
-; RV64-NEXT: slli a6, a6, 33
+; RV64-NEXT: slli a4, a4, 33
; RV64-NEXT: srli a0, a0, 61
-; RV64-NEXT: add a1, a1, a3
-; RV64-NEXT: sub a2, a5, a2
+; RV64-NEXT: sub a7, a5, s3
+; RV64-NEXT: add a1, a1, a2
+; RV64-NEXT: sub a2, a7, a6
; RV64-NEXT: sub a2, a2, a1
; RV64-NEXT: slli a1, a2, 63
; RV64-NEXT: srli a2, a2, 1
@@ -510,9 +510,9 @@ define void @test_srem_vec(ptr %X) nounwind {
; RV64-NEXT: neg a1, a1
; RV64-NEXT: slli a1, a1, 31
; RV64-NEXT: srli a1, a1, 31
-; RV64-NEXT: or a1, a1, a6
+; RV64-NEXT: or a1, a1, a4
; RV64-NEXT: sd a1, 0(s0)
-; RV64-NEXT: sw a4, 8(s0)
+; RV64-NEXT: sw a3, 8(s0)
; RV64-NEXT: sb a0, 12(s0)
; RV64-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
diff --git a/llvm/test/CodeGen/RISCV/zicond-opts.ll b/llvm/test/CodeGen/RISCV/zicond-opts.ll
index 47ff6edb0499d..4cbdbe754f4f1 100644
--- a/llvm/test/CodeGen/RISCV/zicond-opts.ll
+++ b/llvm/test/CodeGen/RISCV/zicond-opts.ll
@@ -444,8 +444,7 @@ define i64 @addiw_addi(i32 %x) {
; RV64ZICOND-LABEL: addiw_addi:
; RV64ZICOND: # %bb.0:
; RV64ZICOND-NEXT: sext.w a1, a0
-; RV64ZICOND-NEXT: addi a0, a0, -1
-; RV64ZICOND-NEXT: addi a0, a0, -63
+; RV64ZICOND-NEXT: addi a0, a0, -64
; RV64ZICOND-NEXT: czero.eqz a0, a0, a1
; RV64ZICOND-NEXT: addi a0, a0, 63
; RV64ZICOND-NEXT: bset a0, zero, a0
>From 2dc1d2a9989c10597275a8cfeb48357de79f21ec Mon Sep 17 00:00:00 2001
From: Piotr Fusik <p.fusik at samsung.com>
Date: Mon, 8 Dec 2025 18:53:23 +0100
Subject: [PATCH 5/5] [RISCV][NFC] clang-format
---
llvm/lib/Target/RISCV/RISCVInstrInfo.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
index 37dec648b6b53..bc65989a902c6 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
@@ -2852,8 +2852,8 @@ static void combineADDIADDI(MachineInstr &Root,
auto MIB = BuildMI(*MF, MIMetadata(Root), TII->get(RISCV::ADDI),
Root.getOperand(0).getReg())
- .addReg(X.getReg(), getKillRegState(X.isKill()))
- .addImm(Sum);
+ .addReg(X.getReg(), getKillRegState(X.isKill()))
+ .addImm(Sum);
InsInstrs.push_back(MIB);
DelInstrs.push_back(Inner);
DelInstrs.push_back(&Root);
More information about the llvm-commits
mailing list