summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2019-10-01 02:07:16 +0000
committerMatt Arsenault <Matthew.Arsenault@amd.com>2019-10-01 02:07:16 +0000
commitbdcc6d3d2638b3a2c99ab3b9bfaa9c02e584993a (patch)
treee8af9d8561e063eb1612cc02690a373b651a155a /llvm/lib
parent8f6bdb76684fdb053166f6fa615a109bfc535709 (diff)
downloadbcm5719-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.cpp15
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;
}
OpenPOWER on IntegriCloud