[LLVMdev] half to float intrinsic promotion
Ahmed Bougacha
ahmed.bougacha at gmail.com
Thu Feb 12 10:31:04 PST 2015
On Thu, Feb 12, 2015 at 8:48 AM, kewuzhang <kewu.zhang at amd.com> wrote:
>
> Hi Guys,
>
> I am trying to promote half to float for my intrinsic math operations,
> following class and pattern are defined.
>
> "
> class S_HF__HF< string asmstr> : Intrinsic
> <[llvm_float_ty ], [llvm_float_ty ],
> [IntrNoMem],
> !strconcat(asmstr, "_f16")>;
>
> def :Pat<( f16 (int_my_math_f16 f16:$src)), (F2Hsr (FEXTsr f16:$src) )>;
>
>
> “
> where FEXTsr is implementing the fextend type profile, F2Hsr is
> implementing as the float to half conversion .
> “int_my_math_f16” is implementing the “S_HF__HF” profile above.
> I am just trying to
> (1) convert the $src from f16 to f32 using FEXTsr.
> (2) use the F2Hsr to convert the f32 back to f16.
> for testing.
> however, I always got the error
> ”
> Type inference contradiction found, merging 'f32' into 'f16'
> def :Pat<( f16 (int_my_math_f16 f16:$src)), (F_2_F16sr (FEXTsr f16:$src) )>;
>
> “
>
>
> Wondering what is the reason? I noticed that LLVM does not have the
> intrinsic type “LLVM_f16_ty”, so I always use “LLVM_float_ty” for it as long
> as it is a float or half.
Hi Kevin,
In "llvm_float_ty", "float" means f32 (as in the IR language
reference, and as defined in include/llvm/IR/Intrinsics.td). So in
your example, TableGen complains because you're feeding an f16 to an
intrinsic declared as taking an f32.
However, there's also "llvm_half_ty" in Intrinsics.td, corresponding
to f16; why not use that instead?
-Ahmed
> best
>
> Kevin
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
More information about the llvm-dev
mailing list