[cfe-dev] [OpenCL patch] Half type as native when OpenCL's cl_khr_fp16 extension is enabled
John Garvin
jgarvin at apple.com
Mon Jun 4 17:35:56 PDT 2012
Two small comments, if I may:
@@ -348,13 +351,18 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
// FIXME: Ask target which kind of half FP it prefers (storage only vs
// native).
- ResultType = llvm::Type::getInt16Ty(getLLVMContext());
+ if (Context.getLangOpts().OpenCL)
+ ResultType = getTypeForFormat(getLLVMContext(),
+ Context.getFloatTypeSemantics(T), /* isOpenCL = */ true);
+ else
+ ResultType = llvm::Type::getInt16Ty(getLLVMContext());
break;
case BuiltinType::Float:
case BuiltinType::Double:
It seems like the if is unnecessary here, since the logic is already in getTypeForFormat.
@@ -1763,7 +1763,8 @@ bool Sema::IsFloatingPointPromotion(QualType FromType, QualType ToType) {
return true;
// Half can be promoted to float.
- if (FromBuiltin->getKind() == BuiltinType::Half &&
+ if (!(getLangOpts().OpenCL || getOpenCLOptions().cl_khr_fp16) &&
+ FromBuiltin->getKind() == BuiltinType::Half &&
ToBuiltin->getKind() == BuiltinType::Float)
return true;
}
Did you mean the following? As written, it returns true in the OpenCL case whether or not cl_khr_fp16 is true.
if ((!getLangOpts().OpenCL || getOpenCLOptions().cl_khr_fp16) &&
John
On May 17, 2012, at 5:06 AM, Anton Lokhmotov wrote:
> Hi David,
>
> Many thanks for your comments.
>
>> Generally the code changes look good. I would like to see some test
>> cases for code generation updates:
>> - half constant generation
>> - conversion to and from half, with other type being "float"
> Please see new test/CodeGenOpenCL/half.cl.
>
>> - ++ and --
> OpenCL 1.1 forbids using the increment and decrement operators on
> floating-point values. We haven't open-sourced the semantic check for this,
> so it's hard for us to test. However, incrementing and decrementing a half
> variable by 2.0f is done in the above test.
>
>> I have one detailed comment:
>> The following part of the patch seems unnecessary.
>> I think the existing code should work because the HalfTypeID should be
>> lower than the other floating types?
>>
>> @@ -641,7 +641,10 @@ Value
>> *ScalarExprEmitter::EmitScalarConversion(Value *Src, QualType SrcType,
>> } else {
>> assert(SrcTy->isFloatingPointTy() && DstTy->isFloatingPointTy()
>> &&
>> "Unknown real conversion");
>> - if (DstTy->getTypeID() < SrcTy->getTypeID())
>> + int DstId = DstTy->getTypeID();
>> + int SrcId = Src->getType()->getTypeID();
>> + if ((SrcId != llvm::Type::HalfTyID && DstId < SrcId) ||
>> + DstId == llvm::Type::HalfTyID)
>> Res = Builder.CreateFPTrunc(Src, DstTy, "conv");
>> else
>> Res = Builder.CreateFPExt(Src, DstTy, "conv");
> Good point! Removed.
>
> Many thanks,
> Anton.<half-clang.patch>_______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
More information about the cfe-dev
mailing list