mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-26 23:21:11 +00:00
[AMDGPU] Produce better memoperand for LDS DMA (#75247)
1) It was marked as volatile. This is not needed and the only reason it was done is because it is both load and store and handled together with atomics. Global load to LDS was marked as volatile just because buffer load was done that way. 2) Preserve at least LDS (store) pointer which we always have with the intrinsics. 3) Use PoisonValue instead of nullptr for load memop as a Value.
This commit is contained in:
parent
94230ce548
commit
e5c523e861
@ -1145,11 +1145,10 @@ bool SITargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
|
||||
MachineMemOperand::MOStore |
|
||||
MachineMemOperand::MODereferenceable;
|
||||
|
||||
// XXX - Should this be volatile without known ordering?
|
||||
Info.flags |= MachineMemOperand::MOVolatile;
|
||||
|
||||
switch (IntrID) {
|
||||
default:
|
||||
// XXX - Should this be volatile without known ordering?
|
||||
Info.flags |= MachineMemOperand::MOVolatile;
|
||||
break;
|
||||
case Intrinsic::amdgcn_raw_buffer_load_lds:
|
||||
case Intrinsic::amdgcn_raw_ptr_buffer_load_lds:
|
||||
@ -1157,6 +1156,7 @@ bool SITargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
|
||||
case Intrinsic::amdgcn_struct_ptr_buffer_load_lds: {
|
||||
unsigned Width = cast<ConstantInt>(CI.getArgOperand(2))->getZExtValue();
|
||||
Info.memVT = EVT::getIntegerVT(CI.getContext(), Width * 8);
|
||||
Info.ptrVal = CI.getArgOperand(1);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@ -1289,8 +1289,8 @@ bool SITargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
|
||||
Info.opc = ISD::INTRINSIC_VOID;
|
||||
unsigned Width = cast<ConstantInt>(CI.getArgOperand(2))->getZExtValue();
|
||||
Info.memVT = EVT::getIntegerVT(CI.getContext(), Width * 8);
|
||||
Info.flags |= MachineMemOperand::MOLoad | MachineMemOperand::MOStore |
|
||||
MachineMemOperand::MOVolatile;
|
||||
Info.ptrVal = CI.getArgOperand(1);
|
||||
Info.flags |= MachineMemOperand::MOLoad | MachineMemOperand::MOStore;
|
||||
return true;
|
||||
}
|
||||
case Intrinsic::amdgcn_ds_bvh_stack_rtn: {
|
||||
@ -9231,7 +9231,9 @@ SDValue SITargetLowering::LowerINTRINSIC_VOID(SDValue Op,
|
||||
MachinePointerInfo LoadPtrI = LoadMMO->getPointerInfo();
|
||||
|
||||
MachinePointerInfo StorePtrI = LoadPtrI;
|
||||
StorePtrI.V = nullptr;
|
||||
LoadPtrI.V = PoisonValue::get(
|
||||
PointerType::get(*DAG.getContext(), AMDGPUAS::GLOBAL_ADDRESS));
|
||||
LoadPtrI.AddrSpace = AMDGPUAS::GLOBAL_ADDRESS;
|
||||
StorePtrI.AddrSpace = AMDGPUAS::LOCAL_ADDRESS;
|
||||
|
||||
auto F = LoadMMO->getFlags() &
|
||||
@ -9309,6 +9311,8 @@ SDValue SITargetLowering::LowerINTRINSIC_VOID(SDValue Op,
|
||||
MachinePointerInfo LoadPtrI = LoadMMO->getPointerInfo();
|
||||
LoadPtrI.Offset = Op->getConstantOperandVal(5);
|
||||
MachinePointerInfo StorePtrI = LoadPtrI;
|
||||
LoadPtrI.V = PoisonValue::get(
|
||||
PointerType::get(*DAG.getContext(), AMDGPUAS::GLOBAL_ADDRESS));
|
||||
LoadPtrI.AddrSpace = AMDGPUAS::GLOBAL_ADDRESS;
|
||||
StorePtrI.AddrSpace = AMDGPUAS::LOCAL_ADDRESS;
|
||||
auto F = LoadMMO->getFlags() &
|
||||
|
Loading…
Reference in New Issue
Block a user