[clang] [clang][bytecode] Cast fixed-point cmp result to int if necessary (PR #110469)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 30 02:01:36 PDT 2024
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/110469
This is the case in C.
>From 4c2de21a53bc6b048c3d7fc8e2a333fd7d13cdcb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Mon, 30 Sep 2024 11:00:37 +0200
Subject: [PATCH] [clang][bytecode] Cast fixed-point cmp result to int if
necessary
This is the case in C.
---
clang/lib/AST/ByteCode/Compiler.cpp | 23 ++++++++++++++-----
clang/test/Frontend/fixed_point_comparisons.c | 3 +++
2 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index c24c4b6db2a5bf..5ad5899739909f 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -1542,19 +1542,30 @@ bool Compiler<Emitter>::VisitFixedPointBinOp(const BinaryOperator *E) {
return true;
};
+ auto MaybeCastToBool = [&](bool Result) {
+ if (!Result)
+ return false;
+ PrimType T = classifyPrim(E);
+ if (DiscardResult)
+ return this->emitPop(T, E);
+ if (T != PT_Bool)
+ return this->emitCast(PT_Bool, T, E);
+ return true;
+ };
+
switch (E->getOpcode()) {
case BO_EQ:
- return this->emitEQFixedPoint(E);
+ return MaybeCastToBool(this->emitEQFixedPoint(E));
case BO_NE:
- return this->emitNEFixedPoint(E);
+ return MaybeCastToBool(this->emitNEFixedPoint(E));
case BO_LT:
- return this->emitLTFixedPoint(E);
+ return MaybeCastToBool(this->emitLTFixedPoint(E));
case BO_LE:
- return this->emitLEFixedPoint(E);
+ return MaybeCastToBool(this->emitLEFixedPoint(E));
case BO_GT:
- return this->emitGTFixedPoint(E);
+ return MaybeCastToBool(this->emitGTFixedPoint(E));
case BO_GE:
- return this->emitGEFixedPoint(E);
+ return MaybeCastToBool(this->emitGEFixedPoint(E));
case BO_Add:
return ConvertResult(this->emitAddFixedPoint(E));
case BO_Sub:
diff --git a/clang/test/Frontend/fixed_point_comparisons.c b/clang/test/Frontend/fixed_point_comparisons.c
index 59c4405e41c031..39e62bce51e2b2 100644
--- a/clang/test/Frontend/fixed_point_comparisons.c
+++ b/clang/test/Frontend/fixed_point_comparisons.c
@@ -1,6 +1,9 @@
// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,UNPADDED
// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -fpadding-on-unsigned-fixed-point -emit-llvm %s -o - | FileCheck %s --check-prefixes=CHECK,PADDED
+// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -emit-llvm %s -o - -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,UNPADDED
+// RUN: %clang_cc1 -ffixed-point -triple x86_64-unknown-linux-gnu -fpadding-on-unsigned-fixed-point -emit-llvm %s -o - -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,PADDED
+
// Fixed point against other fixed point
_Bool b_eq_true = 2.5hk == 2.5uhk; // CHECK-DAG: @b_eq_true = {{.*}}global i8 1, align 1
_Bool b_eq_false = 2.5hk == 2.4uhk; // CHECK-DAG: @b_eq_false = {{.*}}global i8 0, align 1
More information about the cfe-commits
mailing list