@@ -100,21 +100,21 @@ static void castCallerArgs(mlir::func::FuncOp Callee,
100
100
/* *****************************************************************************/
101
101
102
102
ValueCategory MLIRScanner::callHelper (
103
- mlir::func::FuncOp Tocall , QualType ObjType,
103
+ mlir::func::FuncOp ToCall , QualType ObjType,
104
104
ArrayRef<std::pair<ValueCategory, clang::Expr *>> Arguments,
105
105
QualType RetType, bool RetReference, clang::Expr *Expr,
106
- const FunctionDecl * Callee) {
106
+ const FunctionDecl & Callee) {
107
107
SmallVector<mlir::Value, 4 > Args;
108
- auto FnType = Tocall .getFunctionType ();
109
- const clang::CodeGen::CGFunctionInfo &FI =
110
- Glob.GetOrCreateCGFunctionInfo (Callee);
111
- auto FIArgs = FI .arguments ();
108
+ mlir::FunctionType FnType = ToCall .getFunctionType ();
109
+ const clang::CodeGen::CGFunctionInfo &CalleeInfo =
110
+ Glob.GetOrCreateCGFunctionInfo (& Callee);
111
+ auto CalleeArgs = CalleeInfo .arguments ();
112
112
113
113
size_t I = 0 ;
114
114
// map from declaration name to mlir::value
115
115
std::map<std::string, mlir::Value> MapFuncOperands;
116
116
117
- for (auto Pair : Arguments) {
117
+ for (const std::pair<ValueCategory, clang::Expr *> & Pair : Arguments) {
118
118
ValueCategory Arg = std::get<0 >(Pair);
119
119
clang::Expr *A = std::get<1 >(Pair);
120
120
@@ -134,10 +134,10 @@ ValueCategory MLIRScanner::callHelper(
134
134
if (I >= FnType.getInputs ().size () || (I != 0 && A == nullptr )) {
135
135
LLVM_DEBUG ({
136
136
Expr->dump ();
137
- Tocall .dump ();
137
+ ToCall .dump ();
138
138
FnType.dump ();
139
- for (auto a : Arguments)
140
- std::get<1 >(a )->dump ();
139
+ for (auto A : Arguments)
140
+ std::get<1 >(A )->dump ();
141
141
});
142
142
assert (false && " too many arguments in calls" );
143
143
}
@@ -175,21 +175,21 @@ ValueCategory MLIRScanner::callHelper(
175
175
});
176
176
assert (Arg.isReference );
177
177
178
- auto Mt =
178
+ auto MT =
179
179
Glob.getTypes ()
180
180
.getMLIRType (
181
181
Glob.getCGM ().getContext ().getLValueReferenceType (AType))
182
182
.cast <MemRefType>();
183
183
184
184
LLVM_DEBUG ({
185
- llvm::dbgs () << " mt : " << Mt << " \n " ;
185
+ llvm::dbgs () << " MT : " << MT << " \n " ;
186
186
llvm::dbgs () << " getLValueReferenceType(aType): "
187
187
<< Glob.getCGM ().getContext ().getLValueReferenceType (
188
188
AType)
189
189
<< " \n " ;
190
190
});
191
191
192
- auto Shape = std::vector<int64_t >(Mt .getShape ());
192
+ auto Shape = std::vector<int64_t >(MT .getShape ());
193
193
assert (Shape.size () == 2 );
194
194
195
195
auto Pshape = Shape[0 ];
@@ -199,21 +199,22 @@ ValueCategory MLIRScanner::callHelper(
199
199
OpBuilder Abuilder (builder.getContext ());
200
200
Abuilder.setInsertionPointToStart (allocationScope);
201
201
auto Alloc = Abuilder.create <mlir::memref::AllocaOp>(
202
- loc, mlir::MemRefType::get (Shape, Mt .getElementType (),
202
+ loc, mlir::MemRefType::get (Shape, MT .getElementType (),
203
203
MemRefLayoutAttrInterface (),
204
- Mt .getMemorySpace ()));
204
+ MT .getMemorySpace ()));
205
205
ValueCategory (Alloc, /* isRef*/ true )
206
206
.store (builder, Arg, /* isArray*/ IsArray);
207
207
Shape[0 ] = Pshape;
208
208
Val = builder.create <mlir::memref::CastOp>(
209
209
loc,
210
- mlir::MemRefType::get (Shape, Mt .getElementType (),
210
+ mlir::MemRefType::get (Shape, MT .getElementType (),
211
211
MemRefLayoutAttrInterface (),
212
- Mt .getMemorySpace ()),
212
+ MT .getMemorySpace ()),
213
213
Alloc);
214
214
} else {
215
- if (FIArgs[I].info .getKind () == clang::CodeGen::ABIArgInfo::Indirect ||
216
- FIArgs[I].info .getKind () ==
215
+ if (CalleeArgs[I].info .getKind () ==
216
+ clang::CodeGen::ABIArgInfo::Indirect ||
217
+ CalleeArgs[I].info .getKind () ==
217
218
clang::CodeGen::ABIArgInfo::IndirectAliased) {
218
219
OpBuilder Abuilder (builder.getContext ());
219
220
Abuilder.setInsertionPointToStart (allocationScope);
@@ -226,20 +227,20 @@ ValueCategory MLIRScanner::callHelper(
226
227
Val = Abuilder.create <mlir::memref::CastOp>(
227
228
loc, mlir::MemRefType::get (-1 , Arg.getValue (builder).getType ()),
228
229
Val);
229
- } else {
230
+ } else
230
231
Val = Abuilder.create <mlir::LLVM::AllocaOp>(
231
232
loc, Ty, Abuilder.create <arith::ConstantIntOp>(loc, 1 , 64 ), 0 );
232
- }
233
+
233
234
ValueCategory (Val, /* isRef*/ true )
234
235
.store (builder, Arg.getValue (builder));
235
236
} else
236
237
Val = Arg.getValue (builder);
237
238
238
239
if (Val.getType ().isa <LLVM::LLVMPointerType>() &&
239
- ExpectedType.isa <MemRefType>()) {
240
+ ExpectedType.isa <MemRefType>())
240
241
Val = builder.create <polygeist::Pointer2MemrefOp>(loc, ExpectedType,
241
242
Val);
242
- }
243
+
243
244
if (auto PrevTy = Val.getType ().dyn_cast <mlir::IntegerType>()) {
244
245
auto IPostTy = ExpectedType.cast <mlir::IntegerType>();
245
246
if (PrevTy != IPostTy)
@@ -266,7 +267,7 @@ ValueCategory MLIRScanner::callHelper(
266
267
}
267
268
268
269
// handle lowerto pragma.
269
- if (LTInfo.SymbolTable .count (Tocall .getName ())) {
270
+ if (LTInfo.SymbolTable .count (ToCall .getName ())) {
270
271
SmallVector<mlir::Value> InputOperands;
271
272
SmallVector<mlir::Value> OutputOperands;
272
273
for (StringRef Input : LTInfo.InputSymbol )
@@ -280,7 +281,7 @@ ValueCategory MLIRScanner::callHelper(
280
281
InputOperands.append (Args);
281
282
282
283
return ValueCategory (mlirclang::replaceFuncByOperation (
283
- Tocall , LTInfo.SymbolTable [Tocall .getName ()],
284
+ ToCall , LTInfo.SymbolTable [ToCall .getName ()],
284
285
builder, InputOperands, OutputOperands)
285
286
->getResult (0 ),
286
287
/* isReference=*/ false );
@@ -292,13 +293,13 @@ ValueCategory MLIRScanner::callHelper(
292
293
293
294
mlir::Value Alloc;
294
295
if (IsArrayReturn) {
295
- auto Mt =
296
+ auto MT =
296
297
Glob.getTypes ()
297
298
.getMLIRType (
298
299
Glob.getCGM ().getContext ().getLValueReferenceType (RetType))
299
300
.cast <MemRefType>();
300
301
301
- auto Shape = std::vector<int64_t >(Mt .getShape ());
302
+ auto Shape = std::vector<int64_t >(MT .getShape ());
302
303
assert (Shape.size () == 2 );
303
304
304
305
auto Pshape = Shape[0 ];
@@ -308,14 +309,14 @@ ValueCategory MLIRScanner::callHelper(
308
309
OpBuilder Abuilder (builder.getContext ());
309
310
Abuilder.setInsertionPointToStart (allocationScope);
310
311
Alloc = Abuilder.create <mlir::memref::AllocaOp>(
311
- loc, mlir::MemRefType::get (Shape, Mt .getElementType (),
312
+ loc, mlir::MemRefType::get (Shape, MT .getElementType (),
312
313
MemRefLayoutAttrInterface (),
313
- Mt .getMemorySpace ()));
314
+ MT .getMemorySpace ()));
314
315
Shape[0 ] = Pshape;
315
316
Alloc = builder.create <mlir::memref::CastOp>(
316
317
loc,
317
- mlir::MemRefType::get (Shape, Mt .getElementType (),
318
- MemRefLayoutAttrInterface (), Mt .getMemorySpace ()),
318
+ mlir::MemRefType::get (Shape, MT .getElementType (),
319
+ MemRefLayoutAttrInterface (), MT .getMemorySpace ()),
319
320
Alloc);
320
321
Args.push_back (Alloc);
321
322
}
@@ -391,19 +392,19 @@ ValueCategory MLIRScanner::callHelper(
391
392
auto Oldpoint = builder.getInsertionPoint ();
392
393
auto *Oldblock = builder.getInsertionBlock ();
393
394
builder.setInsertionPointToStart (&Op.getRegion ().front ());
394
- builder.create <CallOp>(loc, Tocall , Args);
395
+ builder.create <CallOp>(loc, ToCall , Args);
395
396
builder.create <gpu::TerminatorOp>(loc);
396
397
builder.setInsertionPoint (Oldblock, Oldpoint);
397
398
return nullptr ;
398
399
}
399
400
400
401
// Try to rescue some mismatched types.
401
- castCallerArgs (Tocall , Args, builder);
402
+ castCallerArgs (ToCall , Args, builder);
402
403
403
404
// / Try to emit SYCL operations before creating a CallOp
404
405
mlir::Operation *Op = emitSYCLOps (Expr, Args);
405
406
if (!Op)
406
- Op = builder.create <CallOp>(loc, Tocall , Args);
407
+ Op = builder.create <CallOp>(loc, ToCall , Args);
407
408
408
409
if (IsArrayReturn) {
409
410
// TODO remedy return
@@ -412,13 +413,12 @@ ValueCategory MLIRScanner::callHelper(
412
413
assert (!RetReference);
413
414
return ValueCategory (Alloc, /* isReference*/ true );
414
415
}
415
- if (Op->getNumResults ()) {
416
+
417
+ if (Op->getNumResults ())
416
418
return ValueCategory (Op->getResult (0 ),
417
419
/* isReference*/ RetReference);
418
- }
420
+
419
421
return nullptr ;
420
- llvm::errs () << " do not support indirecto call of " << Tocall << " \n " ;
421
- assert (0 && " no indirect" );
422
422
}
423
423
424
424
std::pair<ValueCategory, bool >
@@ -445,21 +445,6 @@ ValueCategory MLIRScanner::VisitCallExpr(clang::CallExpr *Expr) {
445
445
});
446
446
447
447
auto Loc = getMLIRLocation (Expr->getExprLoc ());
448
- /*
449
- if (auto ic = dyn_cast<ImplicitCastExpr>(expr->getCallee()))
450
- if (auto sr = dyn_cast<DeclRefExpr>(ic->getSubExpr())) {
451
- if (sr->getDecl()->getIdentifier() &&
452
- sr->getDecl()->getName() == "__shfl_up_sync") {
453
- std::vector<mlir::Value> args;
454
- for (auto a : expr->arguments()) {
455
- args.push_back(Visit(a).getValue(builder));
456
- }
457
- builder.create<gpu::ShuffleOp>(loc, );
458
- assert(0 && "__shfl_up_sync unhandled");
459
- return nullptr;
460
- }
461
- }
462
- */
463
448
464
449
auto ValEmitted = emitGPUCallExpr (Expr);
465
450
if (ValEmitted.second )
@@ -498,7 +483,6 @@ ValueCategory MLIRScanner::VisitCallExpr(clang::CallExpr *Expr) {
498
483
499
484
if (auto *Oc = dyn_cast<CXXMemberCallExpr>(Expr)) {
500
485
if (auto *LHS = dyn_cast<CXXTypeidExpr>(Oc->getImplicitObjectArgument ())) {
501
- Expr->getCallee ()->dump ();
502
486
if (auto *Ic = dyn_cast<MemberExpr>(Expr->getCallee ()))
503
487
if (auto *Sr = dyn_cast<NamedDecl>(Ic->getMemberDecl ())) {
504
488
if (Sr->getIdentifier () && Sr->getName () == " name" ) {
@@ -946,8 +930,8 @@ ValueCategory MLIRScanner::VisitCallExpr(clang::CallExpr *Expr) {
946
930
(isa<CXXOperatorCallExpr>(Expr) &&
947
931
cast<CXXOperatorCallExpr>(Expr)->getOperator () ==
948
932
OO_GreaterGreater)) {
949
- const auto *Tocall = EmitCallee (Expr->getCallee ());
950
- auto StrcmpF = Glob.GetOrCreateLLVMFunction (Tocall );
933
+ const auto *ToCall = EmitCallee (Expr->getCallee ());
934
+ auto StrcmpF = Glob.GetOrCreateLLVMFunction (ToCall );
951
935
952
936
std::vector<mlir::Value> Args;
953
937
std::vector<std::pair<mlir::Value, mlir::Value>> Ops;
@@ -1149,17 +1133,18 @@ ValueCategory MLIRScanner::VisitCallExpr(clang::CallExpr *Expr) {
1149
1133
if (auto *CC = dyn_cast<CXXMemberCallExpr>(Expr)) {
1150
1134
ValueCategory Obj = Visit (CC->getImplicitObjectArgument ());
1151
1135
ObjType = CC->getObjectType ();
1152
- #ifdef DEBUG
1153
- if (!obj.val ) {
1154
- function.dump ();
1155
- llvm::errs () << " objval: " << obj.val << " \n " ;
1156
- expr->dump ();
1157
- CC->getImplicitObjectArgument ()->dump ();
1158
- }
1159
- #endif
1160
- if (cast<MemberExpr>(CC->getCallee ()->IgnoreParens ())->isArrow ()) {
1136
+ LLVM_DEBUG ({
1137
+ if (!Obj.val ) {
1138
+ function.dump ();
1139
+ llvm::errs () << " objval: " << Obj.val << " \n " ;
1140
+ Expr->dump ();
1141
+ CC->getImplicitObjectArgument ()->dump ();
1142
+ }
1143
+ });
1144
+
1145
+ if (cast<MemberExpr>(CC->getCallee ()->IgnoreParens ())->isArrow ())
1161
1146
Obj = Obj.dereference (builder);
1162
- }
1147
+
1163
1148
assert (Obj.val );
1164
1149
assert (Obj.isReference );
1165
1150
Args.emplace_back (std::make_pair (Obj, (clang::Expr *)nullptr ));
@@ -1169,7 +1154,7 @@ ValueCategory MLIRScanner::VisitCallExpr(clang::CallExpr *Expr) {
1169
1154
Args.push_back (std::make_pair (Visit (A), A));
1170
1155
1171
1156
return callHelper (ToCall, ObjType, Args, Expr->getType (),
1172
- Expr->isLValue () || Expr->isXValue (), Expr, Callee);
1157
+ Expr->isLValue () || Expr->isXValue (), Expr, * Callee);
1173
1158
}
1174
1159
1175
1160
std::pair<ValueCategory, bool >
0 commit comments