From cd30fb546e389d1fb78ce8e579b3dba3a8fdb52a Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Thu, 13 Aug 2026 21:11:10 +0800 Subject: [CodeGen] Match LLVM machine copy propagation --- backend/lib/CodeGen/MachineOperand.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'backend/lib/CodeGen/MachineOperand.cpp') diff --git a/backend/lib/CodeGen/MachineOperand.cpp b/backend/lib/CodeGen/MachineOperand.cpp index 44ad8b6..9b54bb9 100644 --- a/backend/lib/CodeGen/MachineOperand.cpp +++ b/backend/lib/CodeGen/MachineOperand.cpp @@ -315,6 +315,26 @@ Expected MachineOperand::setRegister(Register Reg) { return {}; } +Expected MachineOperand::changeToImmediate(std::int64_t Value) { + if (!isRegister() || isImplicit() || isDef() || tiedOperandIndex()) { + return makeUnexpected(ErrorCode::InvalidArgument, + "only an untied explicit register use can become an immediate"); + } + unlinkFromRegInfo(); + OperandKind = Kind::Immediate; + Storage = Value; + RegFlags = {}; + RegSubReg = {}; + return {}; +} + +Expected MachineOperand::setImmediate(std::int64_t Value) { + if (OperandKind != Kind::Immediate) + return makeUnexpected(ErrorCode::InvalidArgument, "setImmediate requires an immediate operand"); + Storage = Value; + return {}; +} + Expected MachineOperand::setRegisterFlags(RegisterOperandFlags Flags) { if (!isRegister()) { return makeUnexpected(ErrorCode::InvalidArgument, "register flags require a register operand"); -- cgit v1.2.3