Por que essa loja morta de unique_ptr não pode ser eliminada?

#include <memory>
#include <vector>
using namespace std;

vector<unique_ptr<int>> e;

void f(unique_ptr<int> u) {
    e.emplace_back(move(u));
}

Para ambos Clang e GCC, o snippet de código acima gera algo como:

f(std::unique_ptr<int, std::default_delete<int> >):
        mov     rsi, QWORD PTR e[rip+8] # rsi: vector.end_ptr
        cmp     rsi, QWORD PTR e[rip+16] # [e + rip + 16]: vector.storage_end_ptr
        je      .L52 # Slow path, need to reallocate
        mov     rax, QWORD PTR [rdi] # rax: unique_ptr<int> u
        add     rsi, 8               # end_ptr += 8
        mov     QWORD PTR [rdi], 0   # <==== Do we need to set the argument u to null here? 
        mov     QWORD PTR [rsi-8], rax # *(end_ptr - 8) = u 
        mov     QWORD PTR e[rip+8], rsi # update end_ptr
        ret
.L52:   # omitted

Eu queria saber por que o compilador geramov QWORD PTR[rdi], 0 nesta função? Existe alguma convenção que exija o compilador para fazer isso?

Moreover, para casos mais simples comoist:

void f(unique_ptr<int> u);

void h(int x) {
    auto p = make_unique<int>(x);
    f(move(p));
}

Por que o compilador gera:

call    operator delete(void*, unsigned long)

no fim deh(), dado que p é semprenullptr após a invocação def?

questionAnswers(1)

yourAnswerToTheQuestion