O retorno de uma tupla 2 é menos eficiente que o std :: pair?

Considere este código:

#include <utility>
#include <tuple>

std::pair<int, int> f1()
{
    return std::make_pair(0x111, 0x222);
}

std::tuple<int, int> f2()
{
    return std::make_tuple(0x111, 0x222);
}

Os clang 3 e 4 geram código semelhante para ambos no x86-64:

f1():
 movabs rax,0x22200000111
 ret    
f2():
 movabs rax,0x11100000222 ; opposite packing order, not important
 ret    

Mas o Clang 5 gera código diferente paraf2():

f2():
 movabs rax,0x11100000222
 mov    QWORD PTR [rdi],rax
 mov    rax,rdi
 ret    

Assim como o GCC 4 ao GCC 7:

f2():
 movabs rdx,0x11100000222
 mov    rax,rdi
 mov    QWORD PTR [rdi],rdx ; GCC 4-6 use 2 DWORD stores
 ret

Por que o código gerado é pior ao retornar umstd::tuple que se encaixa em um único registro, vsstd::pair? Parece especialmente estranho, já que os clãs 3 e 4 pareciam ótimos, mas 5 não é.

Experimente aqui:https://godbolt.org/g/T2Yqrj

questionAnswers(1)

yourAnswerToTheQuestion