aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-15 21:02:14 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-15 21:02:14 +0800
commit071d08cbbf9d7fab4dac294e723f12ddc2b8918d (patch)
tree9fcf72cbd3f29de85735aa6435932c6a7482a1ea /backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
parent63b14b615eb83ed2b2cdd69b49b283a9b5ff7357 (diff)
downloadrcc-project-071d08cbbf9d7fab4dac294e723f12ddc2b8918d.tar.gz
rcc-project-071d08cbbf9d7fab4dac294e723f12ddc2b8918d.tar.xz
[GlobalISel] Legalize multiply with overflow
Diffstat (limited to 'backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp')
-rw-r--r--backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp b/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
index 2a762a1..0036cdf 100644
--- a/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
+++ b/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp
@@ -518,6 +518,13 @@ RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &Subtarget) : Subtar
.lowerFor({S64});
getActionDefinitionsBuilder({opcode(GenericOpcode::G_SMULO), opcode(GenericOpcode::G_UMULO)})
.minScalar(0, S64)
+ // Widen s64 to s128 so one libcall provides both the low result and
+ // the high half needed for the overflow check.
+ .widenScalarIf(
+ [S64](const LegalizationQuery &Query) {
+ return !Query.Types.empty() && Query.Types[0] == S64;
+ },
+ [S128](const LegalizationQuery &) { return std::pair{std::size_t{0}, S128}; })
.lower();
}
if (HasM) {