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 }