movzx eax, ax is useless.
I would say this is unoptimized code, this C code could reproduce the same generated code.
void f(uint16_t v)
struct S s;
s.a = 0x1122;
Compiling with gcc without optimization options, the code is:
1134: 0f b7 45 fe movzx eax,WORD PTR [rbp-0x2]
1138: 0f b7 c0 movzx eax,ax
113b: 89 c7 mov edi,eax
113d: e8 d7 ff ff ff call 1119 <f>
Note, I wasn't able to produce the same result neither with clang or vc++.
Besides, it only happens when the value is read from a structure.