diff --git a/llvm/lib/Target/RISCV/RISCVExpandPseudoInsts.cpp b/llvm/lib/Target/RISCV/RISCVExpandPseudoInsts.cpp --- a/llvm/lib/Target/RISCV/RISCVExpandPseudoInsts.cpp +++ b/llvm/lib/Target/RISCV/RISCVExpandPseudoInsts.cpp @@ -319,9 +319,9 @@ default: llvm_unreachable("Unexpected AtomicRMW BinOp"); case AtomicRMWInst::Xchg: - BuildMI(LoopMBB, DL, TII->get(RISCV::ADD), ScratchReg) - .addReg(RISCV::X0) - .addReg(IncrReg); + BuildMI(LoopMBB, DL, TII->get(RISCV::ADDI), ScratchReg) + .addReg(IncrReg) + .addImm(0); break; case AtomicRMWInst::Add: BuildMI(LoopMBB, DL, TII->get(RISCV::ADD), ScratchReg) diff --git a/llvm/test/CodeGen/RISCV/atomic-rmw.ll b/llvm/test/CodeGen/RISCV/atomic-rmw.ll --- a/llvm/test/CodeGen/RISCV/atomic-rmw.ll +++ b/llvm/test/CodeGen/RISCV/atomic-rmw.ll @@ -30,7 +30,7 @@ ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w a4, (a2) -; RV32IA-NEXT: add a5, zero, a1 +; RV32IA-NEXT: mv a5, a1 ; RV32IA-NEXT: xor a5, a4, a5 ; RV32IA-NEXT: and a5, a5, a3 ; RV32IA-NEXT: xor a5, a4, a5 @@ -61,7 +61,7 @@ ; RV64IA-NEXT: sllw a1, a1, a0 ; RV64IA-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1 ; RV64IA-NEXT: lr.w a4, (a2) -; RV64IA-NEXT: add a5, zero, a1 +; RV64IA-NEXT: mv a5, a1 ; RV64IA-NEXT: xor a5, a4, a5 ; RV64IA-NEXT: and a5, a5, a3 ; RV64IA-NEXT: xor a5, a4, a5 @@ -96,7 +96,7 @@ ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aq a4, (a2) -; RV32IA-NEXT: add a5, zero, a1 +; RV32IA-NEXT: mv a5, a1 ; RV32IA-NEXT: xor a5, a4, a5 ; RV32IA-NEXT: and a5, a5, a3 ; RV32IA-NEXT: xor a5, a4, a5 @@ -127,7 +127,7 @@ ; RV64IA-NEXT: sllw a1, a1, a0 ; RV64IA-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 ; RV64IA-NEXT: lr.w.aq a4, (a2) -; RV64IA-NEXT: add a5, zero, a1 +; RV64IA-NEXT: mv a5, a1 ; RV64IA-NEXT: xor a5, a4, a5 ; RV64IA-NEXT: and a5, a5, a3 ; RV64IA-NEXT: xor a5, a4, a5 @@ -162,7 +162,7 @@ ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w a4, (a2) -; RV32IA-NEXT: add a5, zero, a1 +; RV32IA-NEXT: mv a5, a1 ; RV32IA-NEXT: xor a5, a4, a5 ; RV32IA-NEXT: and a5, a5, a3 ; RV32IA-NEXT: xor a5, a4, a5 @@ -193,7 +193,7 @@ ; RV64IA-NEXT: sllw a1, a1, a0 ; RV64IA-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1 ; RV64IA-NEXT: lr.w a4, (a2) -; RV64IA-NEXT: add a5, zero, a1 +; RV64IA-NEXT: mv a5, a1 ; RV64IA-NEXT: xor a5, a4, a5 ; RV64IA-NEXT: and a5, a5, a3 ; RV64IA-NEXT: xor a5, a4, a5 @@ -228,7 +228,7 @@ ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aq a4, (a2) -; RV32IA-NEXT: add a5, zero, a1 +; RV32IA-NEXT: mv a5, a1 ; RV32IA-NEXT: xor a5, a4, a5 ; RV32IA-NEXT: and a5, a5, a3 ; RV32IA-NEXT: xor a5, a4, a5 @@ -259,7 +259,7 @@ ; RV64IA-NEXT: sllw a1, a1, a0 ; RV64IA-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1 ; RV64IA-NEXT: lr.w.aq a4, (a2) -; RV64IA-NEXT: add a5, zero, a1 +; RV64IA-NEXT: mv a5, a1 ; RV64IA-NEXT: xor a5, a4, a5 ; RV64IA-NEXT: and a5, a5, a3 ; RV64IA-NEXT: xor a5, a4, a5 @@ -294,7 +294,7 @@ ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aqrl a4, (a2) -; RV32IA-NEXT: add a5, zero, a1 +; RV32IA-NEXT: mv a5, a1 ; RV32IA-NEXT: xor a5, a4, a5 ; RV32IA-NEXT: and a5, a5, a3 ; RV32IA-NEXT: xor a5, a4, a5 @@ -325,7 +325,7 @@ ; RV64IA-NEXT: sllw a1, a1, a0 ; RV64IA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1 ; RV64IA-NEXT: lr.w.aqrl a4, (a2) -; RV64IA-NEXT: add a5, zero, a1 +; RV64IA-NEXT: mv a5, a1 ; RV64IA-NEXT: xor a5, a4, a5 ; RV64IA-NEXT: and a5, a5, a3 ; RV64IA-NEXT: xor a5, a4, a5 @@ -5031,7 +5031,7 @@ ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: .LBB55_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w a3, (a2) -; RV32IA-NEXT: add a5, zero, a1 +; RV32IA-NEXT: mv a5, a1 ; RV32IA-NEXT: xor a5, a3, a5 ; RV32IA-NEXT: and a5, a5, a4 ; RV32IA-NEXT: xor a5, a3, a5 @@ -5063,7 +5063,7 @@ ; RV64IA-NEXT: sllw a1, a1, a0 ; RV64IA-NEXT: .LBB55_1: # =>This Inner Loop Header: Depth=1 ; RV64IA-NEXT: lr.w a3, (a2) -; RV64IA-NEXT: add a5, zero, a1 +; RV64IA-NEXT: mv a5, a1 ; RV64IA-NEXT: xor a5, a3, a5 ; RV64IA-NEXT: and a5, a5, a4 ; RV64IA-NEXT: xor a5, a3, a5 @@ -5099,7 +5099,7 @@ ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aq a3, (a2) -; RV32IA-NEXT: add a5, zero, a1 +; RV32IA-NEXT: mv a5, a1 ; RV32IA-NEXT: xor a5, a3, a5 ; RV32IA-NEXT: and a5, a5, a4 ; RV32IA-NEXT: xor a5, a3, a5 @@ -5131,7 +5131,7 @@ ; RV64IA-NEXT: sllw a1, a1, a0 ; RV64IA-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1 ; RV64IA-NEXT: lr.w.aq a3, (a2) -; RV64IA-NEXT: add a5, zero, a1 +; RV64IA-NEXT: mv a5, a1 ; RV64IA-NEXT: xor a5, a3, a5 ; RV64IA-NEXT: and a5, a5, a4 ; RV64IA-NEXT: xor a5, a3, a5 @@ -5167,7 +5167,7 @@ ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w a3, (a2) -; RV32IA-NEXT: add a5, zero, a1 +; RV32IA-NEXT: mv a5, a1 ; RV32IA-NEXT: xor a5, a3, a5 ; RV32IA-NEXT: and a5, a5, a4 ; RV32IA-NEXT: xor a5, a3, a5 @@ -5199,7 +5199,7 @@ ; RV64IA-NEXT: sllw a1, a1, a0 ; RV64IA-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1 ; RV64IA-NEXT: lr.w a3, (a2) -; RV64IA-NEXT: add a5, zero, a1 +; RV64IA-NEXT: mv a5, a1 ; RV64IA-NEXT: xor a5, a3, a5 ; RV64IA-NEXT: and a5, a5, a4 ; RV64IA-NEXT: xor a5, a3, a5 @@ -5235,7 +5235,7 @@ ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aq a3, (a2) -; RV32IA-NEXT: add a5, zero, a1 +; RV32IA-NEXT: mv a5, a1 ; RV32IA-NEXT: xor a5, a3, a5 ; RV32IA-NEXT: and a5, a5, a4 ; RV32IA-NEXT: xor a5, a3, a5 @@ -5267,7 +5267,7 @@ ; RV64IA-NEXT: sllw a1, a1, a0 ; RV64IA-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1 ; RV64IA-NEXT: lr.w.aq a3, (a2) -; RV64IA-NEXT: add a5, zero, a1 +; RV64IA-NEXT: mv a5, a1 ; RV64IA-NEXT: xor a5, a3, a5 ; RV64IA-NEXT: and a5, a5, a4 ; RV64IA-NEXT: xor a5, a3, a5 @@ -5303,7 +5303,7 @@ ; RV32IA-NEXT: sll a1, a1, a0 ; RV32IA-NEXT: .LBB59_1: # =>This Inner Loop Header: Depth=1 ; RV32IA-NEXT: lr.w.aqrl a3, (a2) -; RV32IA-NEXT: add a5, zero, a1 +; RV32IA-NEXT: mv a5, a1 ; RV32IA-NEXT: xor a5, a3, a5 ; RV32IA-NEXT: and a5, a5, a4 ; RV32IA-NEXT: xor a5, a3, a5 @@ -5335,7 +5335,7 @@ ; RV64IA-NEXT: sllw a1, a1, a0 ; RV64IA-NEXT: .LBB59_1: # =>This Inner Loop Header: Depth=1 ; RV64IA-NEXT: lr.w.aqrl a3, (a2) -; RV64IA-NEXT: add a5, zero, a1 +; RV64IA-NEXT: mv a5, a1 ; RV64IA-NEXT: xor a5, a3, a5 ; RV64IA-NEXT: and a5, a5, a4 ; RV64IA-NEXT: xor a5, a3, a5