[clang] [Arm] Generate explicit bitcasts in NeonEmitter (PR #121802)
Momchil Velikov via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 14 07:21:28 PST 2025
https://github.com/momchil-velikov updated https://github.com/llvm/llvm-project/pull/121802
>From 6a565f4a894fcc7abf35f8bbd3f141ccee5cb301 Mon Sep 17 00:00:00 2001
From: Momchil Velikov <momchil.velikov at arm.com>
Date: Tue, 14 Jan 2025 14:49:11 +0000
Subject: [PATCH] [AArch64] Fix generating a code with UB in NeonEmitter
When generating `arm_neon.h`, NeonEmitter outputs code that
violates strict aliasing rules (C23 6.5 Expressions #7,
C++23 7.2.1 Value category [basic.lval] #11).
This patch fixed the offending code by replacing it with
a call to `__builtin_bit_cast`.
---
clang/utils/TableGen/NeonEmitter.cpp | 20 +++-----------------
1 file changed, 3 insertions(+), 17 deletions(-)
diff --git a/clang/utils/TableGen/NeonEmitter.cpp b/clang/utils/TableGen/NeonEmitter.cpp
index d7d649dd2456d5..49633bb7b7f584 100644
--- a/clang/utils/TableGen/NeonEmitter.cpp
+++ b/clang/utils/TableGen/NeonEmitter.cpp
@@ -1592,24 +1592,10 @@ Intrinsic::DagEmitter::emitDagCast(const DagInit *DI, bool IsBitCast) {
}
std::string S;
- if (IsBitCast) {
- // Emit a reinterpret cast. The second operand must be an lvalue, so create
- // a temporary.
- std::string N = "reint";
- unsigned I = 0;
- while (Intr.Variables.find(N) != Intr.Variables.end())
- N = "reint" + utostr(++I);
- Intr.Variables[N] = Variable(R.first, N + Intr.VariablePostfix);
-
- Intr.OS << R.first.str() << " " << Intr.Variables[N].getName() << " = "
- << R.second << ";";
- Intr.emitNewLine();
-
- S = "*(" + castToType.str() + " *) &" + Intr.Variables[N].getName() + "";
- } else {
- // Emit a normal (static) cast.
+ if (IsBitCast)
+ S = "__builtin_bit_cast(" + castToType.str() + ", " + R.second + ")";
+ else
S = "(" + castToType.str() + ")(" + R.second + ")";
- }
return std::make_pair(castToType, S);
}
More information about the cfe-commits
mailing list