diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-11 18:11:10 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-11 18:11:10 +0800 |
| commit | d3dc5aaf114e8e1ad830ca821814c952966a550b (patch) | |
| tree | 2accc3b216c9a105e065ff61d2be199c641379d5 /backend/lib/Target/RISCV/RISCVCodeGen.cpp | |
| parent | 1e0003ec107dff77cd579d245f6314cbf7d4f3fc (diff) | |
| download | rcc-project-d3dc5aaf114e8e1ad830ca821814c952966a550b.tar.gz rcc-project-d3dc5aaf114e8e1ad830ca821814c952966a550b.tar.xz | |
[RISCV] Preserve narrow cmpxchg results when widening
Diffstat (limited to 'backend/lib/Target/RISCV/RISCVCodeGen.cpp')
| -rw-r--r-- | backend/lib/Target/RISCV/RISCVCodeGen.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/backend/lib/Target/RISCV/RISCVCodeGen.cpp b/backend/lib/Target/RISCV/RISCVCodeGen.cpp index 44f2e7e..506c1e2 100644 --- a/backend/lib/Target/RISCV/RISCVCodeGen.cpp +++ b/backend/lib/Target/RISCV/RISCVCodeGen.cpp @@ -546,6 +546,7 @@ narrowAnyExtBinaryPlan(const MachineInstr &Extension, const MachineFunction &Fun OriginalType->scalarBitWidth() >= 64) return makeUnexpected(ErrorCode::VerificationError, "RISC-V narrow compare-exchange has invalid operands"); + const Register OriginalDestination = *Destination; auto WideType = LLT::makeAnyScalar(64); if (!WideType) @@ -561,7 +562,7 @@ narrowAnyExtBinaryPlan(const MachineInstr &Extension, const MachineFunction &Fun return std::unexpected(WideNewValue.error()); Register WideDestination; - MachineInstr *FoldedExtension = singleRegisterUse(Function, *Destination); + MachineInstr *FoldedExtension = singleRegisterUse(Function, OriginalDestination); if (FoldedExtension != nullptr && FoldedExtension->opcode() == opcode(GenericOpcode::G_ANYEXT) && operandType(Function, *FoldedExtension, 0) .transform([](LLT Type) { return Type.scalarBitWidth() == 64; }) @@ -597,7 +598,7 @@ narrowAnyExtBinaryPlan(const MachineInstr &Extension, const MachineFunction &Fun auto Truncation = Builder.buildInstr(opcode(GenericOpcode::G_TRUNC)); if (!Truncation) return std::unexpected(Truncation.error()); - if (auto Added = Truncation->addDef(*Destination); !Added) + if (auto Added = Truncation->addDef(OriginalDestination); !Added) return std::unexpected(Added.error()); if (auto Added = Truncation->addUse(WideDestination); !Added) return std::unexpected(Added.error()); |
