[clang] de8126d - [clang][bytecode] Fix mulc/divc op for IntegralAP types (#177565)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 23 04:04:44 PST 2026
Author: Timm Baeder
Date: 2026-01-23T13:04:39+01:00
New Revision: de8126d62a47a571b931e0f21aba0542e1d58e61
URL: https://github.com/llvm/llvm-project/commit/de8126d62a47a571b931e0f21aba0542e1d58e61
DIFF: https://github.com/llvm/llvm-project/commit/de8126d62a47a571b931e0f21aba0542e1d58e61.diff
LOG: [clang][bytecode] Fix mulc/divc op for IntegralAP types (#177565)
We need to allocate those.
Fixes https://github.com/llvm/llvm-project/issues/176740
Added:
Modified:
clang/lib/AST/ByteCode/Interp.h
clang/test/AST/ByteCode/c.c
Removed:
################################################################################
diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h
index b7de06f9a673e..cc8844e0fe90c 100644
--- a/clang/lib/AST/ByteCode/Interp.h
+++ b/clang/lib/AST/ByteCode/Interp.h
@@ -409,11 +409,19 @@ inline bool Mulc(InterpState &S, CodePtr OpPC) {
// real(Result) = (real(LHS) * real(RHS)) - (imag(LHS) * imag(RHS))
T A;
+ if constexpr (needsAlloc<T>())
+ A = S.allocAP<T>(Bits);
if (T::mul(LHSR, RHSR, Bits, &A))
return false;
+
T B;
+ if constexpr (needsAlloc<T>())
+ B = S.allocAP<T>(Bits);
if (T::mul(LHSI, RHSI, Bits, &B))
return false;
+
+ if constexpr (needsAlloc<T>())
+ Result.elem<T>(0) = S.allocAP<T>(Bits);
if (T::sub(A, B, Bits, &Result.elem<T>(0)))
return false;
@@ -422,6 +430,9 @@ inline bool Mulc(InterpState &S, CodePtr OpPC) {
return false;
if (T::mul(LHSI, RHSR, Bits, &B))
return false;
+
+ if constexpr (needsAlloc<T>())
+ Result.elem<T>(1) = S.allocAP<T>(Bits);
if (T::add(A, B, Bits, &Result.elem<T>(1)))
return false;
Result.initialize();
@@ -475,10 +486,18 @@ inline bool Divc(InterpState &S, CodePtr OpPC) {
// Den = real(RHS)² + imag(RHS)²
T A, B;
+ if constexpr (needsAlloc<T>()) {
+ A = S.allocAP<T>(Bits);
+ B = S.allocAP<T>(Bits);
+ }
+
if (T::mul(RHSR, RHSR, Bits, &A) || T::mul(RHSI, RHSI, Bits, &B)) {
// Ignore overflow here, because that's what the current interpeter does.
}
T Den;
+ if constexpr (needsAlloc<T>())
+ Den = S.allocAP<T>(Bits);
+
if (T::add(A, B, Bits, &Den))
return false;
@@ -491,7 +510,10 @@ inline bool Divc(InterpState &S, CodePtr OpPC) {
// real(Result) = ((real(LHS) * real(RHS)) + (imag(LHS) * imag(RHS))) / Den
T &ResultR = Result.elem<T>(0);
T &ResultI = Result.elem<T>(1);
-
+ if constexpr (needsAlloc<T>()) {
+ ResultR = S.allocAP<T>(Bits);
+ ResultI = S.allocAP<T>(Bits);
+ }
if (T::mul(LHSR, RHSR, Bits, &A) || T::mul(LHSI, RHSI, Bits, &B))
return false;
if (T::add(A, B, Bits, &ResultR))
diff --git a/clang/test/AST/ByteCode/c.c b/clang/test/AST/ByteCode/c.c
index 67a47fdcc9523..7b98aa84a482c 100644
--- a/clang/test/AST/ByteCode/c.c
+++ b/clang/test/AST/ByteCode/c.c
@@ -417,3 +417,11 @@ void callReturnsComplex(void) {
_Complex double c;
c = returnsComplex(0.); // all-warning {{passing arguments to 'returnsComplex' without a prototype is deprecated in all versions of C and is not supported in C23}}
}
+
+int complexMul[2 * (22222222222wb + 2i) == 2]; // all-warning {{'_BitInt' suffix for literals is a C23 extension}} \
+ // pedantic-warning {{imaginary constants are a C2y extension}} \
+ // all-warning {{variable length array folded to constant array as an extension}}
+
+int complexDiv[2 / (22222222222wb + 2i) == 2]; // all-warning {{'_BitInt' suffix for literals is a C23 extension}} \
+ // pedantic-warning {{imaginary constants are a C2y extension}} \
+ // all-warning {{variable length array folded to constant array as an extension}}
More information about the cfe-commits
mailing list