diff --git a/tools/cgeist/Lib/clang-mlir.cc b/tools/cgeist/Lib/clang-mlir.cc index b944cbda2e04..dd78d0aacaa3 100644 --- a/tools/cgeist/Lib/clang-mlir.cc +++ b/tools/cgeist/Lib/clang-mlir.cc @@ -747,8 +747,8 @@ MLIRScanner::VisitImplicitValueInitExpr(clang::ImplicitValueInitExpr *decl) { return ValueCategory(builder.create( loc, APFloat(FT.getFloatSemantics(), "0"), FT), /*isReference*/ false); - if (auto IT = dyn_cast(Mty)) - return ValueCategory(builder.create(loc, 0, IT), + if (Mty.isIntOrIndex()) + return ValueCategory(builder.create(loc, 0, Mty), /*isReference*/ false); if (auto MT = dyn_cast(Mty)) return ValueCategory( @@ -1095,6 +1095,23 @@ ValueCategory MLIRScanner::VisitPredefinedExpr(clang::PredefinedExpr *expr) { } ValueCategory MLIRScanner::VisitInitListExpr(clang::InitListExpr *expr) { + if (expr->getNumInits() == 0 || + (expr->getNumInits() == 1 && llvm::isa(expr->getInit(0)))) { + mlir::Type elemType = getMLIRType(expr->getType()); + + if (elemType.isIntOrIndex()) { + auto zero = builder.create( + getMLIRLocation(expr->getBeginLoc()), + builder.getIntegerAttr(elemType, 0)); + return ValueCategory(zero, false); + } + else if (elemType.isa()) { + auto zero = builder.create( + getMLIRLocation(expr->getBeginLoc()), + builder.getFloatAttr(elemType, 0.0)); + return ValueCategory(zero, false); + } + } mlir::Type subType = getMLIRType(expr->getType()); bool isArray = false; bool LLVMABI = false; @@ -1509,7 +1526,7 @@ MLIRScanner::VisitCXXScalarValueInitExpr(clang::CXXScalarValueInitExpr *expr) { mlir::Type melem = Glob.getMLIRType(expr->getType(), &isArray); assert(!isArray); - if (melem.isa()) + if (melem.isIntOrIndex()) return ValueCategory(builder.create(loc, 0, melem), false); else if (auto MT = dyn_cast(melem)) return ValueCategory(