diff options
author | Tim Northover <tnorthover@apple.com> | 2016-07-25 21:01:29 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2016-07-25 21:01:29 +0000 |
commit | 7c9eba90ffdcf35dc587c65b9ff9a5bf3ac0acc7 (patch) | |
tree | 1e4ec47f97b7d3a92ab432176a8b0dd911faf72c /llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | |
parent | e2e0067352c7e92159f6d29531ac652959349b2d (diff) | |
download | bcm5719-llvm-7c9eba90ffdcf35dc587c65b9ff9a5bf3ac0acc7.tar.gz bcm5719-llvm-7c9eba90ffdcf35dc587c65b9ff9a5bf3ac0acc7.zip |
GlobalISel: add generic casts to IRTranslator
This adds LLVM's 3 main cast instructions (inttoptr, ptrtoint, bitcast) to the
IRTranslator. The first two are direct translations (with 2 MachineInstr types
each). Since LLT discards information, a bitcast might become trivial and we
emit a COPY in those cases instead.
llvm-svn: 276690
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 82cec258fa6..f7db60f59b5 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -100,6 +100,23 @@ bool IRTranslator::translateBr(const Instruction &Inst) { return true; } +bool IRTranslator::translateBitCast(const CastInst &CI) { + if (LLT{*CI.getDestTy()} == LLT{*CI.getSrcTy()}) { + MIRBuilder.buildInstr(TargetOpcode::COPY, getOrCreateVReg(CI), + getOrCreateVReg(*CI.getOperand(0))); + return true; + } + return translateCast(TargetOpcode::G_BITCAST, CI); +} + +bool IRTranslator::translateCast(unsigned Opcode, const CastInst &CI) { + unsigned Op = getOrCreateVReg(*CI.getOperand(0)); + unsigned Res = getOrCreateVReg(CI); + MIRBuilder.buildInstr(Opcode, {LLT{*CI.getDestTy()}, LLT{*CI.getSrcTy()}}, + Res, Op); + return true; +} + bool IRTranslator::translateStaticAlloca(const AllocaInst &AI) { assert(AI.isStaticAlloca() && "only handle static allocas now"); MachineFunction &MF = MIRBuilder.getMF(); @@ -138,6 +155,14 @@ bool IRTranslator::translate(const Instruction &Inst) { case Instruction::Ret: return translateReturn(Inst); + // Casts + case Instruction::BitCast: + return translateBitCast(cast<CastInst>(Inst)); + case Instruction::IntToPtr: + return translateCast(TargetOpcode::G_INTTOPTR, cast<CastInst>(Inst)); + case Instruction::PtrToInt: + return translateCast(TargetOpcode::G_PTRTOINT, cast<CastInst>(Inst)); + case Instruction::Alloca: return translateStaticAlloca(cast<AllocaInst>(Inst)); |