Skip to content

Commit 3b11686

Browse files
authored
[BUGFIX] Handling elaborated types is VisitArrayLoopInit (#230)
authored-by: pietro.ghiglio <[email protected]>
1 parent b574ee6 commit 3b11686

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

tools/cgeist/Lib/clang-mlir.cc

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -956,9 +956,23 @@ MLIRScanner::VisitArrayInitIndexExpr(clang::ArrayInitIndexExpr *expr) {
956956
/*isReference*/ false);
957957
}
958958

959+
static const clang::ConstantArrayType *getCAT(const clang::Type *T) {
960+
const clang::Type *Child;
961+
if (auto CAT = dyn_cast<clang::ConstantArrayType>(T)) {
962+
return CAT;
963+
} else if (auto ET = dyn_cast<clang::ElaboratedType>(T)) {
964+
Child = ET->getNamedType().getTypePtr();
965+
} else if (auto TypeDefT = dyn_cast<clang::TypedefType>(T)) {
966+
Child = TypeDefT->getUnqualifiedDesugaredType();
967+
} else {
968+
llvm_unreachable("Unhandled case\n");
969+
}
970+
return getCAT(Child);
971+
}
972+
959973
ValueCategory MLIRScanner::VisitArrayInitLoop(clang::ArrayInitLoopExpr *expr,
960974
ValueCategory tostore) {
961-
auto CAT = dyn_cast<clang::ConstantArrayType>(expr->getType());
975+
const clang::ConstantArrayType *CAT = getCAT(expr->getType().getTypePtr());
962976
llvm::errs() << "warning recomputing common in arrayinitloopexpr\n";
963977
std::vector<mlir::Value> start = {getConstantIndex(0)};
964978
std::vector<mlir::Value> sizes = {

tools/cgeist/Test/elaborated-init.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// RUN: cgeist %s --function='*' -S | FileCheck %s
2+
struct A {
3+
using TheType = int[4];
4+
};
5+
6+
void testArrayInitExpr()
7+
{
8+
A::TheType a{1,2,3,4};
9+
auto l = [a]{
10+
};
11+
}
12+
13+
// CHECK: func.func private @_ZZ17testArrayInitExprvEN3$_0C1EOS_(%arg0: !llvm.ptr<struct<(array<4 x i32>)>>, %arg1: !llvm.ptr<struct<(array<4 x i32>)>>) attributes {llvm.linkage = #llvm.linkage<internal>} {
14+
// CHECK-NEXT: %c0_i32 = arith.constant 0 : i32
15+
// CHECK-NEXT: %0 = llvm.getelementptr %arg0[%c0_i32, 0] : (!llvm.ptr<struct<(array<4 x i32>)>>, i32) -> !llvm.ptr<array<4 x i32>>
16+
// CHECK-NEXT: %1 = llvm.getelementptr %0[%c0_i32, %c0_i32] : (!llvm.ptr<array<4 x i32>>, i32, i32) -> !llvm.ptr<i32>
17+
// CHECK-NEXT: %2 = llvm.getelementptr %arg1[%c0_i32, 0] : (!llvm.ptr<struct<(array<4 x i32>)>>, i32) -> !llvm.ptr<array<4 x i32>>
18+
// CHECK-NEXT: %3 = llvm.getelementptr %2[%c0_i32, %c0_i32] : (!llvm.ptr<array<4 x i32>>, i32, i32) -> !llvm.ptr<i32>
19+
// CHECK-NEXT: affine.for %arg2 = 0 to 4 {
20+
// CHECK-NEXT: %4 = arith.index_cast %arg2 : index to i64
21+
// CHECK-NEXT: %5 = llvm.getelementptr %1[%4] : (!llvm.ptr<i32>, i64) -> !llvm.ptr<i32>
22+
// CHECK-NEXT: %6 = llvm.getelementptr %3[%4] : (!llvm.ptr<i32>, i64) -> !llvm.ptr<i32>
23+
// CHECK-NEXT: %7 = llvm.load %6 : !llvm.ptr<i32>
24+
// CHECK-NEXT: llvm.store %7, %5 : !llvm.ptr<i32>
25+
// CHECK-NEXT: }
26+
// CHECK-NEXT: return
27+
// CHECK-NEXT: }

0 commit comments

Comments
 (0)