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
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 82cec25..f7db60f 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -100,6 +100,23 @@
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 @@
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));