diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-07-26 19:36:28 +0000 |
commit | cfca06d7963fa0909f90483b42a6d7d194d01e08 (patch) | |
tree | 209fb2a2d68f8f277793fc8df46c753d31bc853b /llvm/lib/Target/ARM/ARMCallLowering.cpp | |
parent | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (diff) |
Notes
Diffstat (limited to 'llvm/lib/Target/ARM/ARMCallLowering.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMCallLowering.cpp | 57 |
1 files changed, 28 insertions, 29 deletions
diff --git a/llvm/lib/Target/ARM/ARMCallLowering.cpp b/llvm/lib/Target/ARM/ARMCallLowering.cpp index ce260a9ba1455..d860473011e77 100644 --- a/llvm/lib/Target/ARM/ARMCallLowering.cpp +++ b/llvm/lib/Target/ARM/ARMCallLowering.cpp @@ -99,17 +99,14 @@ struct OutgoingValueHandler : public CallLowering::ValueHandler { LLT p0 = LLT::pointer(0, 32); LLT s32 = LLT::scalar(32); - Register SPReg = MRI.createGenericVirtualRegister(p0); - MIRBuilder.buildCopy(SPReg, Register(ARM::SP)); + auto SPReg = MIRBuilder.buildCopy(p0, Register(ARM::SP)); - Register OffsetReg = MRI.createGenericVirtualRegister(s32); - MIRBuilder.buildConstant(OffsetReg, Offset); + auto OffsetReg = MIRBuilder.buildConstant(s32, Offset); - Register AddrReg = MRI.createGenericVirtualRegister(p0); - MIRBuilder.buildPtrAdd(AddrReg, SPReg, OffsetReg); + auto AddrReg = MIRBuilder.buildPtrAdd(p0, SPReg, OffsetReg); MPO = MachinePointerInfo::getStack(MIRBuilder.getMF(), Offset); - return AddrReg; + return AddrReg.getReg(0); } void assignValueToReg(Register ValVReg, Register PhysReg, @@ -133,7 +130,7 @@ struct OutgoingValueHandler : public CallLowering::ValueHandler { Register ExtReg = extendRegister(ValVReg, VA); auto MMO = MIRBuilder.getMF().getMachineMemOperand( MPO, MachineMemOperand::MOStore, VA.getLocVT().getStoreSize(), - /* Alignment */ 1); + Align(1)); MIRBuilder.buildStore(ExtReg, Addr, *MMO); } @@ -143,7 +140,10 @@ struct OutgoingValueHandler : public CallLowering::ValueHandler { CCValAssign VA = VAs[0]; assert(VA.needsCustom() && "Value doesn't need custom handling"); - assert(VA.getValVT() == MVT::f64 && "Unsupported type"); + + // Custom lowering for other types, such as f16, is currently not supported + if (VA.getValVT() != MVT::f64) + return 0; CCValAssign NextVA = VAs[1]; assert(NextVA.needsCustom() && "Value doesn't need custom handling"); @@ -203,7 +203,7 @@ void ARMCallLowering::splitToValueTypes(const ArgInfo &OrigArg, // Even if there is no splitting to do, we still want to replace the // original type (e.g. pointer type -> integer). auto Flags = OrigArg.Flags[0]; - Flags.setOrigAlign(Align(DL.getABITypeAlignment(OrigArg.Ty))); + Flags.setOrigAlign(DL.getABITypeAlign(OrigArg.Ty)); SplitArgs.emplace_back(OrigArg.Regs[0], SplitVTs[0].getTypeForEVT(Ctx), Flags, OrigArg.IsFixed); return; @@ -215,7 +215,7 @@ void ARMCallLowering::splitToValueTypes(const ArgInfo &OrigArg, Type *SplitTy = SplitVT.getTypeForEVT(Ctx); auto Flags = OrigArg.Flags[0]; - Flags.setOrigAlign(Align(DL.getABITypeAlignment(SplitTy))); + Flags.setOrigAlign(DL.getABITypeAlign(SplitTy)); bool NeedsConsecutiveRegisters = TLI.functionArgumentNeedsConsecutiveRegisters( @@ -299,11 +299,8 @@ struct IncomingValueHandler : public CallLowering::ValueHandler { int FI = MFI.CreateFixedObject(Size, Offset, true); MPO = MachinePointerInfo::getFixedStack(MIRBuilder.getMF(), FI); - Register AddrReg = - MRI.createGenericVirtualRegister(LLT::pointer(MPO.getAddrSpace(), 32)); - MIRBuilder.buildFrameIndex(AddrReg, FI); - - return AddrReg; + return MIRBuilder.buildFrameIndex(LLT::pointer(MPO.getAddrSpace(), 32), FI) + .getReg(0); } void assignValueToAddress(Register ValVReg, Register Addr, uint64_t Size, @@ -318,20 +315,21 @@ struct IncomingValueHandler : public CallLowering::ValueHandler { Size = 4; assert(MRI.getType(ValVReg).isScalar() && "Only scalars supported atm"); - auto LoadVReg = MRI.createGenericVirtualRegister(LLT::scalar(32)); - buildLoad(LoadVReg, Addr, Size, /* Alignment */ 1, MPO); + auto LoadVReg = buildLoad(LLT::scalar(32), Addr, Size, MPO); MIRBuilder.buildTrunc(ValVReg, LoadVReg); } else { // If the value is not extended, a simple load will suffice. - buildLoad(ValVReg, Addr, Size, /* Alignment */ 1, MPO); + buildLoad(ValVReg, Addr, Size, MPO); } } - void buildLoad(Register Val, Register Addr, uint64_t Size, unsigned Alignment, - MachinePointerInfo &MPO) { - auto MMO = MIRBuilder.getMF().getMachineMemOperand( - MPO, MachineMemOperand::MOLoad, Size, Alignment); - MIRBuilder.buildLoad(Val, Addr, *MMO); + MachineInstrBuilder buildLoad(const DstOp &Res, Register Addr, uint64_t Size, + MachinePointerInfo &MPO) { + MachineFunction &MF = MIRBuilder.getMF(); + + auto MMO = MF.getMachineMemOperand(MPO, MachineMemOperand::MOLoad, Size, + inferAlignFromPtrInfo(MF, MPO)); + return MIRBuilder.buildLoad(Res, Addr, *MMO); } void assignValueToReg(Register ValVReg, Register PhysReg, @@ -354,9 +352,7 @@ struct IncomingValueHandler : public CallLowering::ValueHandler { // We cannot create a truncating copy, nor a trunc of a physical register. // Therefore, we need to copy the content of the physical register into a // virtual one and then truncate that. - auto PhysRegToVReg = - MRI.createGenericVirtualRegister(LLT::scalar(LocSize)); - MIRBuilder.buildCopy(PhysRegToVReg, PhysReg); + auto PhysRegToVReg = MIRBuilder.buildCopy(LLT::scalar(LocSize), PhysReg); MIRBuilder.buildTrunc(ValVReg, PhysRegToVReg); } } @@ -367,7 +363,10 @@ struct IncomingValueHandler : public CallLowering::ValueHandler { CCValAssign VA = VAs[0]; assert(VA.needsCustom() && "Value doesn't need custom handling"); - assert(VA.getValVT() == MVT::f64 && "Unsupported type"); + + // Custom lowering for other types, such as f16, is currently not supported + if (VA.getValVT() != MVT::f64) + return 0; CCValAssign NextVA = VAs[1]; assert(NextVA.needsCustom() && "Value doesn't need custom handling"); @@ -436,7 +435,7 @@ bool ARMCallLowering::lowerFormalArguments( for (auto &Arg : F.args()) { if (!isSupportedType(DL, TLI, Arg.getType())) return false; - if (Arg.hasByValOrInAllocaAttr()) + if (Arg.hasPassPointeeByValueAttr()) return false; } |