Sometimes _Compare is an lvalue reference type, so letting it be deduced is pretty much always wrong. (Well, less efficient than it could be, anyway.)
I did a manual audit for other offending calls (and I found none), by manually replacing _Compare __comp with a non-deducible typename __identity<_Compare>::type __comp in all the helper functions. My impression is that such a blanket change to the helpers would be unwelcome because it's so icky-looking. And perhaps also because it's an ABI break, in the sense that it would affect the mangling of the __sort specializations explicitly instantiated in src/algorithm.cpp — it's unclear to me whether we would care about that.
@curdeius:
Other way around. (And I'm sure it's not your ignorance, just a brain fart. ;)) The trouble case is when _Compare is T&, and then passing __comp by value will make __half_inplace_merge deduce its _Compare as T and make a copy, when really we want __half_inplace_merge's _Compare to also be T&.
Basically, libc++ algorithms have an invariant that "_Compare is either an lvalue reference type or __debug_less<T&> (which works like reference_wrapper and is cheap to copy)." It would actually be very nice if we could just make the invariant that "_Compare is a value type that is cheap to copy (e.g. reference_wrapper<T>)," and then we'd never need to specify <_Compare> on any helper ever again...