[X86][SDAG] Improve the lowering of `s|uitofp i8|i16 to half` (#70834)
Prior to this patch, vector `s|uitofp` from narrow types (`<= i16`) were scalarized when the hardware doesn't support fp16 conversions natively. This patch fixes that by avoiding using `i16` as an intermediate type when there is no hardware support conversion from this type to half. In other words, when the target doesn't support `avx512fp16`, we avoid using intermediate `i16` vectors for `s|uitofp` conversions. Instead we extend the narrow type to `i32`, which will be converted to `float` and downcasted to `half`. Put differently, we go from: ``` s|uitofp iNarrow %src to half ``` To ``` %tmp = s|zext iNarrow %src to i32 %tmpfp = s|uitofp i32 %tmp to float fptrunc float %tmpfp to half ``` Note that this patch: - Doesn't change the actual lowering of i32 to half. I.e., the `float` intermediate step and the final downcasting are what existed for this input type to half. - Changes only the intermediate type for the lowering of `s|uitofp`. I.e., the first `s|zext` from i16 to i32. Remark: The vector and scalar lowering of `s|uitofp` don't use the same code path. Not super happy about that, but I'm not planning to fix that, at least in this PR. This fixes https://github.com/llvm/llvm-project/issues/67080
parent
6cc1c2c6
Please register or sign in to comment