================
@@ -213,15 +215,23 @@ static void 
lowerArrayDtorCtorIntoLoop(cir::CIRBaseBuilderTy &builder,
         op->walk([&](cir::CallOp c) { ctorCall = c; });
         assert(ctorCall && "expected ctor call");
 
-        auto one = builder.create<cir::ConstantOp>(
-            loc, ptrDiffTy, cir::IntAttr::get(ptrDiffTy, 1));
-
-        ctorCall->moveAfter(one);
-        ctorCall->setOperand(0, currentElement);
-
-        // Advance pointer and store them to temporary variable
-        auto nextElement =
-            builder.create<cir::PtrStrideOp>(loc, eltTy, currentElement, one);
+        // Array elements get constructed in order but destructed in reverse.
+        cir::PtrStrideOp nextElement;
+        if (isCtor) {
+          mlir::Value stride = builder.getUnsignedInt(loc, 1, sizeTypeSize);
+          ctorCall->moveBefore(stride.getDefiningOp());
+          ctorCall->setOperand(0, currentElement);
+          nextElement = builder.create<cir::PtrStrideOp>(
+              loc, eltTy, currentElement, stride);
+        } else {
+          mlir::Value stride = builder.getSignedInt(loc, -1, sizeTypeSize);
+          nextElement = builder.create<cir::PtrStrideOp>(
+              loc, eltTy, currentElement, stride);
+          ctorCall->moveAfter(nextElement);
----------------
mmha wrote:

I *think* your loop is correct. But I also think if you initialize stop with 
`end - 1` you don't have to use `moveAfter` here and can share more code 
between the ctor and dtor case (the zero case is handled elsewhere so that 
would be safe to do). But that's more of a comment and less of a request to 
change your patch. I don't care either way :)

https://github.com/llvm/llvm-project/pull/150499
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to