If we are only removing bits that were added by the extend we should be able to use a smaller extend. I think.
We already reduce cases like this when there is binop in between. For example:
define float @bar(half %a, half %x) {
%b = fpext half %a to double
%z = fpext half %x to double
%y = fmul double %b, %z
%c = fptrunc double %y to float
ret float %c
}