aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/Target/RISCV/RISCVCodeGen.cpp
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-11 19:36:06 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-11 19:36:06 +0800
commitb7716aba458fb3d49742f7a3c169deee7345396e (patch)
tree85a8f99a8bd06e9dfbe6e7973c3440f2db7110af /backend/lib/Target/RISCV/RISCVCodeGen.cpp
parente7bf0d93d40ad86902d9a8636d24420b5abd2937 (diff)
downloadrcc-project-b7716aba458fb3d49742f7a3c169deee7345396e.tar.gz
rcc-project-b7716aba458fb3d49742f7a3c169deee7345396e.tar.xz
[RISCV] Honor invocation subtarget features
Diffstat (limited to 'backend/lib/Target/RISCV/RISCVCodeGen.cpp')
-rw-r--r--backend/lib/Target/RISCV/RISCVCodeGen.cpp15
1 files changed, 14 insertions, 1 deletions
diff --git a/backend/lib/Target/RISCV/RISCVCodeGen.cpp b/backend/lib/Target/RISCV/RISCVCodeGen.cpp
index 8676a2b..0bd3298 100644
--- a/backend/lib/Target/RISCV/RISCVCodeGen.cpp
+++ b/backend/lib/Target/RISCV/RISCVCodeGen.cpp
@@ -2879,9 +2879,15 @@ buildIncomingConversion(MachineFunction &Function, const TargetDescription &Targ
class RISCVLegalizerInfo final : public TargetLegalizerInfo {
public:
+ explicit RISCVLegalizerInfo(RISCVSubtargetFeatures Features) : Features(Features) {}
+
[[nodiscard]] Expected<LegalizationAction> classify(const MachineInstr &Instruction,
const MachineFunction &Function,
const TargetDescription &) const override {
+ if (!Features.has(RISCVExtension::I)) {
+ return makeUnexpected(ErrorCode::InternalError,
+ "RISC-V legalizer requires the base I extension");
+ }
if (!isGenericOpcode(Instruction.opcode()))
return LegalizationAction::Legal;
@@ -3560,6 +3566,9 @@ public:
return makeUnexpected(ErrorCode::Unsupported,
"RISC-V legalizer has no lowering rule for this instruction");
}
+
+private:
+ RISCVSubtargetFeatures Features;
};
class RISCVRegisterBankInfo final : public TargetRegisterBankInfo {
@@ -6284,10 +6293,14 @@ private:
} // namespace
const TargetLegalizerInfo &legalizerInfo() noexcept {
- static const RISCVLegalizerInfo Value;
+ static const RISCVLegalizerInfo Value(RISCVSubtargetFeatures::rv64gc());
return Value;
}
+std::unique_ptr<TargetLegalizerInfo> createLegalizerInfo(RISCVSubtargetFeatures Features) {
+ return std::make_unique<RISCVLegalizerInfo>(Features);
+}
+
const TargetRegisterBankInfo &registerBankInfo() noexcept {
static const RISCVRegisterBankInfo Value;
return Value;