diff options
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 54 | 
1 files changed, 54 insertions, 0 deletions
| diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index 9ce7fe4a2cc..6a8712e184b 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -52,6 +52,21 @@ unsigned IRTranslator::getOrCreateVReg(const Value &Val) {    return ValReg;  } +unsigned IRTranslator::getMemOpAlignment(const Instruction &I) { +  unsigned Alignment = 0; +  Type *ValTy = nullptr; +  if (const StoreInst *SI = dyn_cast<StoreInst>(&I)) { +    Alignment = SI->getAlignment(); +    ValTy = SI->getValueOperand()->getType(); +  } else if (const LoadInst *LI = dyn_cast<LoadInst>(&I)) { +    Alignment = LI->getAlignment(); +    ValTy = LI->getType(); +  } else +    llvm_unreachable("unhandled memory instruction"); + +  return Alignment ? Alignment : DL->getABITypeAlignment(ValTy); +} +  MachineBasicBlock &IRTranslator::getOrCreateBB(const BasicBlock &BB) {    MachineBasicBlock *&MBB = BBToMBB[&BB];    if (!MBB) { @@ -100,6 +115,39 @@ bool IRTranslator::translateBr(const Instruction &Inst) {    return true;  } +bool IRTranslator::translateLoad(const LoadInst &LI) { +  assert(LI.isSimple() && "only simple loads are supported at the moment"); + +  MachineFunction &MF = MIRBuilder.getMF(); +  unsigned Res = getOrCreateVReg(LI); +  unsigned Addr = getOrCreateVReg(*LI.getPointerOperand()); +  LLT VTy{*LI.getType()}, PTy{*LI.getPointerOperand()->getType()}; + +  MIRBuilder.buildLoad( +      VTy, PTy, Res, Addr, +      *MF.getMachineMemOperand(MachinePointerInfo(LI.getPointerOperand()), +                               MachineMemOperand::MOLoad, +                               VTy.getSizeInBits() / 8, getMemOpAlignment(LI))); +  return true; +} + +bool IRTranslator::translateStore(const StoreInst &SI) { +  assert(SI.isSimple() && "only simple loads are supported at the moment"); + +  MachineFunction &MF = MIRBuilder.getMF(); +  unsigned Val = getOrCreateVReg(*SI.getValueOperand()); +  unsigned Addr = getOrCreateVReg(*SI.getPointerOperand()); +  LLT VTy{*SI.getValueOperand()->getType()}, +      PTy{*SI.getPointerOperand()->getType()}; + +  MIRBuilder.buildStore( +      VTy, PTy, Val, Addr, +      *MF.getMachineMemOperand(MachinePointerInfo(SI.getPointerOperand()), +                               MachineMemOperand::MOStore, +                               VTy.getSizeInBits() / 8, getMemOpAlignment(SI))); +  return true; +} +  bool IRTranslator::translateBitCast(const CastInst &CI) {    if (LLT{*CI.getDestTy()} == LLT{*CI.getSrcTy()}) {      MIRBuilder.buildCopy(getOrCreateVReg(CI), @@ -163,6 +211,12 @@ bool IRTranslator::translate(const Instruction &Inst) {    case Instruction::PtrToInt:      return translateCast(TargetOpcode::G_PTRTOINT, cast<CastInst>(Inst)); +  // Memory ops. +  case Instruction::Load: +    return translateLoad(cast<LoadInst>(Inst)); +  case Instruction::Store: +    return translateStore(cast<StoreInst>(Inst)); +    case Instruction::Alloca:      return translateStaticAlloca(cast<AllocaInst>(Inst)); | 

