diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-10-01 02:07:16 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-10-01 02:07:16 +0000 |
commit | bdcc6d3d2638b3a2c99ab3b9bfaa9c02e584993a (patch) | |
tree | e8af9d8561e063eb1612cc02690a373b651a155a /llvm/lib | |
parent | 8f6bdb76684fdb053166f6fa615a109bfc535709 (diff) | |
download | bcm5719-llvm-bdcc6d3d2638b3a2c99ab3b9bfaa9c02e584993a.tar.gz bcm5719-llvm-bdcc6d3d2638b3a2c99ab3b9bfaa9c02e584993a.zip |
GlobalISel: Handle llvm.read_register
SelectionDAG has a bunch of machinery to defer this to selection time
for some reason. Just directly emit a copy during IRTranslator. The
x86 usage does somewhat questionably check hasFP, which could depend
on the whole function being at minimum translated.
This does lose the convergent bit if the callsite had it, which may be
a problem. We also lose that in general for intrinsics, which may also
be a problem.
llvm-svn: 373294
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; } |