Skip to content

Commit 3976ff9

Browse files
authored
Emit some std:: clang builtin functions (#217)
* Add support for some builtin std:: functions clang::Builtin::BImove clang::Builtin::BImove_if_noexcept clang::Builtin::BIforward clang::Builtin::BIas_const * Add test
1 parent bbdde04 commit 3976ff9

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

tools/mlir-clang/Lib/CGCall.cc

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,22 @@ ValueCategory MLIRScanner::CallHelper(
341341
assert(0 && "no indirect");
342342
}
343343

344+
std::pair<ValueCategory, bool>
345+
MLIRScanner::EmitClangBuiltinCallExpr(clang::CallExpr *expr) {
346+
switch (expr->getBuiltinCallee()) {
347+
case clang::Builtin::BImove:
348+
case clang::Builtin::BImove_if_noexcept:
349+
case clang::Builtin::BIforward:
350+
case clang::Builtin::BIas_const: {
351+
auto V = Visit(expr->getArg(0));
352+
return make_pair(V, true);
353+
}
354+
default:
355+
break;
356+
}
357+
return make_pair(ValueCategory(), false);
358+
}
359+
344360
ValueCategory MLIRScanner::VisitCallExpr(clang::CallExpr *expr) {
345361

346362
auto loc = getMLIRLocation(expr->getExprLoc());
@@ -368,6 +384,10 @@ ValueCategory MLIRScanner::VisitCallExpr(clang::CallExpr *expr) {
368384
if (valEmitted.second)
369385
return valEmitted.first;
370386

387+
valEmitted = EmitClangBuiltinCallExpr(expr);
388+
if (valEmitted.second)
389+
return valEmitted.first;
390+
371391
if (auto *oc = dyn_cast<CXXOperatorCallExpr>(expr)) {
372392
if (oc->getOperator() == clang::OO_EqualEqual) {
373393
if (auto *lhs = dyn_cast<CXXTypeidExpr>(expr->getArg(0))) {

tools/mlir-clang/Lib/clang-mlir.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,9 @@ class MLIRScanner : public StmtVisitor<MLIRScanner, ValueCategory> {
290290
ArrayRef<std::pair<ValueCategory, clang::Expr *>> arguments,
291291
QualType retType, bool retReference, clang::Expr *expr);
292292

293+
std::pair<ValueCategory, bool>
294+
EmitClangBuiltinCallExpr(clang::CallExpr *expr);
295+
293296
std::pair<ValueCategory, bool> EmitGPUCallExpr(clang::CallExpr *expr);
294297

295298
std::pair<ValueCategory, bool> EmitBuiltinOps(clang::CallExpr *expr);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: mlir-clang %s --function=* -S | FileCheck %s
2+
3+
#include <utility>
4+
5+
float moo(float &&x) {
6+
return std::move(x);
7+
}
8+
9+
// CHECK: func.func @_Z3mooOf(%arg0: memref<?xf32>)
10+
// CHECK-NEXT: %0 = affine.load %arg0[0] : memref<?xf32>
11+
// CHECK-NEXT: return %0 : f32
12+
// CHECK-NEXT: }

0 commit comments

Comments
 (0)