@@ -77,6 +77,54 @@ TEST_F(OpenACCOpsTest, asyncOnlyTest) {
7777 testAsyncOnly<SerialOp>(b, context, loc, dtypes);
7878}
7979
80+ template <typename Op>
81+ void testAsyncOnlyDataEntry (OpBuilder &b, MLIRContext &context, Location loc,
82+ llvm::SmallVector<DeviceType> &dtypes) {
83+ auto memrefTy = MemRefType::get ({}, b.getI32Type ());
84+ OwningOpRef<memref::AllocaOp> varPtrOp =
85+ b.create <memref::AllocaOp>(loc, memrefTy);
86+
87+ TypedValue<PointerLikeType> varPtr =
88+ cast<TypedValue<PointerLikeType>>(varPtrOp->getResult ());
89+ OwningOpRef<Op> op = b.create <Op>(loc, varPtr,
90+ /* structured=*/ true , /* implicit=*/ true );
91+
92+ EXPECT_FALSE (op->hasAsyncOnly ());
93+ for (auto d : dtypes)
94+ EXPECT_FALSE (op->hasAsyncOnly (d));
95+
96+ auto dtypeNone = DeviceTypeAttr::get (&context, DeviceType::None);
97+ op->setAsyncOnlyAttr (b.getArrayAttr ({dtypeNone}));
98+ EXPECT_TRUE (op->hasAsyncOnly ());
99+ EXPECT_TRUE (op->hasAsyncOnly (DeviceType::None));
100+ op->removeAsyncOnlyAttr ();
101+
102+ auto dtypeHost = DeviceTypeAttr::get (&context, DeviceType::Host);
103+ op->setAsyncOnlyAttr (b.getArrayAttr ({dtypeHost}));
104+ EXPECT_TRUE (op->hasAsyncOnly (DeviceType::Host));
105+ EXPECT_FALSE (op->hasAsyncOnly ());
106+ op->removeAsyncOnlyAttr ();
107+
108+ auto dtypeStar = DeviceTypeAttr::get (&context, DeviceType::Star);
109+ op->setAsyncOnlyAttr (b.getArrayAttr ({dtypeHost, dtypeStar}));
110+ EXPECT_TRUE (op->hasAsyncOnly (DeviceType::Star));
111+ EXPECT_TRUE (op->hasAsyncOnly (DeviceType::Host));
112+ EXPECT_FALSE (op->hasAsyncOnly ());
113+
114+ op->removeAsyncOnlyAttr ();
115+ }
116+
117+ TEST_F (OpenACCOpsTest, asyncOnlyTestDataEntry) {
118+ testAsyncOnlyDataEntry<DevicePtrOp>(b, context, loc, dtypes);
119+ testAsyncOnlyDataEntry<PresentOp>(b, context, loc, dtypes);
120+ testAsyncOnlyDataEntry<CopyinOp>(b, context, loc, dtypes);
121+ testAsyncOnlyDataEntry<CreateOp>(b, context, loc, dtypes);
122+ testAsyncOnlyDataEntry<NoCreateOp>(b, context, loc, dtypes);
123+ testAsyncOnlyDataEntry<AttachOp>(b, context, loc, dtypes);
124+ testAsyncOnlyDataEntry<UpdateDeviceOp>(b, context, loc, dtypes);
125+ testAsyncOnlyDataEntry<UseDeviceOp>(b, context, loc, dtypes);
126+ }
127+
80128template <typename Op>
81129void testAsyncValue (OpBuilder &b, MLIRContext &context, Location loc,
82130 llvm::SmallVector<DeviceType> &dtypes) {
@@ -105,6 +153,46 @@ TEST_F(OpenACCOpsTest, asyncValueTest) {
105153 testAsyncValue<SerialOp>(b, context, loc, dtypes);
106154}
107155
156+ template <typename Op>
157+ void testAsyncValueDataEntry (OpBuilder &b, MLIRContext &context, Location loc,
158+ llvm::SmallVector<DeviceType> &dtypes) {
159+ auto memrefTy = MemRefType::get ({}, b.getI32Type ());
160+ OwningOpRef<memref::AllocaOp> varPtrOp =
161+ b.create <memref::AllocaOp>(loc, memrefTy);
162+
163+ TypedValue<PointerLikeType> varPtr =
164+ cast<TypedValue<PointerLikeType>>(varPtrOp->getResult ());
165+ OwningOpRef<Op> op = b.create <Op>(loc, varPtr,
166+ /* structured=*/ true , /* implicit=*/ true );
167+
168+ mlir::Value empty;
169+ EXPECT_EQ (op->getAsyncValue (), empty);
170+ for (auto d : dtypes)
171+ EXPECT_EQ (op->getAsyncValue (d), empty);
172+
173+ OwningOpRef<arith::ConstantIndexOp> val =
174+ b.create <arith::ConstantIndexOp>(loc, 1 );
175+ auto dtypeNvidia = DeviceTypeAttr::get (&context, DeviceType::Nvidia);
176+ op->setAsyncOperandsDeviceTypeAttr (b.getArrayAttr ({dtypeNvidia}));
177+ op->getAsyncOperandsMutable ().assign (val->getResult ());
178+ EXPECT_EQ (op->getAsyncValue (), empty);
179+ EXPECT_EQ (op->getAsyncValue (DeviceType::Nvidia), val->getResult ());
180+
181+ op->getAsyncOperandsMutable ().clear ();
182+ op->removeAsyncOperandsDeviceTypeAttr ();
183+ }
184+
185+ TEST_F (OpenACCOpsTest, asyncValueTestDataEntry) {
186+ testAsyncValueDataEntry<DevicePtrOp>(b, context, loc, dtypes);
187+ testAsyncValueDataEntry<PresentOp>(b, context, loc, dtypes);
188+ testAsyncValueDataEntry<CopyinOp>(b, context, loc, dtypes);
189+ testAsyncValueDataEntry<CreateOp>(b, context, loc, dtypes);
190+ testAsyncValueDataEntry<NoCreateOp>(b, context, loc, dtypes);
191+ testAsyncValueDataEntry<AttachOp>(b, context, loc, dtypes);
192+ testAsyncValueDataEntry<UpdateDeviceOp>(b, context, loc, dtypes);
193+ testAsyncValueDataEntry<UseDeviceOp>(b, context, loc, dtypes);
194+ }
195+
108196template <typename Op>
109197void testNumGangsValues (OpBuilder &b, MLIRContext &context, Location loc,
110198 llvm::SmallVector<DeviceType> &dtypes,
0 commit comments