================
@@ -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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits