-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[clang][bytecode] Implement (N)EQ between fixed point and integral #110358
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Convert the non-fixed-point side to a fixed-point type before doing the comparison.
@llvm/pr-subscribers-clang Author: Timm Baeder (tbaederr) ChangesConvert the non-fixed-point side to a fixed-point type before doing the comparison. Full diff: https://github.com/llvm/llvm-project/pull/110358.diff 3 Files Affected:
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 8875fc05d24bee..a80d973056db43 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -773,6 +773,8 @@ bool Compiler<Emitter>::VisitBinaryOperator(const BinaryOperator *BO) {
RHS->getType()->isAnyComplexType()) &&
BO->isComparisonOp())
return this->emitComplexComparison(LHS, RHS, BO);
+ if (LHS->getType()->isFixedPointType() || RHS->getType()->isFixedPointType())
+ return this->VisitFixedPointBinOp(BO);
if (BO->isPtrMemOp()) {
if (!this->visit(LHS))
@@ -1469,6 +1471,55 @@ bool Compiler<Emitter>::VisitVectorBinOp(const BinaryOperator *E) {
return true;
}
+template <class Emitter>
+bool Compiler<Emitter>::VisitFixedPointBinOp(const BinaryOperator *E) {
+ const Expr *LHS = E->getLHS();
+ const Expr *RHS = E->getRHS();
+
+ assert(LHS->getType()->isFixedPointType() ||
+ RHS->getType()->isFixedPointType());
+
+ if (!this->visit(LHS))
+ return false;
+ if (!LHS->getType()->isFixedPointType()) {
+ auto Sem = Ctx.getASTContext().getFixedPointSemantics(LHS->getType());
+ uint32_t I;
+ std::memcpy(&I, &Sem, sizeof(Sem));
+ if (!this->emitCastIntegralFixedPoint(classifyPrim(LHS->getType()), I, E))
+ return false;
+ }
+ if (!this->visit(RHS))
+ return false;
+ if (!RHS->getType()->isFixedPointType()) {
+ auto Sem = Ctx.getASTContext().getFixedPointSemantics(RHS->getType());
+ uint32_t I;
+ std::memcpy(&I, &Sem, sizeof(Sem));
+ if (!this->emitCastIntegralFixedPoint(classifyPrim(RHS->getType()), I, E))
+ return false;
+ }
+
+ switch (E->getOpcode()) {
+ case BO_EQ:
+ return this->emitEQFixedPoint(E);
+ case BO_NE:
+ return this->emitNEFixedPoint(E);
+#if 0
+ case BO_LT:
+ return this->emitLTFixedPoint(E);
+ case BO_LE:
+ return this->emitLEFixedPoint(E);
+ case BO_GT:
+ return this->emitGTFixedPoint(E);
+ case BO_GE:
+ return this->emitGEFixedPoint(E);
+#endif
+ default:
+ return this->emitInvalid(E);
+ }
+
+ llvm_unreachable("unhandled binop opcode");
+}
+
template <class Emitter>
bool Compiler<Emitter>::VisitImplicitValueInitExpr(
const ImplicitValueInitExpr *E) {
diff --git a/clang/lib/AST/ByteCode/Compiler.h b/clang/lib/AST/ByteCode/Compiler.h
index d1911f11603a08..5349b184572b6e 100644
--- a/clang/lib/AST/ByteCode/Compiler.h
+++ b/clang/lib/AST/ByteCode/Compiler.h
@@ -132,6 +132,7 @@ class Compiler : public ConstStmtVisitor<Compiler<Emitter>, bool>,
bool VisitPointerArithBinOp(const BinaryOperator *E);
bool VisitComplexBinOp(const BinaryOperator *E);
bool VisitVectorBinOp(const BinaryOperator *E);
+ bool VisitFixedPointBinOp(const BinaryOperator *E);
bool VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E);
bool VisitCallExpr(const CallExpr *E);
bool VisitBuiltinCallExpr(const CallExpr *E, unsigned BuiltinID);
diff --git a/clang/test/AST/ByteCode/fixed-point.cpp b/clang/test/AST/ByteCode/fixed-point.cpp
index 77000c08918256..51ea166748730c 100644
--- a/clang/test/AST/ByteCode/fixed-point.cpp
+++ b/clang/test/AST/ByteCode/fixed-point.cpp
@@ -6,17 +6,22 @@ static_assert(!((bool)0.0k));
static_assert((bool)0.0k); // both-error {{static assertion failed}}
static_assert(1.0k == 1.0k);
+static_assert(1.0k == 1);
static_assert(1.0k != 1.0k); // both-error {{failed due to requirement '1.0k != 1.0k'}}
+static_assert(1.0k != 1); // both-error {{failed due to requirement '1.0k != 1'}}
static_assert(-12.0k == -(-(-12.0k)));
/// Zero-init.
constexpr _Accum A{};
static_assert(A == 0.0k);
+static_assert(A == 0);
namespace IntToFixedPointCast {
constexpr _Accum B = 13;
static_assert(B == 13.0k);
+ static_assert(B == 13);
constexpr _Fract sf = -1;
static_assert(sf == -1.0k);
+ static_assert(sf == -1);
}
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/88/builds/2903 Here is the relevant piece of the build log for the reference
|
Convert the non-fixed-point side to a fixed-point type before doing the comparison.