diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -1174,10 +1174,11 @@ bool RISCVTargetLowering::isZExtFree(SDValue Val, EVT VT2) const { // Zexts are free if they can be combined with a load. + // Don't advertise i32->i64 zextload as being free for RV64. It interacts + // poorly with type legalization of compares preferring sext. if (auto *LD = dyn_cast(Val)) { EVT MemVT = LD->getMemoryVT(); - if ((MemVT == MVT::i8 || MemVT == MVT::i16 || - (Subtarget.is64Bit() && MemVT == MVT::i32)) && + if ((MemVT == MVT::i8 || MemVT == MVT::i16) && (LD->getExtensionType() == ISD::NON_EXTLOAD || LD->getExtensionType() == ISD::ZEXTLOAD)) return true; 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 @@ -11118,7 +11118,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB145_2 @@ -11208,7 +11208,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB146_2 @@ -11298,7 +11298,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB147_2 @@ -11388,7 +11388,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB148_2 @@ -11478,7 +11478,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB149_2 @@ -11568,7 +11568,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB150_2 @@ -11658,7 +11658,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB151_2 @@ -11748,7 +11748,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB152_2 @@ -11838,7 +11838,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB153_2 @@ -11928,7 +11928,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB154_2 @@ -12018,7 +12018,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB155_2 @@ -12108,7 +12108,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB156_2 @@ -12198,7 +12198,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB157_2 @@ -12288,7 +12288,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB158_2 @@ -12378,7 +12378,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB159_2 @@ -12468,7 +12468,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB160_2 @@ -12558,7 +12558,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB161_2 @@ -12648,7 +12648,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB162_2 @@ -12738,7 +12738,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB163_2 @@ -12828,7 +12828,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB164_2 diff --git a/llvm/test/CodeGen/RISCV/atomic-signext.ll b/llvm/test/CodeGen/RISCV/atomic-signext.ll --- a/llvm/test/CodeGen/RISCV/atomic-signext.ll +++ b/llvm/test/CodeGen/RISCV/atomic-signext.ll @@ -2549,7 +2549,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB32_2 @@ -2639,7 +2639,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB33_2 @@ -2729,7 +2729,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB34_2 @@ -2819,7 +2819,7 @@ ; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill ; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill ; RV64I-NEXT: mv s0, a0 -; RV64I-NEXT: lwu a3, 0(a0) +; RV64I-NEXT: lw a3, 0(a0) ; RV64I-NEXT: mv s2, a1 ; RV64I-NEXT: sext.w s1, a1 ; RV64I-NEXT: j .LBB35_2 diff --git a/llvm/test/CodeGen/RISCV/inline-asm.ll b/llvm/test/CodeGen/RISCV/inline-asm.ll --- a/llvm/test/CodeGen/RISCV/inline-asm.ll +++ b/llvm/test/CodeGen/RISCV/inline-asm.ll @@ -19,7 +19,7 @@ ; RV64I-LABEL: constraint_r: ; RV64I: # %bb.0: ; RV64I-NEXT: lui a1, %hi(gi) -; RV64I-NEXT: lwu a1, %lo(gi)(a1) +; RV64I-NEXT: lw a1, %lo(gi)(a1) ; RV64I-NEXT: #APP ; RV64I-NEXT: add a0, a0, a1 ; RV64I-NEXT: #NO_APP