Jim created this revision. Jim added a reviewer: aaron.ballman. Herald added a project: clang. Herald added a subscriber: cfe-commits.
It shouldn't promote half to double or any larger precision types for fp classification builtins. Because fp classification builtins would get incorrect result with promoted argument. For example, __builtin_isnormal with a subnormal half value should return false, but it is not. That the subnormal half value is promoted to a normal double value. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D71049 Files: clang/lib/Sema/SemaChecking.cpp Index: clang/lib/Sema/SemaChecking.cpp =================================================================== --- clang/lib/Sema/SemaChecking.cpp +++ clang/lib/Sema/SemaChecking.cpp @@ -5808,7 +5808,7 @@ << OrigArg->getType() << OrigArg->getSourceRange(); // If this is an implicit conversion from float -> float, double, or - // long double, remove it. + // long double, or half -> half, float, double, or long double, remove it. if (ImplicitCastExpr *Cast = dyn_cast<ImplicitCastExpr>(OrigArg)) { // Only remove standard FloatCasts, leaving other casts inplace if (Cast->getCastKind() == CK_FloatingCast) { @@ -5823,6 +5823,18 @@ Cast->setSubExpr(nullptr); TheCall->setArg(NumArgs-1, CastArg); } + + if (CastArg->getType()->isSpecificBuiltinType(BuiltinType::Half)) { + assert( + (Cast->getType()->isSpecificBuiltinType(BuiltinType::Double) || + Cast->getType()->isSpecificBuiltinType(BuiltinType::Float) || + Cast->getType()->isSpecificBuiltinType(BuiltinType::Half) || + Cast->getType()->isSpecificBuiltinType(BuiltinType::LongDouble)) && + "promotion from half to either half, float, double, or long double " + "is the only expected cast here"); + Cast->setSubExpr(nullptr); + TheCall->setArg(NumArgs-1, CastArg); + } } }
Index: clang/lib/Sema/SemaChecking.cpp =================================================================== --- clang/lib/Sema/SemaChecking.cpp +++ clang/lib/Sema/SemaChecking.cpp @@ -5808,7 +5808,7 @@ << OrigArg->getType() << OrigArg->getSourceRange(); // If this is an implicit conversion from float -> float, double, or - // long double, remove it. + // long double, or half -> half, float, double, or long double, remove it. if (ImplicitCastExpr *Cast = dyn_cast<ImplicitCastExpr>(OrigArg)) { // Only remove standard FloatCasts, leaving other casts inplace if (Cast->getCastKind() == CK_FloatingCast) { @@ -5823,6 +5823,18 @@ Cast->setSubExpr(nullptr); TheCall->setArg(NumArgs-1, CastArg); } + + if (CastArg->getType()->isSpecificBuiltinType(BuiltinType::Half)) { + assert( + (Cast->getType()->isSpecificBuiltinType(BuiltinType::Double) || + Cast->getType()->isSpecificBuiltinType(BuiltinType::Float) || + Cast->getType()->isSpecificBuiltinType(BuiltinType::Half) || + Cast->getType()->isSpecificBuiltinType(BuiltinType::LongDouble)) && + "promotion from half to either half, float, double, or long double " + "is the only expected cast here"); + Cast->setSubExpr(nullptr); + TheCall->setArg(NumArgs-1, CastArg); + } } }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits