Quite an embarrassing one here, vargargs calls have been broken in some edge-cases for quite a while...
On Darwin, function arguments occupy their real size when passed on the stack (e.g. an i16 only consumes 2 bytes). This means that, even for fixed args in varargs calls we need to keep track of the original type being passed before any DAG/GISel promotions. Existing logic only applied this fix to the non-varargs case leading to mismatch between caller & callee in those situations.
On Linux & Windows these arguments always occupy a 64-bit slot anyway so there's no special handling needed.