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.veli...@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); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits