Index: llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h =================================================================== --- llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h +++ llvm/include/llvm/CodeGen/GlobalISel/LegalizerHelper.h @@ -265,7 +265,7 @@ LegalizeResult lowerSADDO_SSUBO(MachineInstr &MI); LegalizeResult lowerBswap(MachineInstr &MI); LegalizeResult lowerBitreverse(MachineInstr &MI); - LegalizeResult lowerReadRegister(MachineInstr &MI); + LegalizeResult lowerReadWriteRegister(MachineInstr &MI); private: MachineRegisterInfo &MRI; Index: llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp =================================================================== --- llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -1533,6 +1533,13 @@ .addMetadata(cast(cast(Arg)->getMetadata())); return true; } + case Intrinsic::write_register: { + Value *Arg = CI.getArgOperand(0); + MIRBuilder.buildInstr(TargetOpcode::G_WRITE_REGISTER) + .addMetadata(cast(cast(Arg)->getMetadata())) + .addUse(getOrCreateVReg(*CI.getArgOperand(1))); + return true; + } } return false; } Index: llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp =================================================================== --- llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -2478,7 +2478,8 @@ case G_BITREVERSE: return lowerBitreverse(MI); case G_READ_REGISTER: - return lowerReadRegister(MI); + case G_WRITE_REGISTER: + return lowerReadWriteRegister(MI); } } @@ -4774,20 +4775,29 @@ } LegalizerHelper::LegalizeResult -LegalizerHelper::lowerReadRegister(MachineInstr &MI) { - Register Dst = MI.getOperand(0).getReg(); - const LLT Ty = MRI.getType(Dst); - const MDString *RegStr = cast( - cast(MI.getOperand(1).getMetadata())->getOperand(0)); - +LegalizerHelper::lowerReadWriteRegister(MachineInstr &MI) { MachineFunction &MF = MIRBuilder.getMF(); const TargetSubtargetInfo &STI = MF.getSubtarget(); const TargetLowering *TLI = STI.getTargetLowering(); - Register Reg = TLI->getRegisterByName(RegStr->getString().data(), Ty, MF); - if (!Reg.isValid()) + + bool IsRead = MI.getOpcode() == TargetOpcode::G_READ_REGISTER; + int NameOpIdx = IsRead ? 1 : 0; + int ValRegIndex = IsRead ? 0 : 1; + + Register ValReg = MI.getOperand(ValRegIndex).getReg(); + const LLT Ty = MRI.getType(ValReg); + const MDString *RegStr = cast( + cast(MI.getOperand(NameOpIdx).getMetadata())->getOperand(0)); + + Register PhysReg = TLI->getRegisterByName(RegStr->getString().data(), Ty, MF); + if (!PhysReg.isValid()) return UnableToLegalize; - MIRBuilder.buildCopy(Dst, Reg); + if (IsRead) + MIRBuilder.buildCopy(ValReg, PhysReg); + else + MIRBuilder.buildCopy(PhysReg, ValReg); + MI.eraseFromParent(); return Legalized; } Index: llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll =================================================================== --- llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll +++ llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll @@ -85,7 +85,7 @@ ; Make sure we don't mess up metadata arguments. declare void @llvm.write_register.i64(metadata, i64) -; FALLBACK-WITH-REPORT-ERR: remark: :0:0: unable to translate instruction: call: ' call void @llvm.write_register.i64(metadata !0, i64 0)' (in function: test_write_register_intrin) +; FALLBACK-WITH-REPORT-ERR: remark: :0:0: unable to legalize instruction: G_WRITE_REGISTER !0, %0:_(s64) (in function: test_write_register_intrin) ; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for test_write_register_intrin ; FALLBACK-WITH-REPORT-LABEL: test_write_register_intrin: define void @test_write_register_intrin() { Index: llvm/test/CodeGen/AMDGPU/GlobalISel/write_register.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/AMDGPU/GlobalISel/write_register.ll @@ -0,0 +1,2 @@ +; Runs original SDAG test with -global-isel +; RUN: llc -global-isel -march=amdgcn -mcpu=bonaire -enable-misched=0 -verify-machineinstrs < %S/../write_register.ll | FileCheck -enable-var-scope %S/../write_register.ll