aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-15 04:26:05 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-15 04:26:05 +0800
commit6f67b5ba63e0993d6aa9002c8c59fcf13148b869 (patch)
treed371a490482ecb69621485361ec7cc0405edc7e1
parent1ff4fb953820c823ae8d5035c75bf43bf85e9c3c (diff)
downloadrcc-project-6f67b5ba63e0993d6aa9002c8c59fcf13148b869.tar.gz
rcc-project-6f67b5ba63e0993d6aa9002c8c59fcf13148b869.tar.xz
[RISCV][GlobalISel] Preserve Zbb sign extensions
-rw-r--r--backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp4
-rw-r--r--backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h3
2 files changed, 6 insertions, 1 deletions
diff --git a/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp b/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
index 975fc9b..06eea7b 100644
--- a/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
+++ b/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
@@ -284,7 +284,7 @@ foldConstantExtension(MachineInstr &Instruction, MachineFunction &Function, Gene
} // namespace
-RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &Subtarget) {
+RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &Subtarget) : Subtarget(Subtarget) {
const LowLevelType S8 = *LowLevelType::makeCategoryNeutralScalar(8);
const LowLevelType S16 = *LowLevelType::makeCategoryNeutralScalar(16);
const LowLevelType S32 = *LowLevelType::makeCategoryNeutralScalar(32);
@@ -754,6 +754,8 @@ Expected<void> RISCVLegalizerInfo::legalizeCustom(LegalizerHelper &Helper,
return std::unexpected(DestinationType.error());
if (DestinationType->minimumBitWidth() == 64 && *Size == 32)
return {};
+ if (Subtarget.features().has(RISCVExtension::Zbb) && (*Size == 8 || *Size == 16))
+ return {};
return Helper.lower(Instruction, LegalizationDecision{
.Action = LegalizationAction::Lower,
.TypeIndex = 0,
diff --git a/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h b/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h
index 7e84764..43a18a1 100644
--- a/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h
+++ b/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h
@@ -18,6 +18,9 @@ public:
MachineInstr &Instruction) const override;
[[nodiscard]] bool isSExtCheaperThanZExt(LowLevelType SourceType,
LowLevelType DestinationType) const override;
+
+private:
+ const RISCVSubtarget &Subtarget;
};
} // namespace rcc::riscv