[PATCH] D71049: Remove implicit conversion that promotes half to other larger precision types for fp classification builtins
Jim Lin via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 4 23:16:32 PST 2019
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);
+ }
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D71049.232262.patch
Type: text/x-patch
Size: 1391 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20191205/07d33d22/attachment-0001.bin>
More information about the cfe-commits
mailing list