diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-15 21:02:14 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-15 21:02:14 +0800 |
| commit | 071d08cbbf9d7fab4dac294e723f12ddc2b8918d (patch) | |
| tree | 9fcf72cbd3f29de85735aa6435932c6a7482a1ea /backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp | |
| parent | 63b14b615eb83ed2b2cdd69b49b283a9b5ff7357 (diff) | |
| download | rcc-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.cpp | 7 |
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) { |
