diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 37ac96e5290..e1cfb96e13c 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -1523,6 +1523,21 @@ bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID, case Intrinsic::sideeffect: // Discard annotate attributes, assumptions, and artificial side-effects. return true; + case Intrinsic::read_register: { + Value *Arg = CI.getArgOperand(0); + const Metadata *MD = cast<MetadataAsValue>(Arg)->getMetadata(); + const MDString *RegStr = cast<MDString>(cast<MDNode>(MD)->getOperand(0)); + + auto *TLI = MF->getSubtarget().getTargetLowering(); + Register Dst = getOrCreateVReg(CI); + EVT VT = TLI->getValueType(*DL, CI.getType()); + Register Reg = TLI->getRegisterByName(RegStr->getString().data(), VT, *MF); + if (!Reg.isValid()) + return false; + + MIRBuilder.buildCopy(Dst, Reg); + return true; + } } return false; } |