Skip to content

Commit 6a6b99a

Browse files
[acc][flang][cir] Add recipes to data entry operations (llvm#149210)
This patch refactors the OpenACC dialect to attach recipe symbols directly to data operations (acc.private, acc.firstprivate, acc.reduction) rather than to compute constructs (acc.parallel, acc.serial, acc.loop). Motivation: The previous design required compute constructs to carry both the recipe symbol and the variable reference, leading to complexity. Additionally, recipes were required even when they could be generated automatically through MappableType interfaces. Changes: - Data operations (acc.private, acc.firstprivate, acc.reduction) now require a 'recipe' attribute referencing their respective recipe operations - Verifier enforces recipe attribute presence for non-MappableType operands; MappableType operands can generate recipes on demand - Compute constructs (acc.parallel, acc.serial, acc.loop) no longer carry recipe symbols in their operands - Updated flang lowering to attach recipes to data operations instead of passing them to compute constructs Format Migration: Old format: ``` acc.parallel private(@recipe -> %var : !fir.ref<i32>) { ... } ``` New format: ``` %private = acc.private varPtr(%var : !fir.ref<i32>) recipe(@recipe) -> !fir.ref<i32> acc.parallel private(%private : !fir.ref<i32>) { ... } ``` Test Updates: - Updated all CIR and Flang OpenACC tests to new format - Fixed CHECK lines to verify recipe attributes on data operations
1 parent 44cffbe commit 6a6b99a

40 files changed

+1126
-1161
lines changed

clang/test/CIR/CodeGenOpenACC/combined-firstprivate-clause.cpp

Lines changed: 72 additions & 72 deletions
Large diffs are not rendered by default.

clang/test/CIR/CodeGenOpenACC/combined-private-clause.cpp

Lines changed: 72 additions & 72 deletions
Large diffs are not rendered by default.

clang/test/CIR/CodeGenOpenACC/compute-firstprivate-clause-templates.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,18 +71,18 @@ void dependent_version(const T &cc, const U &ndc, const V &dtor, const W &someIn
7171
#pragma acc parallel firstprivate(cc, ndc, dtor, someInt)
7272
;
7373
// CHECK: %[[PRIV_LOAD:.*]] = cir.load %[[CC]] : !cir.ptr<!cir.ptr<!rec_CopyConstruct>>, !cir.ptr<!rec_CopyConstruct>
74-
// CHECK-NEXT: %[[PRIVATE1:.*]] = acc.firstprivate varPtr(%[[PRIV_LOAD]] : !cir.ptr<!rec_CopyConstruct>) -> !cir.ptr<!rec_CopyConstruct> {name = "cc"}
74+
// CHECK-NEXT: %[[PRIVATE1:.*]] = acc.firstprivate varPtr(%[[PRIV_LOAD]] : !cir.ptr<!rec_CopyConstruct>) recipe(@firstprivatization__ZTS13CopyConstruct) -> !cir.ptr<!rec_CopyConstruct> {name = "cc"}
7575
// CHECK-NEXT: %[[PRIV_LOAD:.*]] = cir.load %[[NDC]] : !cir.ptr<!cir.ptr<!rec_NonDefaultCtor>>, !cir.ptr<!rec_NonDefaultCtor>
76-
// CHECK-NEXT: %[[PRIVATE2:.*]] = acc.firstprivate varPtr(%[[PRIV_LOAD]] : !cir.ptr<!rec_NonDefaultCtor>) -> !cir.ptr<!rec_NonDefaultCtor> {name = "ndc"}
76+
// CHECK-NEXT: %[[PRIVATE2:.*]] = acc.firstprivate varPtr(%[[PRIV_LOAD]] : !cir.ptr<!rec_NonDefaultCtor>) recipe(@firstprivatization__ZTS14NonDefaultCtor) -> !cir.ptr<!rec_NonDefaultCtor> {name = "ndc"}
7777
// CHECK-NEXT: %[[PRIV_LOAD:.*]] = cir.load %[[DTOR]] : !cir.ptr<!cir.ptr<!rec_HasDtor>>, !cir.ptr<!rec_HasDtor>
78-
// CHECK-NEXT: %[[PRIVATE3:.*]] = acc.firstprivate varPtr(%[[PRIV_LOAD]] : !cir.ptr<!rec_HasDtor>) -> !cir.ptr<!rec_HasDtor> {name = "dtor"}
78+
// CHECK-NEXT: %[[PRIVATE3:.*]] = acc.firstprivate varPtr(%[[PRIV_LOAD]] : !cir.ptr<!rec_HasDtor>) recipe(@firstprivatization__ZTS7HasDtor) -> !cir.ptr<!rec_HasDtor> {name = "dtor"}
7979
// CHECK-NEXT: %[[PRIV_LOAD:.*]] = cir.load %[[SOMEINT]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
80-
// CHECK-NEXT: %[[PRIVATE4:.*]] = acc.firstprivate varPtr(%[[PRIV_LOAD]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {name = "someInt"}
80+
// CHECK-NEXT: %[[PRIVATE4:.*]] = acc.firstprivate varPtr(%[[PRIV_LOAD]] : !cir.ptr<!s32i>) recipe(@firstprivatization__ZTSi) -> !cir.ptr<!s32i> {name = "someInt"}
8181

82-
// CHECK-NEXT: acc.parallel firstprivate(@firstprivatization__ZTS13CopyConstruct -> %[[PRIVATE1]] : !cir.ptr<!rec_CopyConstruct>,
83-
// CHECK-SAME: @firstprivatization__ZTS14NonDefaultCtor -> %[[PRIVATE2]] : !cir.ptr<!rec_NonDefaultCtor>,
84-
// CHECK-SAME: @firstprivatization__ZTS7HasDtor -> %[[PRIVATE3]] : !cir.ptr<!rec_HasDtor>,
85-
// CHECK-SAME: @firstprivatization__ZTSi -> %[[PRIVATE4]] : !cir.ptr<!s32i>) {
82+
// CHECK-NEXT: acc.parallel firstprivate(%[[PRIVATE1]], %[[PRIVATE2]], %[[PRIVATE3]], %[[PRIVATE4]] : !cir.ptr<!rec_CopyConstruct>,
83+
// CHECK-SAME: !cir.ptr<!rec_NonDefaultCtor>,
84+
// CHECK-SAME: !cir.ptr<!rec_HasDtor>,
85+
// CHECK-SAME: !cir.ptr<!s32i>) {
8686
// CHECK-NEXT: acc.yield
8787
// CHECK-NEXT: } loc
8888
}

clang/test/CIR/CodeGenOpenACC/compute-firstprivate-clause.c

Lines changed: 36 additions & 36 deletions
Large diffs are not rendered by default.

clang/test/CIR/CodeGenOpenACC/compute-firstprivate-clause.cpp

Lines changed: 72 additions & 72 deletions
Large diffs are not rendered by default.

clang/test/CIR/CodeGenOpenACC/compute-private-clause-templates.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,18 @@ void dependent_version(const T &cc, const U &ndc, const V &dtor, const W &someIn
5454
#pragma acc parallel private(cc, ndc, dtor, someInt)
5555
;
5656
// CHECK: %[[PRIV_LOAD:.*]] = cir.load %[[CC]] : !cir.ptr<!cir.ptr<!rec_CopyConstruct>>, !cir.ptr<!rec_CopyConstruct>
57-
// CHECK-NEXT: %[[PRIVATE1:.*]] = acc.private varPtr(%[[PRIV_LOAD]] : !cir.ptr<!rec_CopyConstruct>) -> !cir.ptr<!rec_CopyConstruct> {name = "cc"}
57+
// CHECK-NEXT: %[[PRIVATE1:.*]] = acc.private varPtr(%[[PRIV_LOAD]] : !cir.ptr<!rec_CopyConstruct>) recipe(@privatization__ZTS13CopyConstruct) -> !cir.ptr<!rec_CopyConstruct> {name = "cc"}
5858
// CHECK-NEXT: %[[PRIV_LOAD:.*]] = cir.load %[[NDC]] : !cir.ptr<!cir.ptr<!rec_NonDefaultCtor>>, !cir.ptr<!rec_NonDefaultCtor>
59-
// CHECK-NEXT: %[[PRIVATE2:.*]] = acc.private varPtr(%[[PRIV_LOAD]] : !cir.ptr<!rec_NonDefaultCtor>) -> !cir.ptr<!rec_NonDefaultCtor> {name = "ndc"}
59+
// CHECK-NEXT: %[[PRIVATE2:.*]] = acc.private varPtr(%[[PRIV_LOAD]] : !cir.ptr<!rec_NonDefaultCtor>) recipe(@privatization__ZTS14NonDefaultCtor) -> !cir.ptr<!rec_NonDefaultCtor> {name = "ndc"}
6060
// CHECK-NEXT: %[[PRIV_LOAD:.*]] = cir.load %[[DTOR]] : !cir.ptr<!cir.ptr<!rec_HasDtor>>, !cir.ptr<!rec_HasDtor>
61-
// CHECK-NEXT: %[[PRIVATE3:.*]] = acc.private varPtr(%[[PRIV_LOAD]] : !cir.ptr<!rec_HasDtor>) -> !cir.ptr<!rec_HasDtor> {name = "dtor"}
61+
// CHECK-NEXT: %[[PRIVATE3:.*]] = acc.private varPtr(%[[PRIV_LOAD]] : !cir.ptr<!rec_HasDtor>) recipe(@privatization__ZTS7HasDtor) -> !cir.ptr<!rec_HasDtor> {name = "dtor"}
6262
// CHECK-NEXT: %[[PRIV_LOAD:.*]] = cir.load %[[SOMEINT]] : !cir.ptr<!cir.ptr<!s32i>>, !cir.ptr<!s32i>
63-
// CHECK-NEXT: %[[PRIVATE4:.*]] = acc.private varPtr(%[[PRIV_LOAD]] : !cir.ptr<!s32i>) -> !cir.ptr<!s32i> {name = "someInt"}
63+
// CHECK-NEXT: %[[PRIVATE4:.*]] = acc.private varPtr(%[[PRIV_LOAD]] : !cir.ptr<!s32i>) recipe(@privatization__ZTSi) -> !cir.ptr<!s32i> {name = "someInt"}
6464

65-
// CHECK-NEXT: acc.parallel private(@privatization__ZTS13CopyConstruct -> %[[PRIVATE1]] : !cir.ptr<!rec_CopyConstruct>,
66-
// CHECK-SAME: @privatization__ZTS14NonDefaultCtor -> %[[PRIVATE2]] : !cir.ptr<!rec_NonDefaultCtor>,
67-
// CHECK-SAME: @privatization__ZTS7HasDtor -> %[[PRIVATE3]] : !cir.ptr<!rec_HasDtor>,
68-
// CHECK-SAME: @privatization__ZTSi -> %[[PRIVATE4]] : !cir.ptr<!s32i>) {
65+
// CHECK-NEXT: acc.parallel private(%[[PRIVATE1]], %[[PRIVATE2]], %[[PRIVATE3]], %[[PRIVATE4]] : !cir.ptr<!rec_CopyConstruct>,
66+
// CHECK-SAME: !cir.ptr<!rec_NonDefaultCtor>,
67+
// CHECK-SAME: !cir.ptr<!rec_HasDtor>,
68+
// CHECK-SAME: !cir.ptr<!s32i>) {
6969
// CHECK-NEXT: acc.yield
7070
// CHECK-NEXT: } loc
7171
}

0 commit comments

Comments
 (0)