[llvm-branch-commits] [llvm] [AMDGPU] Codegen support for constrained multi-dword sloads (PR #96163)
Jay Foad via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Jul 10 06:30:36 PDT 2024
================
@@ -866,13 +866,61 @@ def SMRDBufferImm : ComplexPattern<iPTR, 1, "SelectSMRDBufferImm">;
def SMRDBufferImm32 : ComplexPattern<iPTR, 1, "SelectSMRDBufferImm32">;
def SMRDBufferSgprImm : ComplexPattern<iPTR, 2, "SelectSMRDBufferSgprImm">;
+class SMRDAlignedLoadPat<PatFrag Op> : PatFrag <(ops node:$ptr), (Op node:$ptr), [{
+ // Ignore the alignment check if XNACK support is disabled.
+ if (!Subtarget->isXNACKEnabled())
+ return true;
+
+ // Returns true if it is a single dword load or naturally aligned multi-dword load.
+ LoadSDNode *Ld = cast<LoadSDNode>(N);
+ unsigned Size = Ld->getMemoryVT().getStoreSize();
+ return Size <= 4 || Ld->getAlign().value() >= Size;
+}]> {
+ let GISelPredicateCode = [{
+ if (!Subtarget->isXNACKEnabled())
+ return true;
+
+ auto &Ld = cast<GLoad>(MI);
+ TypeSize Size = Ld.getMMO().getSize().getValue();
+ return Size <= 4 || Ld.getMMO().getAlign().value() >= Size;
+ }];
+}
+
+class SMRDUnalignedLoadPat<PatFrag Op> : PatFrag <(ops node:$ptr), (Op node:$ptr), [{
----------------
jayfoad wrote:
I don't think you need this class at all, since the _ec forms should work in all cases. It's just an optimization to prefer the non-_ec forms when the load is suitable aligned, and you can handle that with DAG pattern priority (maybe by setting AddedComplexity).
https://github.com/llvm/llvm-project/pull/96163
More information about the llvm-branch-commits
mailing list