@@ -818,6 +818,14 @@ def smrd_load : PatFrag <(ops node:$ptr), (load node:$ptr), [{ return isUniformL
818818 }];
819819}
820820
821+ def smrd_prefetch : PatFrag <(ops node:$ptr, node:$rw, node:$loc, node:$type),
822+ (prefetch node:$ptr, node:$rw, node:$loc, node:$type),
823+ [{ return !N->getOperand(1)->isDivergent();}]> {
824+ let GISelPredicateCode = [{
825+ return isInstrUniform(MI);
826+ }];
827+ }
828+
821829def SMRDImm : ComplexPattern<iPTR, 2, "SelectSMRDImm">;
822830def SMRDImm32 : ComplexPattern<iPTR, 2, "SelectSMRDImm32">;
823831def SMRDSgpr : ComplexPattern<iPTR, 2, "SelectSMRDSgpr">;
@@ -969,6 +977,21 @@ def : GCNPat <
969977}
970978} // let OtherPredicates = [HasShaderCyclesRegister]
971979
980+ multiclass SMPrefetchPat<string type, int cache_type> {
981+ def : GCNPat <
982+ (smrd_prefetch (SMRDImm i64:$sbase, i32:$offset), timm, timm, (i32 cache_type)),
983+ (!cast<SM_Prefetch_Pseudo>("S_PREFETCH_"#type) $sbase, $offset, (i32 SGPR_NULL), (i8 0))
984+ >;
985+
986+ def : GCNPat <
987+ (smrd_prefetch (i64 SReg_64:$sbase), timm, timm, (i32 cache_type)),
988+ (!cast<SM_Prefetch_Pseudo>("S_PREFETCH_"#type) $sbase, 0, (i32 SGPR_NULL), (i8 0))
989+ >;
990+ }
991+
992+ defm : SMPrefetchPat<"INST", 0>;
993+ defm : SMPrefetchPat<"DATA", 1>;
994+
972995//===----------------------------------------------------------------------===//
973996// GFX10.
974997//===----------------------------------------------------------------------===//
0 commit comments