Clang is not emitting lifetime markers for temporary function parameters, so more stack space is potentially being allocated than necessary.
A new parameter is added to the CreateAggTemp and EmitAnyExprToTemp functions to indicate whether to emit lifetime markers for aggregates, so that the EmitCallArg function can request them when evaluating an arg. The parameter is defaulted to false so that the behaviour of other callers is not affected.
This is problematic because we're not necessarily in a scope that usefully limits the duration of cleanups — we don't push full-expression scopes when emitting an arbitrary statement. Probably we should, but we don't.
If you'd like to take a look at solving that problem first, that would be great.