1e7145dcbSDimitry Andric //===-- MPIFunctionClassifier.cpp - classifies MPI functions ----*- C++ -*-===//
2e7145dcbSDimitry Andric //
3e7145dcbSDimitry Andric //                     The LLVM Compiler Infrastructure
4e7145dcbSDimitry Andric //
5e7145dcbSDimitry Andric // This file is distributed under the University of Illinois Open Source
6e7145dcbSDimitry Andric // License. See LICENSE.TXT for details.
7e7145dcbSDimitry Andric //
8e7145dcbSDimitry Andric //===----------------------------------------------------------------------===//
9e7145dcbSDimitry Andric ///
10e7145dcbSDimitry Andric /// \file
11e7145dcbSDimitry Andric /// This file defines functionality to identify and classify MPI functions.
12e7145dcbSDimitry Andric ///
13e7145dcbSDimitry Andric //===----------------------------------------------------------------------===//
14e7145dcbSDimitry Andric 
15*44290647SDimitry Andric #include "clang/StaticAnalyzer/Checkers/MPIFunctionClassifier.h"
16e7145dcbSDimitry Andric #include "llvm/ADT/STLExtras.h"
17e7145dcbSDimitry Andric 
18e7145dcbSDimitry Andric namespace clang {
19e7145dcbSDimitry Andric namespace ento {
20e7145dcbSDimitry Andric namespace mpi {
21e7145dcbSDimitry Andric 
identifierInit(ASTContext & ASTCtx)22e7145dcbSDimitry Andric void MPIFunctionClassifier::identifierInit(ASTContext &ASTCtx) {
23e7145dcbSDimitry Andric   // Initialize function identifiers.
24e7145dcbSDimitry Andric   initPointToPointIdentifiers(ASTCtx);
25e7145dcbSDimitry Andric   initCollectiveIdentifiers(ASTCtx);
26e7145dcbSDimitry Andric   initAdditionalIdentifiers(ASTCtx);
27e7145dcbSDimitry Andric }
28e7145dcbSDimitry Andric 
initPointToPointIdentifiers(ASTContext & ASTCtx)29e7145dcbSDimitry Andric void MPIFunctionClassifier::initPointToPointIdentifiers(ASTContext &ASTCtx) {
30e7145dcbSDimitry Andric   // Copy identifiers into the correct classification containers.
31e7145dcbSDimitry Andric   IdentInfo_MPI_Send = &ASTCtx.Idents.get("MPI_Send");
32e7145dcbSDimitry Andric   MPIPointToPointTypes.push_back(IdentInfo_MPI_Send);
33e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Send);
34e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Send);
35e7145dcbSDimitry Andric 
36e7145dcbSDimitry Andric   IdentInfo_MPI_Isend = &ASTCtx.Idents.get("MPI_Isend");
37e7145dcbSDimitry Andric   MPIPointToPointTypes.push_back(IdentInfo_MPI_Isend);
38e7145dcbSDimitry Andric   MPINonBlockingTypes.push_back(IdentInfo_MPI_Isend);
39e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Isend);
40e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Isend);
41e7145dcbSDimitry Andric 
42e7145dcbSDimitry Andric   IdentInfo_MPI_Ssend = &ASTCtx.Idents.get("MPI_Ssend");
43e7145dcbSDimitry Andric   MPIPointToPointTypes.push_back(IdentInfo_MPI_Ssend);
44e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Ssend);
45e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Ssend);
46e7145dcbSDimitry Andric 
47e7145dcbSDimitry Andric   IdentInfo_MPI_Issend = &ASTCtx.Idents.get("MPI_Issend");
48e7145dcbSDimitry Andric   MPIPointToPointTypes.push_back(IdentInfo_MPI_Issend);
49e7145dcbSDimitry Andric   MPINonBlockingTypes.push_back(IdentInfo_MPI_Issend);
50e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Issend);
51e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Issend);
52e7145dcbSDimitry Andric 
53e7145dcbSDimitry Andric   IdentInfo_MPI_Bsend = &ASTCtx.Idents.get("MPI_Bsend");
54e7145dcbSDimitry Andric   MPIPointToPointTypes.push_back(IdentInfo_MPI_Bsend);
55e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Bsend);
56e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Bsend);
57e7145dcbSDimitry Andric 
58e7145dcbSDimitry Andric   IdentInfo_MPI_Ibsend = &ASTCtx.Idents.get("MPI_Ibsend");
59e7145dcbSDimitry Andric   MPIPointToPointTypes.push_back(IdentInfo_MPI_Ibsend);
60e7145dcbSDimitry Andric   MPINonBlockingTypes.push_back(IdentInfo_MPI_Ibsend);
61e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Ibsend);
62e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Ibsend);
63e7145dcbSDimitry Andric 
64e7145dcbSDimitry Andric   IdentInfo_MPI_Rsend = &ASTCtx.Idents.get("MPI_Rsend");
65e7145dcbSDimitry Andric   MPIPointToPointTypes.push_back(IdentInfo_MPI_Rsend);
66e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Rsend);
67e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Rsend);
68e7145dcbSDimitry Andric 
69e7145dcbSDimitry Andric   IdentInfo_MPI_Irsend = &ASTCtx.Idents.get("MPI_Irsend");
70e7145dcbSDimitry Andric   MPIPointToPointTypes.push_back(IdentInfo_MPI_Irsend);
71e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Irsend);
72e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Irsend);
73e7145dcbSDimitry Andric 
74e7145dcbSDimitry Andric   IdentInfo_MPI_Recv = &ASTCtx.Idents.get("MPI_Recv");
75e7145dcbSDimitry Andric   MPIPointToPointTypes.push_back(IdentInfo_MPI_Recv);
76e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Recv);
77e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Recv);
78e7145dcbSDimitry Andric 
79e7145dcbSDimitry Andric   IdentInfo_MPI_Irecv = &ASTCtx.Idents.get("MPI_Irecv");
80e7145dcbSDimitry Andric   MPIPointToPointTypes.push_back(IdentInfo_MPI_Irecv);
81e7145dcbSDimitry Andric   MPINonBlockingTypes.push_back(IdentInfo_MPI_Irecv);
82e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Irecv);
83e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Irecv);
84e7145dcbSDimitry Andric }
85e7145dcbSDimitry Andric 
initCollectiveIdentifiers(ASTContext & ASTCtx)86e7145dcbSDimitry Andric void MPIFunctionClassifier::initCollectiveIdentifiers(ASTContext &ASTCtx) {
87e7145dcbSDimitry Andric   // Copy identifiers into the correct classification containers.
88e7145dcbSDimitry Andric   IdentInfo_MPI_Scatter = &ASTCtx.Idents.get("MPI_Scatter");
89e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Scatter);
90e7145dcbSDimitry Andric   MPIPointToCollTypes.push_back(IdentInfo_MPI_Scatter);
91e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Scatter);
92e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Scatter);
93e7145dcbSDimitry Andric 
94e7145dcbSDimitry Andric   IdentInfo_MPI_Iscatter = &ASTCtx.Idents.get("MPI_Iscatter");
95e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Iscatter);
96e7145dcbSDimitry Andric   MPIPointToCollTypes.push_back(IdentInfo_MPI_Iscatter);
97e7145dcbSDimitry Andric   MPINonBlockingTypes.push_back(IdentInfo_MPI_Iscatter);
98e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Iscatter);
99e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Iscatter);
100e7145dcbSDimitry Andric 
101e7145dcbSDimitry Andric   IdentInfo_MPI_Gather = &ASTCtx.Idents.get("MPI_Gather");
102e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Gather);
103e7145dcbSDimitry Andric   MPICollToPointTypes.push_back(IdentInfo_MPI_Gather);
104e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Gather);
105e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Gather);
106e7145dcbSDimitry Andric 
107e7145dcbSDimitry Andric   IdentInfo_MPI_Igather = &ASTCtx.Idents.get("MPI_Igather");
108e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Igather);
109e7145dcbSDimitry Andric   MPICollToPointTypes.push_back(IdentInfo_MPI_Igather);
110e7145dcbSDimitry Andric   MPINonBlockingTypes.push_back(IdentInfo_MPI_Igather);
111e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Igather);
112e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Igather);
113e7145dcbSDimitry Andric 
114e7145dcbSDimitry Andric   IdentInfo_MPI_Allgather = &ASTCtx.Idents.get("MPI_Allgather");
115e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Allgather);
116e7145dcbSDimitry Andric   MPICollToCollTypes.push_back(IdentInfo_MPI_Allgather);
117e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Allgather);
118e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Allgather);
119e7145dcbSDimitry Andric 
120e7145dcbSDimitry Andric   IdentInfo_MPI_Iallgather = &ASTCtx.Idents.get("MPI_Iallgather");
121e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Iallgather);
122e7145dcbSDimitry Andric   MPICollToCollTypes.push_back(IdentInfo_MPI_Iallgather);
123e7145dcbSDimitry Andric   MPINonBlockingTypes.push_back(IdentInfo_MPI_Iallgather);
124e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Iallgather);
125e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Iallgather);
126e7145dcbSDimitry Andric 
127e7145dcbSDimitry Andric   IdentInfo_MPI_Bcast = &ASTCtx.Idents.get("MPI_Bcast");
128e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Bcast);
129e7145dcbSDimitry Andric   MPIPointToCollTypes.push_back(IdentInfo_MPI_Bcast);
130e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Bcast);
131e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Bcast);
132e7145dcbSDimitry Andric 
133e7145dcbSDimitry Andric   IdentInfo_MPI_Ibcast = &ASTCtx.Idents.get("MPI_Ibcast");
134e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Ibcast);
135e7145dcbSDimitry Andric   MPIPointToCollTypes.push_back(IdentInfo_MPI_Ibcast);
136e7145dcbSDimitry Andric   MPINonBlockingTypes.push_back(IdentInfo_MPI_Ibcast);
137e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Ibcast);
138e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Ibcast);
139e7145dcbSDimitry Andric 
140e7145dcbSDimitry Andric   IdentInfo_MPI_Reduce = &ASTCtx.Idents.get("MPI_Reduce");
141e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Reduce);
142e7145dcbSDimitry Andric   MPICollToPointTypes.push_back(IdentInfo_MPI_Reduce);
143e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Reduce);
144e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Reduce);
145e7145dcbSDimitry Andric 
146e7145dcbSDimitry Andric   IdentInfo_MPI_Ireduce = &ASTCtx.Idents.get("MPI_Ireduce");
147e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Ireduce);
148e7145dcbSDimitry Andric   MPICollToPointTypes.push_back(IdentInfo_MPI_Ireduce);
149e7145dcbSDimitry Andric   MPINonBlockingTypes.push_back(IdentInfo_MPI_Ireduce);
150e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Ireduce);
151e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Ireduce);
152e7145dcbSDimitry Andric 
153e7145dcbSDimitry Andric   IdentInfo_MPI_Allreduce = &ASTCtx.Idents.get("MPI_Allreduce");
154e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Allreduce);
155e7145dcbSDimitry Andric   MPICollToCollTypes.push_back(IdentInfo_MPI_Allreduce);
156e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Allreduce);
157e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Allreduce);
158e7145dcbSDimitry Andric 
159e7145dcbSDimitry Andric   IdentInfo_MPI_Iallreduce = &ASTCtx.Idents.get("MPI_Iallreduce");
160e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Iallreduce);
161e7145dcbSDimitry Andric   MPICollToCollTypes.push_back(IdentInfo_MPI_Iallreduce);
162e7145dcbSDimitry Andric   MPINonBlockingTypes.push_back(IdentInfo_MPI_Iallreduce);
163e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Iallreduce);
164e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Iallreduce);
165e7145dcbSDimitry Andric 
166e7145dcbSDimitry Andric   IdentInfo_MPI_Alltoall = &ASTCtx.Idents.get("MPI_Alltoall");
167e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Alltoall);
168e7145dcbSDimitry Andric   MPICollToCollTypes.push_back(IdentInfo_MPI_Alltoall);
169e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Alltoall);
170e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Alltoall);
171e7145dcbSDimitry Andric 
172e7145dcbSDimitry Andric   IdentInfo_MPI_Ialltoall = &ASTCtx.Idents.get("MPI_Ialltoall");
173e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Ialltoall);
174e7145dcbSDimitry Andric   MPICollToCollTypes.push_back(IdentInfo_MPI_Ialltoall);
175e7145dcbSDimitry Andric   MPINonBlockingTypes.push_back(IdentInfo_MPI_Ialltoall);
176e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Ialltoall);
177e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Ialltoall);
178e7145dcbSDimitry Andric }
179e7145dcbSDimitry Andric 
initAdditionalIdentifiers(ASTContext & ASTCtx)180e7145dcbSDimitry Andric void MPIFunctionClassifier::initAdditionalIdentifiers(ASTContext &ASTCtx) {
181e7145dcbSDimitry Andric   IdentInfo_MPI_Comm_rank = &ASTCtx.Idents.get("MPI_Comm_rank");
182e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Comm_rank);
183e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Comm_rank);
184e7145dcbSDimitry Andric 
185e7145dcbSDimitry Andric   IdentInfo_MPI_Comm_size = &ASTCtx.Idents.get("MPI_Comm_size");
186e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Comm_size);
187e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Comm_size);
188e7145dcbSDimitry Andric 
189e7145dcbSDimitry Andric   IdentInfo_MPI_Wait = &ASTCtx.Idents.get("MPI_Wait");
190e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Wait);
191e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Wait);
192e7145dcbSDimitry Andric 
193e7145dcbSDimitry Andric   IdentInfo_MPI_Waitall = &ASTCtx.Idents.get("MPI_Waitall");
194e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Waitall);
195e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Waitall);
196e7145dcbSDimitry Andric 
197e7145dcbSDimitry Andric   IdentInfo_MPI_Barrier = &ASTCtx.Idents.get("MPI_Barrier");
198e7145dcbSDimitry Andric   MPICollectiveTypes.push_back(IdentInfo_MPI_Barrier);
199e7145dcbSDimitry Andric   MPIType.push_back(IdentInfo_MPI_Barrier);
200e7145dcbSDimitry Andric   assert(IdentInfo_MPI_Barrier);
201e7145dcbSDimitry Andric }
202e7145dcbSDimitry Andric 
203e7145dcbSDimitry Andric // general identifiers
isMPIType(const IdentifierInfo * IdentInfo) const204e7145dcbSDimitry Andric bool MPIFunctionClassifier::isMPIType(const IdentifierInfo *IdentInfo) const {
205e7145dcbSDimitry Andric   return llvm::is_contained(MPIType, IdentInfo);
206e7145dcbSDimitry Andric }
207e7145dcbSDimitry Andric 
isNonBlockingType(const IdentifierInfo * IdentInfo) const208e7145dcbSDimitry Andric bool MPIFunctionClassifier::isNonBlockingType(
209e7145dcbSDimitry Andric     const IdentifierInfo *IdentInfo) const {
210e7145dcbSDimitry Andric   return llvm::is_contained(MPINonBlockingTypes, IdentInfo);
211e7145dcbSDimitry Andric }
212e7145dcbSDimitry Andric 
213e7145dcbSDimitry Andric // point-to-point identifiers
isPointToPointType(const IdentifierInfo * IdentInfo) const214e7145dcbSDimitry Andric bool MPIFunctionClassifier::isPointToPointType(
215e7145dcbSDimitry Andric     const IdentifierInfo *IdentInfo) const {
216e7145dcbSDimitry Andric   return llvm::is_contained(MPIPointToPointTypes, IdentInfo);
217e7145dcbSDimitry Andric }
218e7145dcbSDimitry Andric 
219e7145dcbSDimitry Andric // collective identifiers
isCollectiveType(const IdentifierInfo * IdentInfo) const220e7145dcbSDimitry Andric bool MPIFunctionClassifier::isCollectiveType(
221e7145dcbSDimitry Andric     const IdentifierInfo *IdentInfo) const {
222e7145dcbSDimitry Andric   return llvm::is_contained(MPICollectiveTypes, IdentInfo);
223e7145dcbSDimitry Andric }
224e7145dcbSDimitry Andric 
isCollToColl(const IdentifierInfo * IdentInfo) const225e7145dcbSDimitry Andric bool MPIFunctionClassifier::isCollToColl(
226e7145dcbSDimitry Andric     const IdentifierInfo *IdentInfo) const {
227e7145dcbSDimitry Andric   return llvm::is_contained(MPICollToCollTypes, IdentInfo);
228e7145dcbSDimitry Andric }
229e7145dcbSDimitry Andric 
isScatterType(const IdentifierInfo * IdentInfo) const230e7145dcbSDimitry Andric bool MPIFunctionClassifier::isScatterType(
231e7145dcbSDimitry Andric     const IdentifierInfo *IdentInfo) const {
232e7145dcbSDimitry Andric   return IdentInfo == IdentInfo_MPI_Scatter ||
233e7145dcbSDimitry Andric          IdentInfo == IdentInfo_MPI_Iscatter;
234e7145dcbSDimitry Andric }
235e7145dcbSDimitry Andric 
isGatherType(const IdentifierInfo * IdentInfo) const236e7145dcbSDimitry Andric bool MPIFunctionClassifier::isGatherType(
237e7145dcbSDimitry Andric     const IdentifierInfo *IdentInfo) const {
238e7145dcbSDimitry Andric   return IdentInfo == IdentInfo_MPI_Gather ||
239e7145dcbSDimitry Andric          IdentInfo == IdentInfo_MPI_Igather ||
240e7145dcbSDimitry Andric          IdentInfo == IdentInfo_MPI_Allgather ||
241e7145dcbSDimitry Andric          IdentInfo == IdentInfo_MPI_Iallgather;
242e7145dcbSDimitry Andric }
243e7145dcbSDimitry Andric 
isAllgatherType(const IdentifierInfo * IdentInfo) const244e7145dcbSDimitry Andric bool MPIFunctionClassifier::isAllgatherType(
245e7145dcbSDimitry Andric     const IdentifierInfo *IdentInfo) const {
246e7145dcbSDimitry Andric   return IdentInfo == IdentInfo_MPI_Allgather ||
247e7145dcbSDimitry Andric          IdentInfo == IdentInfo_MPI_Iallgather;
248e7145dcbSDimitry Andric }
249e7145dcbSDimitry Andric 
isAlltoallType(const IdentifierInfo * IdentInfo) const250e7145dcbSDimitry Andric bool MPIFunctionClassifier::isAlltoallType(
251e7145dcbSDimitry Andric     const IdentifierInfo *IdentInfo) const {
252e7145dcbSDimitry Andric   return IdentInfo == IdentInfo_MPI_Alltoall ||
253e7145dcbSDimitry Andric          IdentInfo == IdentInfo_MPI_Ialltoall;
254e7145dcbSDimitry Andric }
255e7145dcbSDimitry Andric 
isBcastType(const IdentifierInfo * IdentInfo) const256e7145dcbSDimitry Andric bool MPIFunctionClassifier::isBcastType(const IdentifierInfo *IdentInfo) const {
257e7145dcbSDimitry Andric   return IdentInfo == IdentInfo_MPI_Bcast || IdentInfo == IdentInfo_MPI_Ibcast;
258e7145dcbSDimitry Andric }
259e7145dcbSDimitry Andric 
isReduceType(const IdentifierInfo * IdentInfo) const260e7145dcbSDimitry Andric bool MPIFunctionClassifier::isReduceType(
261e7145dcbSDimitry Andric     const IdentifierInfo *IdentInfo) const {
262e7145dcbSDimitry Andric   return IdentInfo == IdentInfo_MPI_Reduce ||
263e7145dcbSDimitry Andric          IdentInfo == IdentInfo_MPI_Ireduce ||
264e7145dcbSDimitry Andric          IdentInfo == IdentInfo_MPI_Allreduce ||
265e7145dcbSDimitry Andric          IdentInfo == IdentInfo_MPI_Iallreduce;
266e7145dcbSDimitry Andric }
267e7145dcbSDimitry Andric 
268e7145dcbSDimitry Andric // additional identifiers
isMPI_Wait(const IdentifierInfo * IdentInfo) const269e7145dcbSDimitry Andric bool MPIFunctionClassifier::isMPI_Wait(const IdentifierInfo *IdentInfo) const {
270e7145dcbSDimitry Andric   return IdentInfo == IdentInfo_MPI_Wait;
271e7145dcbSDimitry Andric }
272e7145dcbSDimitry Andric 
isMPI_Waitall(const IdentifierInfo * IdentInfo) const273e7145dcbSDimitry Andric bool MPIFunctionClassifier::isMPI_Waitall(
274e7145dcbSDimitry Andric     const IdentifierInfo *IdentInfo) const {
275e7145dcbSDimitry Andric   return IdentInfo == IdentInfo_MPI_Waitall;
276e7145dcbSDimitry Andric }
277e7145dcbSDimitry Andric 
isWaitType(const IdentifierInfo * IdentInfo) const278e7145dcbSDimitry Andric bool MPIFunctionClassifier::isWaitType(const IdentifierInfo *IdentInfo) const {
279e7145dcbSDimitry Andric   return IdentInfo == IdentInfo_MPI_Wait || IdentInfo == IdentInfo_MPI_Waitall;
280e7145dcbSDimitry Andric }
281e7145dcbSDimitry Andric 
282e7145dcbSDimitry Andric } // end of namespace: mpi
283e7145dcbSDimitry Andric } // end of namespace: ento
284e7145dcbSDimitry Andric } // end of namespace: clang
285