[clang] [CIR] Upstream local initialization for VectorType (PR #138107)
Amr Hesham via cfe-commits
cfe-commits at lists.llvm.org
Thu May 1 14:03:46 PDT 2025
================
@@ -1584,6 +1586,47 @@ mlir::Value ScalarExprEmitter::VisitMemberExpr(MemberExpr *e) {
return emitLoadOfLValue(e);
}
+mlir::Value ScalarExprEmitter::VisitInitListExpr(InitListExpr *e) {
+ const unsigned numInitElements = e->getNumInits();
+
+ if (e->hadArrayRangeDesignator()) {
+ cgf.cgm.errorNYI(e->getSourceRange(), "ArrayRangeDesignator");
+ return {};
+ }
+
+ if (numInitElements == 0) {
+ cgf.cgm.errorNYI(e->getSourceRange(), "InitListExpr with 0 init elements");
+ return {};
+ }
+
+ if (e->getType()->isVectorType()) {
+ const auto vectorType =
+ mlir::cast<cir::VectorType>(cgf.convertType(e->getType()));
+
+ SmallVector<mlir::Value, 16> elements;
+ for (Expr *init : e->inits()) {
+ elements.push_back(Visit(init));
+ }
+
+ // Zero-initialize any remaining values.
+ if (numInitElements < vectorType.getSize()) {
+ mlir::TypedAttr zeroInitAttr =
+ cgf.getBuilder().getZeroInitAttr(vectorType.getElementType());
+ cir::ConstantOp zeroValue = cgf.getBuilder().getConstant(
+ cgf.getLoc(e->getSourceRange()), zeroInitAttr);
+
+ for (uint64_t i = numInitElements; i < vectorType.getSize(); ++i) {
----------------
AmrDeveloper wrote:
I think it should be like this
```
std::fill_n(std::back_inserter(elements), vectorType.getSize() - numInitElements, zeroValue);
```
To fill in the remaining size not init + full size
https://github.com/llvm/llvm-project/pull/138107
More information about the cfe-commits
mailing list