This is a transform that I limited in instcombine in rL329821 because it was creating more instructions in IR when the cast has multiple uses.
However, in the post-commit mailing list thread for that change, @escha wrote that an out-of-tree target had regressed from that change because fpext is free on that target. Since I don't have access to that target, I'm using PowerPC as a stand-in to show the benefit of the transform here in the backend. PowerPC is the only in-tree target that sets isFPExtFree() to 'true'.
If this looks right, then we may need to add another hook for isFPTruncFree() to fully recover from the IR change because it affected fptrunc casts too.