[RISCV] Convert LWU to LW if possible in RISCVOptWInstrs (#144703)

After the refactoring in #149710 the logic change is trivial.

Motivation for preferring sign-extended 32-bit loads (LW) vs
zero-extended (LWU):
* LW is compressible while LWU is not.
* Helps to minimise the diff vs RV32 (e.g. LWU vs LW)
* Helps to minimise distracting diffs vs GCC. I see this come up
frequently when comparing GCC code and in these cases it's a red
herring.

Similar normalisation could be done for LHU and LH, but this is less
well motivated as there is a compressed LHU (and if performing the
change in RISCVOptWInstrs it wouldn't be done for RV32). There is a
compressed LBU but not LB, meaning doing a similar normalisation for
byte-sized loads would actually be a regression in terms of code size.
Load narrowing when allowed by hasAllNBitUsers isn't explored in this
patch.

This changes ~20500 instructions in an RVA22 build of the
llvm-test-suite including SPEC 2017. As part of the review, the option
of doing the change at ISel time was explored but was found to be less
effective.
This commit is contained in:
Alex Bradbury 2025-07-21 11:48:33 +01:00 committed by GitHub
parent a11c5dd34b
commit fc69f25a8f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
24 changed files with 112 additions and 193 deletions

View File

@ -736,7 +736,8 @@ bool RISCVOptWInstrs::canonicalizeWSuffixes(MachineFunction &MF,
for (MachineInstr &MI : MBB) { for (MachineInstr &MI : MBB) {
std::optional<unsigned> WOpc; std::optional<unsigned> WOpc;
std::optional<unsigned> NonWOpc; std::optional<unsigned> NonWOpc;
switch (MI.getOpcode()) { unsigned OrigOpc = MI.getOpcode();
switch (OrigOpc) {
default: default:
continue; continue;
case RISCV::ADDW: case RISCV::ADDW:
@ -786,7 +787,10 @@ bool RISCVOptWInstrs::canonicalizeWSuffixes(MachineFunction &MF,
MadeChange = true; MadeChange = true;
continue; continue;
} }
if (ShouldPreferW && WOpc.has_value() && hasAllWUsers(MI, ST, MRI)) { // LWU is always converted to LW when possible as 1) LW is compressible
// and 2) it helps minimise differences vs RV32.
if ((ShouldPreferW || OrigOpc == RISCV::LWU) && WOpc.has_value() &&
hasAllWUsers(MI, ST, MRI)) {
LLVM_DEBUG(dbgs() << "Replacing " << MI); LLVM_DEBUG(dbgs() << "Replacing " << MI);
MI.setDesc(TII.get(WOpc.value())); MI.setDesc(TII.get(WOpc.value()));
MI.clearFlag(MachineInstr::MIFlag::NoSWrap); MI.clearFlag(MachineInstr::MIFlag::NoSWrap);

View File

@ -246,17 +246,11 @@ define double @fcvt_d_wu(i32 %a) nounwind {
} }
define double @fcvt_d_wu_load(ptr %p) nounwind { define double @fcvt_d_wu_load(ptr %p) nounwind {
; RV32IFD-LABEL: fcvt_d_wu_load: ; CHECKIFD-LABEL: fcvt_d_wu_load:
; RV32IFD: # %bb.0: ; CHECKIFD: # %bb.0:
; RV32IFD-NEXT: lw a0, 0(a0) ; CHECKIFD-NEXT: lw a0, 0(a0)
; RV32IFD-NEXT: fcvt.d.wu fa0, a0 ; CHECKIFD-NEXT: fcvt.d.wu fa0, a0
; RV32IFD-NEXT: ret ; CHECKIFD-NEXT: ret
;
; RV64IFD-LABEL: fcvt_d_wu_load:
; RV64IFD: # %bb.0:
; RV64IFD-NEXT: lwu a0, 0(a0)
; RV64IFD-NEXT: fcvt.d.wu fa0, a0
; RV64IFD-NEXT: ret
; ;
; RV32I-LABEL: fcvt_d_wu_load: ; RV32I-LABEL: fcvt_d_wu_load:
; RV32I: # %bb.0: ; RV32I: # %bb.0:

View File

@ -232,17 +232,11 @@ define float @fcvt_s_wu(i32 %a) nounwind {
} }
define float @fcvt_s_wu_load(ptr %p) nounwind { define float @fcvt_s_wu_load(ptr %p) nounwind {
; RV32IF-LABEL: fcvt_s_wu_load: ; CHECKIF-LABEL: fcvt_s_wu_load:
; RV32IF: # %bb.0: ; CHECKIF: # %bb.0:
; RV32IF-NEXT: lw a0, 0(a0) ; CHECKIF-NEXT: lw a0, 0(a0)
; RV32IF-NEXT: fcvt.s.wu fa0, a0 ; CHECKIF-NEXT: fcvt.s.wu fa0, a0
; RV32IF-NEXT: ret ; CHECKIF-NEXT: ret
;
; RV64IF-LABEL: fcvt_s_wu_load:
; RV64IF: # %bb.0:
; RV64IF-NEXT: lwu a0, 0(a0)
; RV64IF-NEXT: fcvt.s.wu fa0, a0
; RV64IF-NEXT: ret
; ;
; RV32I-LABEL: fcvt_s_wu_load: ; RV32I-LABEL: fcvt_s_wu_load:
; RV32I: # %bb.0: ; RV32I: # %bb.0:

View File

@ -748,7 +748,7 @@ define signext i32 @ctpop_i32_load(ptr %p) nounwind {
; ;
; RV64ZBB-LABEL: ctpop_i32_load: ; RV64ZBB-LABEL: ctpop_i32_load:
; RV64ZBB: # %bb.0: ; RV64ZBB: # %bb.0:
; RV64ZBB-NEXT: lwu a0, 0(a0) ; RV64ZBB-NEXT: lw a0, 0(a0)
; RV64ZBB-NEXT: cpopw a0, a0 ; RV64ZBB-NEXT: cpopw a0, a0
; RV64ZBB-NEXT: ret ; RV64ZBB-NEXT: ret
%a = load i32, ptr %p %a = load i32, ptr %p

View File

@ -114,7 +114,7 @@ define i64 @pack_i64_2(i32 signext %a, i32 signext %b) nounwind {
define i64 @pack_i64_3(ptr %0, ptr %1) { define i64 @pack_i64_3(ptr %0, ptr %1) {
; RV64I-LABEL: pack_i64_3: ; RV64I-LABEL: pack_i64_3:
; RV64I: # %bb.0: ; RV64I: # %bb.0:
; RV64I-NEXT: lwu a0, 0(a0) ; RV64I-NEXT: lw a0, 0(a0)
; RV64I-NEXT: lwu a1, 0(a1) ; RV64I-NEXT: lwu a1, 0(a1)
; RV64I-NEXT: slli a0, a0, 32 ; RV64I-NEXT: slli a0, a0, 32
; RV64I-NEXT: or a0, a0, a1 ; RV64I-NEXT: or a0, a0, a1
@ -122,8 +122,8 @@ define i64 @pack_i64_3(ptr %0, ptr %1) {
; ;
; RV64ZBKB-LABEL: pack_i64_3: ; RV64ZBKB-LABEL: pack_i64_3:
; RV64ZBKB: # %bb.0: ; RV64ZBKB: # %bb.0:
; RV64ZBKB-NEXT: lwu a0, 0(a0) ; RV64ZBKB-NEXT: lw a0, 0(a0)
; RV64ZBKB-NEXT: lwu a1, 0(a1) ; RV64ZBKB-NEXT: lw a1, 0(a1)
; RV64ZBKB-NEXT: pack a0, a1, a0 ; RV64ZBKB-NEXT: pack a0, a1, a0
; RV64ZBKB-NEXT: ret ; RV64ZBKB-NEXT: ret
%3 = load i32, ptr %0, align 4 %3 = load i32, ptr %0, align 4

View File

@ -4582,7 +4582,7 @@ define signext i32 @atomicrmw_and_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind
; RV64I-NEXT: sext.w a0, a0 ; RV64I-NEXT: sext.w a0, a0
; RV64I-NEXT: ret ; RV64I-NEXT: ret
; RV64I-NEXT: .LBB56_2: # %else ; RV64I-NEXT: .LBB56_2: # %else
; RV64I-NEXT: lwu a1, 0(a0) ; RV64I-NEXT: lw a1, 0(a0)
; RV64I-NEXT: andi a2, a1, 1 ; RV64I-NEXT: andi a2, a1, 1
; RV64I-NEXT: sw a2, 0(a0) ; RV64I-NEXT: sw a2, 0(a0)
; RV64I-NEXT: sext.w a0, a1 ; RV64I-NEXT: sext.w a0, a1
@ -4700,7 +4700,7 @@ define signext i32 @atomicrmw_nand_i32_monotonic_crossbb(ptr %a, i1 %c) nounwind
; RV64I-NEXT: sext.w a0, a0 ; RV64I-NEXT: sext.w a0, a0
; RV64I-NEXT: ret ; RV64I-NEXT: ret
; RV64I-NEXT: .LBB57_2: # %else ; RV64I-NEXT: .LBB57_2: # %else
; RV64I-NEXT: lwu a1, 0(a0) ; RV64I-NEXT: lw a1, 0(a0)
; RV64I-NEXT: andi a2, a1, 1 ; RV64I-NEXT: andi a2, a1, 1
; RV64I-NEXT: sw a2, 0(a0) ; RV64I-NEXT: sw a2, 0(a0)
; RV64I-NEXT: sext.w a0, a1 ; RV64I-NEXT: sext.w a0, a1

View File

@ -1074,7 +1074,7 @@ define bfloat @fcvt_bf16_wu_load(ptr %p) nounwind {
; ;
; CHECK64ZFBFMIN-LABEL: fcvt_bf16_wu_load: ; CHECK64ZFBFMIN-LABEL: fcvt_bf16_wu_load:
; CHECK64ZFBFMIN: # %bb.0: ; CHECK64ZFBFMIN: # %bb.0:
; CHECK64ZFBFMIN-NEXT: lwu a0, 0(a0) ; CHECK64ZFBFMIN-NEXT: lw a0, 0(a0)
; CHECK64ZFBFMIN-NEXT: fcvt.s.wu fa5, a0 ; CHECK64ZFBFMIN-NEXT: fcvt.s.wu fa5, a0
; CHECK64ZFBFMIN-NEXT: fcvt.bf16.s fa0, fa5 ; CHECK64ZFBFMIN-NEXT: fcvt.bf16.s fa0, fa5
; CHECK64ZFBFMIN-NEXT: ret ; CHECK64ZFBFMIN-NEXT: ret
@ -1083,7 +1083,7 @@ define bfloat @fcvt_bf16_wu_load(ptr %p) nounwind {
; RV64ID: # %bb.0: ; RV64ID: # %bb.0:
; RV64ID-NEXT: addi sp, sp, -16 ; RV64ID-NEXT: addi sp, sp, -16
; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill ; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64ID-NEXT: lwu a0, 0(a0) ; RV64ID-NEXT: lw a0, 0(a0)
; RV64ID-NEXT: fcvt.s.wu fa0, a0 ; RV64ID-NEXT: fcvt.s.wu fa0, a0
; RV64ID-NEXT: call __truncsfbf2 ; RV64ID-NEXT: call __truncsfbf2
; RV64ID-NEXT: fmv.x.w a0, fa0 ; RV64ID-NEXT: fmv.x.w a0, fa0

View File

@ -347,17 +347,11 @@ define double @fcvt_d_wu(i32 %a) nounwind strictfp {
declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata) declare double @llvm.experimental.constrained.uitofp.f64.i32(i32, metadata, metadata)
define double @fcvt_d_wu_load(ptr %p) nounwind strictfp { define double @fcvt_d_wu_load(ptr %p) nounwind strictfp {
; RV32IFD-LABEL: fcvt_d_wu_load: ; CHECKIFD-LABEL: fcvt_d_wu_load:
; RV32IFD: # %bb.0: ; CHECKIFD: # %bb.0:
; RV32IFD-NEXT: lw a0, 0(a0) ; CHECKIFD-NEXT: lw a0, 0(a0)
; RV32IFD-NEXT: fcvt.d.wu fa0, a0 ; CHECKIFD-NEXT: fcvt.d.wu fa0, a0
; RV32IFD-NEXT: ret ; CHECKIFD-NEXT: ret
;
; RV64IFD-LABEL: fcvt_d_wu_load:
; RV64IFD: # %bb.0:
; RV64IFD-NEXT: lwu a0, 0(a0)
; RV64IFD-NEXT: fcvt.d.wu fa0, a0
; RV64IFD-NEXT: ret
; ;
; RV32IZFINXZDINX-LABEL: fcvt_d_wu_load: ; RV32IZFINXZDINX-LABEL: fcvt_d_wu_load:
; RV32IZFINXZDINX: # %bb.0: ; RV32IZFINXZDINX: # %bb.0:
@ -367,7 +361,7 @@ define double @fcvt_d_wu_load(ptr %p) nounwind strictfp {
; ;
; RV64IZFINXZDINX-LABEL: fcvt_d_wu_load: ; RV64IZFINXZDINX-LABEL: fcvt_d_wu_load:
; RV64IZFINXZDINX: # %bb.0: ; RV64IZFINXZDINX: # %bb.0:
; RV64IZFINXZDINX-NEXT: lwu a0, 0(a0) ; RV64IZFINXZDINX-NEXT: lw a0, 0(a0)
; RV64IZFINXZDINX-NEXT: fcvt.d.wu a0, a0 ; RV64IZFINXZDINX-NEXT: fcvt.d.wu a0, a0
; RV64IZFINXZDINX-NEXT: ret ; RV64IZFINXZDINX-NEXT: ret
; ;

View File

@ -582,17 +582,11 @@ define double @fcvt_d_wu(i32 %a) nounwind {
} }
define double @fcvt_d_wu_load(ptr %p) nounwind { define double @fcvt_d_wu_load(ptr %p) nounwind {
; RV32IFD-LABEL: fcvt_d_wu_load: ; CHECKIFD-LABEL: fcvt_d_wu_load:
; RV32IFD: # %bb.0: ; CHECKIFD: # %bb.0:
; RV32IFD-NEXT: lw a0, 0(a0) ; CHECKIFD-NEXT: lw a0, 0(a0)
; RV32IFD-NEXT: fcvt.d.wu fa0, a0 ; CHECKIFD-NEXT: fcvt.d.wu fa0, a0
; RV32IFD-NEXT: ret ; CHECKIFD-NEXT: ret
;
; RV64IFD-LABEL: fcvt_d_wu_load:
; RV64IFD: # %bb.0:
; RV64IFD-NEXT: lwu a0, 0(a0)
; RV64IFD-NEXT: fcvt.d.wu fa0, a0
; RV64IFD-NEXT: ret
; ;
; RV32IZFINXZDINX-LABEL: fcvt_d_wu_load: ; RV32IZFINXZDINX-LABEL: fcvt_d_wu_load:
; RV32IZFINXZDINX: # %bb.0: ; RV32IZFINXZDINX: # %bb.0:
@ -602,7 +596,7 @@ define double @fcvt_d_wu_load(ptr %p) nounwind {
; ;
; RV64IZFINXZDINX-LABEL: fcvt_d_wu_load: ; RV64IZFINXZDINX-LABEL: fcvt_d_wu_load:
; RV64IZFINXZDINX: # %bb.0: ; RV64IZFINXZDINX: # %bb.0:
; RV64IZFINXZDINX-NEXT: lwu a0, 0(a0) ; RV64IZFINXZDINX-NEXT: lw a0, 0(a0)
; RV64IZFINXZDINX-NEXT: fcvt.d.wu a0, a0 ; RV64IZFINXZDINX-NEXT: fcvt.d.wu a0, a0
; RV64IZFINXZDINX-NEXT: ret ; RV64IZFINXZDINX-NEXT: ret
; ;

View File

@ -236,29 +236,17 @@ define float @fcvt_s_wu(i32 %a) nounwind strictfp {
declare float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata, metadata) declare float @llvm.experimental.constrained.uitofp.f32.i32(i32 %a, metadata, metadata)
define float @fcvt_s_wu_load(ptr %p) nounwind strictfp { define float @fcvt_s_wu_load(ptr %p) nounwind strictfp {
; RV32IF-LABEL: fcvt_s_wu_load: ; CHECKIF-LABEL: fcvt_s_wu_load:
; RV32IF: # %bb.0: ; CHECKIF: # %bb.0:
; RV32IF-NEXT: lw a0, 0(a0) ; CHECKIF-NEXT: lw a0, 0(a0)
; RV32IF-NEXT: fcvt.s.wu fa0, a0 ; CHECKIF-NEXT: fcvt.s.wu fa0, a0
; RV32IF-NEXT: ret ; CHECKIF-NEXT: ret
; ;
; RV64IF-LABEL: fcvt_s_wu_load: ; CHECKIZFINX-LABEL: fcvt_s_wu_load:
; RV64IF: # %bb.0: ; CHECKIZFINX: # %bb.0:
; RV64IF-NEXT: lwu a0, 0(a0) ; CHECKIZFINX-NEXT: lw a0, 0(a0)
; RV64IF-NEXT: fcvt.s.wu fa0, a0 ; CHECKIZFINX-NEXT: fcvt.s.wu a0, a0
; RV64IF-NEXT: ret ; CHECKIZFINX-NEXT: ret
;
; RV32IZFINX-LABEL: fcvt_s_wu_load:
; RV32IZFINX: # %bb.0:
; RV32IZFINX-NEXT: lw a0, 0(a0)
; RV32IZFINX-NEXT: fcvt.s.wu a0, a0
; RV32IZFINX-NEXT: ret
;
; RV64IZFINX-LABEL: fcvt_s_wu_load:
; RV64IZFINX: # %bb.0:
; RV64IZFINX-NEXT: lwu a0, 0(a0)
; RV64IZFINX-NEXT: fcvt.s.wu a0, a0
; RV64IZFINX-NEXT: ret
; ;
; RV32I-LABEL: fcvt_s_wu_load: ; RV32I-LABEL: fcvt_s_wu_load:
; RV32I: # %bb.0: ; RV32I: # %bb.0:

View File

@ -482,29 +482,17 @@ define float @fcvt_s_wu(i32 %a) nounwind {
} }
define float @fcvt_s_wu_load(ptr %p) nounwind { define float @fcvt_s_wu_load(ptr %p) nounwind {
; RV32IF-LABEL: fcvt_s_wu_load: ; CHECKIF-LABEL: fcvt_s_wu_load:
; RV32IF: # %bb.0: ; CHECKIF: # %bb.0:
; RV32IF-NEXT: lw a0, 0(a0) ; CHECKIF-NEXT: lw a0, 0(a0)
; RV32IF-NEXT: fcvt.s.wu fa0, a0 ; CHECKIF-NEXT: fcvt.s.wu fa0, a0
; RV32IF-NEXT: ret ; CHECKIF-NEXT: ret
; ;
; RV64IF-LABEL: fcvt_s_wu_load: ; CHECKIZFINX-LABEL: fcvt_s_wu_load:
; RV64IF: # %bb.0: ; CHECKIZFINX: # %bb.0:
; RV64IF-NEXT: lwu a0, 0(a0) ; CHECKIZFINX-NEXT: lw a0, 0(a0)
; RV64IF-NEXT: fcvt.s.wu fa0, a0 ; CHECKIZFINX-NEXT: fcvt.s.wu a0, a0
; RV64IF-NEXT: ret ; CHECKIZFINX-NEXT: ret
;
; RV32IZFINX-LABEL: fcvt_s_wu_load:
; RV32IZFINX: # %bb.0:
; RV32IZFINX-NEXT: lw a0, 0(a0)
; RV32IZFINX-NEXT: fcvt.s.wu a0, a0
; RV32IZFINX-NEXT: ret
;
; RV64IZFINX-LABEL: fcvt_s_wu_load:
; RV64IZFINX: # %bb.0:
; RV64IZFINX-NEXT: lwu a0, 0(a0)
; RV64IZFINX-NEXT: fcvt.s.wu a0, a0
; RV64IZFINX-NEXT: ret
; ;
; RV32I-LABEL: fcvt_s_wu_load: ; RV32I-LABEL: fcvt_s_wu_load:
; RV32I: # %bb.0: ; RV32I: # %bb.0:

View File

@ -1461,29 +1461,17 @@ define half @fcvt_h_wu(i32 %a) nounwind strictfp {
declare half @llvm.experimental.constrained.uitofp.f16.i32(i32, metadata, metadata) declare half @llvm.experimental.constrained.uitofp.f16.i32(i32, metadata, metadata)
define half @fcvt_h_wu_load(ptr %p) nounwind strictfp { define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
; RV32IZFH-LABEL: fcvt_h_wu_load: ; CHECKIZFH-LABEL: fcvt_h_wu_load:
; RV32IZFH: # %bb.0: ; CHECKIZFH: # %bb.0:
; RV32IZFH-NEXT: lw a0, 0(a0) ; CHECKIZFH-NEXT: lw a0, 0(a0)
; RV32IZFH-NEXT: fcvt.h.wu fa0, a0 ; CHECKIZFH-NEXT: fcvt.h.wu fa0, a0
; RV32IZFH-NEXT: ret ; CHECKIZFH-NEXT: ret
; ;
; RV64IZFH-LABEL: fcvt_h_wu_load: ; CHECKIZHINX-LABEL: fcvt_h_wu_load:
; RV64IZFH: # %bb.0: ; CHECKIZHINX: # %bb.0:
; RV64IZFH-NEXT: lwu a0, 0(a0) ; CHECKIZHINX-NEXT: lw a0, 0(a0)
; RV64IZFH-NEXT: fcvt.h.wu fa0, a0 ; CHECKIZHINX-NEXT: fcvt.h.wu a0, a0
; RV64IZFH-NEXT: ret ; CHECKIZHINX-NEXT: ret
;
; RV32IZHINX-LABEL: fcvt_h_wu_load:
; RV32IZHINX: # %bb.0:
; RV32IZHINX-NEXT: lw a0, 0(a0)
; RV32IZHINX-NEXT: fcvt.h.wu a0, a0
; RV32IZHINX-NEXT: ret
;
; RV64IZHINX-LABEL: fcvt_h_wu_load:
; RV64IZHINX: # %bb.0:
; RV64IZHINX-NEXT: lwu a0, 0(a0)
; RV64IZHINX-NEXT: fcvt.h.wu a0, a0
; RV64IZHINX-NEXT: ret
; ;
; RV32IDZFH-LABEL: fcvt_h_wu_load: ; RV32IDZFH-LABEL: fcvt_h_wu_load:
; RV32IDZFH: # %bb.0: ; RV32IDZFH: # %bb.0:
@ -1493,7 +1481,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
; ;
; RV64IDZFH-LABEL: fcvt_h_wu_load: ; RV64IDZFH-LABEL: fcvt_h_wu_load:
; RV64IDZFH: # %bb.0: ; RV64IDZFH: # %bb.0:
; RV64IDZFH-NEXT: lwu a0, 0(a0) ; RV64IDZFH-NEXT: lw a0, 0(a0)
; RV64IDZFH-NEXT: fcvt.h.wu fa0, a0 ; RV64IDZFH-NEXT: fcvt.h.wu fa0, a0
; RV64IDZFH-NEXT: ret ; RV64IDZFH-NEXT: ret
; ;
@ -1505,7 +1493,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
; ;
; RV64IZDINXZHINX-LABEL: fcvt_h_wu_load: ; RV64IZDINXZHINX-LABEL: fcvt_h_wu_load:
; RV64IZDINXZHINX: # %bb.0: ; RV64IZDINXZHINX: # %bb.0:
; RV64IZDINXZHINX-NEXT: lwu a0, 0(a0) ; RV64IZDINXZHINX-NEXT: lw a0, 0(a0)
; RV64IZDINXZHINX-NEXT: fcvt.h.wu a0, a0 ; RV64IZDINXZHINX-NEXT: fcvt.h.wu a0, a0
; RV64IZDINXZHINX-NEXT: ret ; RV64IZDINXZHINX-NEXT: ret
; ;
@ -1518,7 +1506,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
; ;
; CHECK64-IZFHMIN-LABEL: fcvt_h_wu_load: ; CHECK64-IZFHMIN-LABEL: fcvt_h_wu_load:
; CHECK64-IZFHMIN: # %bb.0: ; CHECK64-IZFHMIN: # %bb.0:
; CHECK64-IZFHMIN-NEXT: lwu a0, 0(a0) ; CHECK64-IZFHMIN-NEXT: lw a0, 0(a0)
; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0 ; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0
; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 ; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5
; CHECK64-IZFHMIN-NEXT: ret ; CHECK64-IZFHMIN-NEXT: ret
@ -1532,7 +1520,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
; ;
; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu_load: ; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu_load:
; CHECK64-IZHINXMIN: # %bb.0: ; CHECK64-IZHINXMIN: # %bb.0:
; CHECK64-IZHINXMIN-NEXT: lwu a0, 0(a0) ; CHECK64-IZHINXMIN-NEXT: lw a0, 0(a0)
; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a0, a0 ; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a0, a0
; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 ; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0
; CHECK64-IZHINXMIN-NEXT: ret ; CHECK64-IZHINXMIN-NEXT: ret
@ -1546,7 +1534,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind strictfp {
; ;
; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu_load: ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu_load:
; CHECK64-IZDINXZHINXMIN: # %bb.0: ; CHECK64-IZDINXZHINXMIN: # %bb.0:
; CHECK64-IZDINXZHINXMIN-NEXT: lwu a0, 0(a0) ; CHECK64-IZDINXZHINXMIN-NEXT: lw a0, 0(a0)
; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0 ; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0
; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 ; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0
; CHECK64-IZDINXZHINXMIN-NEXT: ret ; CHECK64-IZDINXZHINXMIN-NEXT: ret

View File

@ -4388,17 +4388,11 @@ define half @fcvt_h_wu(i32 %a) nounwind {
} }
define half @fcvt_h_wu_load(ptr %p) nounwind { define half @fcvt_h_wu_load(ptr %p) nounwind {
; RV32IZFH-LABEL: fcvt_h_wu_load: ; CHECKIZFH-LABEL: fcvt_h_wu_load:
; RV32IZFH: # %bb.0: ; CHECKIZFH: # %bb.0:
; RV32IZFH-NEXT: lw a0, 0(a0) ; CHECKIZFH-NEXT: lw a0, 0(a0)
; RV32IZFH-NEXT: fcvt.h.wu fa0, a0 ; CHECKIZFH-NEXT: fcvt.h.wu fa0, a0
; RV32IZFH-NEXT: ret ; CHECKIZFH-NEXT: ret
;
; RV64IZFH-LABEL: fcvt_h_wu_load:
; RV64IZFH: # %bb.0:
; RV64IZFH-NEXT: lwu a0, 0(a0)
; RV64IZFH-NEXT: fcvt.h.wu fa0, a0
; RV64IZFH-NEXT: ret
; ;
; RV32IDZFH-LABEL: fcvt_h_wu_load: ; RV32IDZFH-LABEL: fcvt_h_wu_load:
; RV32IDZFH: # %bb.0: ; RV32IDZFH: # %bb.0:
@ -4408,33 +4402,21 @@ define half @fcvt_h_wu_load(ptr %p) nounwind {
; ;
; RV64IDZFH-LABEL: fcvt_h_wu_load: ; RV64IDZFH-LABEL: fcvt_h_wu_load:
; RV64IDZFH: # %bb.0: ; RV64IDZFH: # %bb.0:
; RV64IDZFH-NEXT: lwu a0, 0(a0) ; RV64IDZFH-NEXT: lw a0, 0(a0)
; RV64IDZFH-NEXT: fcvt.h.wu fa0, a0 ; RV64IDZFH-NEXT: fcvt.h.wu fa0, a0
; RV64IDZFH-NEXT: ret ; RV64IDZFH-NEXT: ret
; ;
; RV32IZHINX-LABEL: fcvt_h_wu_load: ; CHECKIZHINX-LABEL: fcvt_h_wu_load:
; RV32IZHINX: # %bb.0: ; CHECKIZHINX: # %bb.0:
; RV32IZHINX-NEXT: lw a0, 0(a0) ; CHECKIZHINX-NEXT: lw a0, 0(a0)
; RV32IZHINX-NEXT: fcvt.h.wu a0, a0 ; CHECKIZHINX-NEXT: fcvt.h.wu a0, a0
; RV32IZHINX-NEXT: ret ; CHECKIZHINX-NEXT: ret
; ;
; RV64IZHINX-LABEL: fcvt_h_wu_load: ; CHECKIZDINXZHINX-LABEL: fcvt_h_wu_load:
; RV64IZHINX: # %bb.0: ; CHECKIZDINXZHINX: # %bb.0:
; RV64IZHINX-NEXT: lwu a0, 0(a0) ; CHECKIZDINXZHINX-NEXT: lw a0, 0(a0)
; RV64IZHINX-NEXT: fcvt.h.wu a0, a0 ; CHECKIZDINXZHINX-NEXT: fcvt.h.wu a0, a0
; RV64IZHINX-NEXT: ret ; CHECKIZDINXZHINX-NEXT: ret
;
; RV32IZDINXZHINX-LABEL: fcvt_h_wu_load:
; RV32IZDINXZHINX: # %bb.0:
; RV32IZDINXZHINX-NEXT: lw a0, 0(a0)
; RV32IZDINXZHINX-NEXT: fcvt.h.wu a0, a0
; RV32IZDINXZHINX-NEXT: ret
;
; RV64IZDINXZHINX-LABEL: fcvt_h_wu_load:
; RV64IZDINXZHINX: # %bb.0:
; RV64IZDINXZHINX-NEXT: lwu a0, 0(a0)
; RV64IZDINXZHINX-NEXT: fcvt.h.wu a0, a0
; RV64IZDINXZHINX-NEXT: ret
; ;
; RV32I-LABEL: fcvt_h_wu_load: ; RV32I-LABEL: fcvt_h_wu_load:
; RV32I: # %bb.0: ; RV32I: # %bb.0:
@ -4476,7 +4458,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind {
; RV64ID-LP64: # %bb.0: ; RV64ID-LP64: # %bb.0:
; RV64ID-LP64-NEXT: addi sp, sp, -16 ; RV64ID-LP64-NEXT: addi sp, sp, -16
; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill ; RV64ID-LP64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64ID-LP64-NEXT: lwu a0, 0(a0) ; RV64ID-LP64-NEXT: lw a0, 0(a0)
; RV64ID-LP64-NEXT: fcvt.s.wu fa5, a0 ; RV64ID-LP64-NEXT: fcvt.s.wu fa5, a0
; RV64ID-LP64-NEXT: fmv.x.w a0, fa5 ; RV64ID-LP64-NEXT: fmv.x.w a0, fa5
; RV64ID-LP64-NEXT: call __truncsfhf2 ; RV64ID-LP64-NEXT: call __truncsfhf2
@ -4505,7 +4487,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind {
; RV64ID: # %bb.0: ; RV64ID: # %bb.0:
; RV64ID-NEXT: addi sp, sp, -16 ; RV64ID-NEXT: addi sp, sp, -16
; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill ; RV64ID-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64ID-NEXT: lwu a0, 0(a0) ; RV64ID-NEXT: lw a0, 0(a0)
; RV64ID-NEXT: fcvt.s.wu fa0, a0 ; RV64ID-NEXT: fcvt.s.wu fa0, a0
; RV64ID-NEXT: call __truncsfhf2 ; RV64ID-NEXT: call __truncsfhf2
; RV64ID-NEXT: fmv.x.w a0, fa0 ; RV64ID-NEXT: fmv.x.w a0, fa0
@ -4525,7 +4507,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind {
; ;
; CHECK64-IZFHMIN-LABEL: fcvt_h_wu_load: ; CHECK64-IZFHMIN-LABEL: fcvt_h_wu_load:
; CHECK64-IZFHMIN: # %bb.0: ; CHECK64-IZFHMIN: # %bb.0:
; CHECK64-IZFHMIN-NEXT: lwu a0, 0(a0) ; CHECK64-IZFHMIN-NEXT: lw a0, 0(a0)
; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0 ; CHECK64-IZFHMIN-NEXT: fcvt.s.wu fa5, a0
; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5 ; CHECK64-IZFHMIN-NEXT: fcvt.h.s fa0, fa5
; CHECK64-IZFHMIN-NEXT: ret ; CHECK64-IZFHMIN-NEXT: ret
@ -4539,7 +4521,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind {
; ;
; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu_load: ; CHECK64-IZHINXMIN-LABEL: fcvt_h_wu_load:
; CHECK64-IZHINXMIN: # %bb.0: ; CHECK64-IZHINXMIN: # %bb.0:
; CHECK64-IZHINXMIN-NEXT: lwu a0, 0(a0) ; CHECK64-IZHINXMIN-NEXT: lw a0, 0(a0)
; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a0, a0 ; CHECK64-IZHINXMIN-NEXT: fcvt.s.wu a0, a0
; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0 ; CHECK64-IZHINXMIN-NEXT: fcvt.h.s a0, a0
; CHECK64-IZHINXMIN-NEXT: ret ; CHECK64-IZHINXMIN-NEXT: ret
@ -4553,7 +4535,7 @@ define half @fcvt_h_wu_load(ptr %p) nounwind {
; ;
; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu_load: ; CHECK64-IZDINXZHINXMIN-LABEL: fcvt_h_wu_load:
; CHECK64-IZDINXZHINXMIN: # %bb.0: ; CHECK64-IZDINXZHINXMIN: # %bb.0:
; CHECK64-IZDINXZHINXMIN-NEXT: lwu a0, 0(a0) ; CHECK64-IZDINXZHINXMIN-NEXT: lw a0, 0(a0)
; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0 ; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.s.wu a0, a0
; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0 ; CHECK64-IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0
; CHECK64-IZDINXZHINXMIN-NEXT: ret ; CHECK64-IZDINXZHINXMIN-NEXT: ret

View File

@ -3780,9 +3780,9 @@ define i32 @memcmp_size_5(ptr %s1, ptr %s2) nounwind optsize {
; ;
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_5: ; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_5:
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry ; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a2, 0(a0) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a2, 0(a0)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a0, 4(a0) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a0, 4(a0)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a3, 0(a1) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a3, 0(a1)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a1, 4(a1) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a1, 4(a1)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0 ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1 ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1
@ -3985,9 +3985,9 @@ define i32 @memcmp_size_6(ptr %s1, ptr %s2) nounwind optsize {
; ;
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_6: ; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_6:
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry ; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a2, 0(a0) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a2, 0(a0)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a0, 4(a0) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a0, 4(a0)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a3, 0(a1) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a3, 0(a1)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a1, 4(a1) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a1, 4(a1)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0 ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1 ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1

View File

@ -4410,9 +4410,9 @@ define i32 @memcmp_size_5(ptr %s1, ptr %s2) nounwind {
; ;
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_5: ; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_5:
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry ; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a2, 0(a0) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a2, 0(a0)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a0, 4(a0) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a0, 4(a0)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a3, 0(a1) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a3, 0(a1)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a1, 4(a1) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lbu a1, 4(a1)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0 ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1 ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1
@ -4615,9 +4615,9 @@ define i32 @memcmp_size_6(ptr %s1, ptr %s2) nounwind {
; ;
; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_6: ; CHECK-UNALIGNED-RV64-ZBKB-LABEL: memcmp_size_6:
; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry ; CHECK-UNALIGNED-RV64-ZBKB: # %bb.0: # %entry
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a2, 0(a0) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a2, 0(a0)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a0, 4(a0) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a0, 4(a0)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lwu a3, 0(a1) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lw a3, 0(a1)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a1, 4(a1) ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: lhu a1, 4(a1)
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0 ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a0, a2, a0
; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1 ; CHECK-UNALIGNED-RV64-ZBKB-NEXT: pack a1, a3, a1

View File

@ -239,8 +239,8 @@ body: |
; NO-PREFER-W-INST-NEXT: {{ $}} ; NO-PREFER-W-INST-NEXT: {{ $}}
; NO-PREFER-W-INST-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10 ; NO-PREFER-W-INST-NEXT: [[COPY:%[0-9]+]]:gpr = COPY $x10
; NO-PREFER-W-INST-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11 ; NO-PREFER-W-INST-NEXT: [[COPY1:%[0-9]+]]:gpr = COPY $x11
; NO-PREFER-W-INST-NEXT: [[LWU:%[0-9]+]]:gpr = LWU [[COPY]], 0 ; NO-PREFER-W-INST-NEXT: [[LW:%[0-9]+]]:gpr = LW [[COPY]], 0
; NO-PREFER-W-INST-NEXT: [[ADDIW:%[0-9]+]]:gpr = ADDIW [[LWU]], 1 ; NO-PREFER-W-INST-NEXT: [[ADDIW:%[0-9]+]]:gpr = ADDIW [[LW]], 1
; NO-PREFER-W-INST-NEXT: $x10 = COPY [[ADDIW]] ; NO-PREFER-W-INST-NEXT: $x10 = COPY [[ADDIW]]
; NO-PREFER-W-INST-NEXT: PseudoRET ; NO-PREFER-W-INST-NEXT: PseudoRET
; ;

View File

@ -701,7 +701,7 @@ define signext i32 @ctpop_i32_load(ptr %p) nounwind {
; ;
; RV64ZBB-LABEL: ctpop_i32_load: ; RV64ZBB-LABEL: ctpop_i32_load:
; RV64ZBB: # %bb.0: ; RV64ZBB: # %bb.0:
; RV64ZBB-NEXT: lwu a0, 0(a0) ; RV64ZBB-NEXT: lw a0, 0(a0)
; RV64ZBB-NEXT: cpopw a0, a0 ; RV64ZBB-NEXT: cpopw a0, a0
; RV64ZBB-NEXT: ret ; RV64ZBB-NEXT: ret
%a = load i32, ptr %p %a = load i32, ptr %p

View File

@ -114,7 +114,7 @@ define i64 @pack_i64_3(ptr %0, ptr %1) {
; RV64ZBKB-LABEL: pack_i64_3: ; RV64ZBKB-LABEL: pack_i64_3:
; RV64ZBKB: # %bb.0: ; RV64ZBKB: # %bb.0:
; RV64ZBKB-NEXT: lw a0, 0(a0) ; RV64ZBKB-NEXT: lw a0, 0(a0)
; RV64ZBKB-NEXT: lwu a1, 0(a1) ; RV64ZBKB-NEXT: lw a1, 0(a1)
; RV64ZBKB-NEXT: pack a0, a1, a0 ; RV64ZBKB-NEXT: pack a0, a1, a0
; RV64ZBKB-NEXT: ret ; RV64ZBKB-NEXT: ret
%3 = load i32, ptr %0, align 4 %3 = load i32, ptr %0, align 4

View File

@ -204,7 +204,7 @@ define <2 x i64> @mgather_v2i64_align4(<2 x ptr> %ptrs, <2 x i1> %m, <2 x i64> %
; RV64-SLOW-NEXT: # %bb.1: # %cond.load ; RV64-SLOW-NEXT: # %bb.1: # %cond.load
; RV64-SLOW-NEXT: vsetvli zero, zero, e64, m8, tu, ma ; RV64-SLOW-NEXT: vsetvli zero, zero, e64, m8, tu, ma
; RV64-SLOW-NEXT: vmv.x.s a1, v8 ; RV64-SLOW-NEXT: vmv.x.s a1, v8
; RV64-SLOW-NEXT: lwu a2, 4(a1) ; RV64-SLOW-NEXT: lw a2, 4(a1)
; RV64-SLOW-NEXT: lwu a1, 0(a1) ; RV64-SLOW-NEXT: lwu a1, 0(a1)
; RV64-SLOW-NEXT: slli a2, a2, 32 ; RV64-SLOW-NEXT: slli a2, a2, 32
; RV64-SLOW-NEXT: or a1, a2, a1 ; RV64-SLOW-NEXT: or a1, a2, a1
@ -216,7 +216,7 @@ define <2 x i64> @mgather_v2i64_align4(<2 x ptr> %ptrs, <2 x i1> %m, <2 x i64> %
; RV64-SLOW-NEXT: vsetivli zero, 2, e64, m1, ta, ma ; RV64-SLOW-NEXT: vsetivli zero, 2, e64, m1, ta, ma
; RV64-SLOW-NEXT: vslidedown.vi v8, v8, 1 ; RV64-SLOW-NEXT: vslidedown.vi v8, v8, 1
; RV64-SLOW-NEXT: vmv.x.s a0, v8 ; RV64-SLOW-NEXT: vmv.x.s a0, v8
; RV64-SLOW-NEXT: lwu a1, 4(a0) ; RV64-SLOW-NEXT: lw a1, 4(a0)
; RV64-SLOW-NEXT: lwu a0, 0(a0) ; RV64-SLOW-NEXT: lwu a0, 0(a0)
; RV64-SLOW-NEXT: slli a1, a1, 32 ; RV64-SLOW-NEXT: slli a1, a1, 32
; RV64-SLOW-NEXT: or a0, a1, a0 ; RV64-SLOW-NEXT: or a0, a1, a0

View File

@ -818,7 +818,7 @@ define <2 x i64> @vwaddu_vx_v2i64_i32(ptr %x, ptr %y) nounwind {
; RV64: # %bb.0: ; RV64: # %bb.0:
; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma ; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
; RV64-NEXT: vle32.v v9, (a0) ; RV64-NEXT: vle32.v v9, (a0)
; RV64-NEXT: lwu a0, 0(a1) ; RV64-NEXT: lw a0, 0(a1)
; RV64-NEXT: vwaddu.vx v8, v9, a0 ; RV64-NEXT: vwaddu.vx v8, v9, a0
; RV64-NEXT: ret ; RV64-NEXT: ret
%a = load <2 x i32>, ptr %x %a = load <2 x i32>, ptr %x

View File

@ -853,7 +853,7 @@ define <2 x i64> @vwmulsu_vx_v2i64_i32(ptr %x, ptr %y) {
; RV64: # %bb.0: ; RV64: # %bb.0:
; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma ; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
; RV64-NEXT: vle32.v v9, (a0) ; RV64-NEXT: vle32.v v9, (a0)
; RV64-NEXT: lwu a0, 0(a1) ; RV64-NEXT: lw a0, 0(a1)
; RV64-NEXT: vwmulsu.vx v8, v9, a0 ; RV64-NEXT: vwmulsu.vx v8, v9, a0
; RV64-NEXT: ret ; RV64-NEXT: ret
%a = load <2 x i32>, ptr %x %a = load <2 x i32>, ptr %x

View File

@ -710,13 +710,6 @@ define <4 x i32> @vwmulu_vx_v4i32_i8(ptr %x, ptr %y) {
} }
define <4 x i32> @vwmulu_vx_v4i32_i16(ptr %x, ptr %y) { define <4 x i32> @vwmulu_vx_v4i32_i16(ptr %x, ptr %y) {
; CHECK-LABEL: vwmulu_vx_v4i32_i16:
; CHECK: # %bb.0:
; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma
; CHECK-NEXT: vle16.v v9, (a0)
; CHECK-NEXT: lhu a0, 0(a1)
; CHECK-NEXT: vwmulu.vx v8, v9, a0
; CHECK-NEXT: ret
%a = load <4 x i16>, ptr %x %a = load <4 x i16>, ptr %x
%b = load i16, ptr %y %b = load i16, ptr %y
%c = zext i16 %b to i32 %c = zext i16 %b to i32

View File

@ -821,7 +821,7 @@ define <2 x i64> @vwsubu_vx_v2i64_i32(ptr %x, ptr %y) nounwind {
; ;
; RV64-LABEL: vwsubu_vx_v2i64_i32: ; RV64-LABEL: vwsubu_vx_v2i64_i32:
; RV64: # %bb.0: ; RV64: # %bb.0:
; RV64-NEXT: lwu a1, 0(a1) ; RV64-NEXT: lw a1, 0(a1)
; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma ; RV64-NEXT: vsetivli zero, 2, e32, mf2, ta, ma
; RV64-NEXT: vle32.v v9, (a0) ; RV64-NEXT: vle32.v v9, (a0)
; RV64-NEXT: vmv.v.x v10, a1 ; RV64-NEXT: vmv.v.x v10, a1

View File

@ -242,7 +242,7 @@ define void @foo7(ptr nocapture %p) nounwind {
; RV64ZDINX: # %bb.0: # %entry ; RV64ZDINX: # %bb.0: # %entry
; RV64ZDINX-NEXT: lui a1, %hi(d) ; RV64ZDINX-NEXT: lui a1, %hi(d)
; RV64ZDINX-NEXT: addi a2, a1, %lo(d) ; RV64ZDINX-NEXT: addi a2, a1, %lo(d)
; RV64ZDINX-NEXT: lwu a2, 8(a2) ; RV64ZDINX-NEXT: lw a2, 8(a2)
; RV64ZDINX-NEXT: lwu a1, %lo(d+4)(a1) ; RV64ZDINX-NEXT: lwu a1, %lo(d+4)(a1)
; RV64ZDINX-NEXT: slli a2, a2, 32 ; RV64ZDINX-NEXT: slli a2, a2, 32
; RV64ZDINX-NEXT: or a1, a2, a1 ; RV64ZDINX-NEXT: or a1, a2, a1
@ -337,7 +337,7 @@ define void @foo9(ptr nocapture %p) nounwind {
; RV64ZDINX: # %bb.0: # %entry ; RV64ZDINX: # %bb.0: # %entry
; RV64ZDINX-NEXT: lui a1, %hi(e) ; RV64ZDINX-NEXT: lui a1, %hi(e)
; RV64ZDINX-NEXT: addi a2, a1, %lo(e) ; RV64ZDINX-NEXT: addi a2, a1, %lo(e)
; RV64ZDINX-NEXT: lwu a2, 4(a2) ; RV64ZDINX-NEXT: lw a2, 4(a2)
; RV64ZDINX-NEXT: lwu a1, %lo(e)(a1) ; RV64ZDINX-NEXT: lwu a1, %lo(e)(a1)
; RV64ZDINX-NEXT: slli a2, a2, 32 ; RV64ZDINX-NEXT: slli a2, a2, 32
; RV64ZDINX-NEXT: or a1, a2, a1 ; RV64ZDINX-NEXT: or a1, a2, a1
@ -480,7 +480,7 @@ define double @foo13(ptr nocapture %p) nounwind {
; RV64ZDINX-LABEL: foo13: ; RV64ZDINX-LABEL: foo13:
; RV64ZDINX: # %bb.0: # %entry ; RV64ZDINX: # %bb.0: # %entry
; RV64ZDINX-NEXT: lui a0, %hi(f) ; RV64ZDINX-NEXT: lui a0, %hi(f)
; RV64ZDINX-NEXT: lwu a1, %lo(f+8)(a0) ; RV64ZDINX-NEXT: lw a1, %lo(f+8)(a0)
; RV64ZDINX-NEXT: lwu a0, %lo(f+4)(a0) ; RV64ZDINX-NEXT: lwu a0, %lo(f+4)(a0)
; RV64ZDINX-NEXT: slli a1, a1, 32 ; RV64ZDINX-NEXT: slli a1, a1, 32
; RV64ZDINX-NEXT: or a0, a1, a0 ; RV64ZDINX-NEXT: or a0, a1, a0