Index: llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp =================================================================== --- llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp +++ llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp @@ -146,8 +146,12 @@ return AddrReg.getReg(0); } - LLT getStackValueStoreType(const DataLayout &, const CCValAssign &VA, + LLT getStackValueStoreType(const DataLayout &DL, const CCValAssign &VA, ISD::ArgFlagsTy Flags) const override { + // For pointers, we just need to fixup the integer types reported in the + // CCValAssign. + if (Flags.isPointer()) + return CallLowering::ValueHandler::getStackValueStoreType(DL, VA, Flags); return getStackValueStoreTypeHack(VA); } @@ -167,6 +171,12 @@ // Fixup the types for the DAG compatibility hack. if (VA.getValVT() == MVT::i8 || VA.getValVT() == MVT::i16) std::swap(ValTy, LocTy); + else { + // The calling code knows if this is a pointer or not, we're only touching + // the LocTy for the i8/i16 hack. + assert(LocTy.getSizeInBits() == MemTy.getSizeInBits()); + LocTy = MemTy; + } auto MMO = MF.getMachineMemOperand( MPO, MachineMemOperand::MOLoad | MachineMemOperand::MOInvariant, LocTy, @@ -252,8 +262,10 @@ /// we invert the interpretation of ValVT and LocVT in certain cases. This is /// for compatability with the DAG call lowering implementation, which we're /// currently building on top of. - LLT getStackValueStoreType(const DataLayout &, const CCValAssign &VA, + LLT getStackValueStoreType(const DataLayout &DL, const CCValAssign &VA, ISD::ArgFlagsTy Flags) const override { + if (Flags.isPointer()) + return CallLowering::ValueHandler::getStackValueStoreType(DL, VA, Flags); return getStackValueStoreTypeHack(VA); } Index: llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp =================================================================== --- llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp +++ llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp @@ -964,6 +964,8 @@ return true; } +// FIXME: This should be removed and replaced with the generic bitcast legalize +// action. bool AArch64LegalizerInfo::legalizeLoadStore( MachineInstr &MI, MachineRegisterInfo &MRI, MachineIRBuilder &MIRBuilder, GISelChangeObserver &Observer) const { @@ -990,6 +992,8 @@ unsigned PtrSize = ValTy.getElementType().getSizeInBits(); const LLT NewTy = LLT::vector(ValTy.getElementCount(), PtrSize); auto &MMO = **MI.memoperands_begin(); + MMO.setType(NewTy); + if (MI.getOpcode() == TargetOpcode::G_STORE) { auto Bitcast = MIRBuilder.buildBitcast(NewTy, ValReg); MIRBuilder.buildStore(Bitcast.getReg(0), MI.getOperand(1), MMO); Index: llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll =================================================================== --- llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll +++ llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll @@ -217,7 +217,7 @@ ; CHECK: [[RHS_ADDR:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.[[STACK8]] ; CHECK: [[RHS:%[0-9]+]]:_(s64) = G_LOAD [[RHS_ADDR]](p0) :: (invariant load (s64) from %fixed-stack.[[STACK8]]) ; CHECK: [[ADDR_ADDR:%[0-9]+]]:_(p0) = G_FRAME_INDEX %fixed-stack.[[STACK16]] -; CHECK: [[ADDR:%[0-9]+]]:_(p0) = G_LOAD [[ADDR_ADDR]](p0) :: (invariant load (s64) from %fixed-stack.[[STACK16]], align 16) +; CHECK: [[ADDR:%[0-9]+]]:_(p0) = G_LOAD [[ADDR_ADDR]](p0) :: (invariant load (p0) from %fixed-stack.[[STACK16]], align 16) ; CHECK: [[SUM:%[0-9]+]]:_(s64) = G_ADD [[LHS]], [[RHS]] ; CHECK: G_STORE [[SUM]](s64), [[ADDR]](p0) define void @test_stack_slots([8 x i64], i64 %lhs, i64 %rhs, i64* %addr) { @@ -240,7 +240,7 @@ ; CHECK: G_STORE [[C12]](s64), [[C12_LOC]](p0) :: (store (s64) into stack + 8, align 1) ; CHECK: [[PTR_OFFS:%[0-9]+]]:_(s64) = G_CONSTANT i64 16 ; CHECK: [[PTR_LOC:%[0-9]+]]:_(p0) = G_PTR_ADD [[SP]], [[PTR_OFFS]](s64) -; CHECK: G_STORE [[PTR]](p0), [[PTR_LOC]](p0) :: (store (s64) into stack + 16, align 1) +; CHECK: G_STORE [[PTR]](p0), [[PTR_LOC]](p0) :: (store (p0) into stack + 16, align 1) ; CHECK: BL @test_stack_slots ; CHECK: ADJCALLSTACKUP 24, 0, implicit-def $sp, implicit $sp define void @test_call_stack() { Index: llvm/test/CodeGen/AArch64/GlobalISel/legalize-load-store-vector-of-ptr.mir =================================================================== --- llvm/test/CodeGen/AArch64/GlobalISel/legalize-load-store-vector-of-ptr.mir +++ llvm/test/CodeGen/AArch64/GlobalISel/legalize-load-store-vector-of-ptr.mir @@ -32,7 +32,7 @@ ; CHECK: [[COPY:%[0-9]+]]:_(<2 x p0>) = COPY $q0 ; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x0 ; CHECK: [[BITCAST:%[0-9]+]]:_(<2 x s64>) = G_BITCAST [[COPY]](<2 x p0>) - ; CHECK: G_STORE [[BITCAST]](<2 x s64>), [[COPY1]](p0) :: (store (<2 x p0>) into %ir.ptr) + ; CHECK: G_STORE [[BITCAST]](<2 x s64>), [[COPY1]](p0) :: (store (<2 x s64>) into %ir.ptr) ; CHECK: RET_ReallyLR %0:_(<2 x p0>) = COPY $q0 %1:_(p0) = COPY $x0 @@ -52,7 +52,7 @@ ; CHECK-LABEL: name: load_v2p0 ; CHECK: liveins: $x0 ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0 - ; CHECK: [[LOAD:%[0-9]+]]:_(<2 x s64>) = G_LOAD [[COPY]](p0) :: (load (<2 x p0>) from %ir.ptr) + ; CHECK: [[LOAD:%[0-9]+]]:_(<2 x s64>) = G_LOAD [[COPY]](p0) :: (load (<2 x s64>) from %ir.ptr) ; CHECK: [[BITCAST:%[0-9]+]]:_(<2 x p0>) = G_BITCAST [[LOAD]](<2 x s64>) ; CHECK: $q0 = COPY [[BITCAST]](<2 x p0>) ; CHECK: RET_ReallyLR implicit $q0