diff --git a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp --- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp +++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVMatInt.cpp @@ -366,7 +366,8 @@ int getIntMatCost(const APInt &Val, unsigned Size, const FeatureBitset &ActiveFeatures, bool CompressionCost) { bool IsRV64 = ActiveFeatures[RISCV::Feature64Bit]; - bool HasRVC = CompressionCost && ActiveFeatures[RISCV::FeatureStdExtC]; + bool HasRVC = CompressionCost && (ActiveFeatures[RISCV::FeatureStdExtC] || + ActiveFeatures[RISCV::FeatureExtZca]); int PlatRegSize = IsRV64 ? 64 : 32; // Split the constant into platform register sized chunks, and calculate cost diff --git a/llvm/lib/Target/RISCV/RISCVMakeCompressible.cpp b/llvm/lib/Target/RISCV/RISCVMakeCompressible.cpp --- a/llvm/lib/Target/RISCV/RISCVMakeCompressible.cpp +++ b/llvm/lib/Target/RISCV/RISCVMakeCompressible.cpp @@ -332,6 +332,7 @@ const RISCVInstrInfo &TII = *STI.getInstrInfo(); // This optimization only makes sense if compressed instructions are emitted. + // FIXME: Support Zca, Zcf, Zcd granularity. if (!STI.hasStdExtC()) return false; diff --git a/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp b/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp --- a/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVRegisterInfo.cpp @@ -562,7 +562,7 @@ unsigned RISCVRegisterInfo::getRegisterCostTableIndex(const MachineFunction &MF) const { - return MF.getSubtarget().hasStdExtC() ? 1 : 0; + return MF.getSubtarget().hasStdExtCOrZca() ? 1 : 0; } // Add two address hints to improve chances of being able to use a compressed diff --git a/llvm/test/CodeGen/RISCV/add-before-shl.ll b/llvm/test/CodeGen/RISCV/add-before-shl.ll --- a/llvm/test/CodeGen/RISCV/add-before-shl.ll +++ b/llvm/test/CodeGen/RISCV/add-before-shl.ll @@ -7,6 +7,10 @@ ; RUN: < %s | FileCheck -check-prefixes=RV32C %s ; RUN: llc -mtriple=riscv64 -mattr=+c -verify-machineinstrs --riscv-no-aliases \ ; RUN: < %s | FileCheck -check-prefixes=RV64C %s +; RUN: llc -mtriple=riscv32 -mattr=+experimental-zca -verify-machineinstrs --riscv-no-aliases \ +; RUN: < %s | FileCheck -check-prefixes=RV32C %s +; RUN: llc -mtriple=riscv64 -mattr=+experimental-zca -verify-machineinstrs --riscv-no-aliases \ +; RUN: < %s | FileCheck -check-prefixes=RV64C %s ; These test that constant adds are not moved after shifts by DAGCombine, ; if the constant is cheaper to materialise before it has been shifted.