Doesn't aggregate foreach make a copy of the aggregate variable, which can change semantics when the aggregate has value semantics or a postblit constructor? The algorithm doesn't depend on it either way, but it could affect performance, especially when the optimizer is faced with something non-trivial like a postblit constructor. If that's the case, then this kind of manual lowering that *doesn't* make a copy makes a lot of sense.