[clang] Reapply "[clang] Convert second arg of __builtin_assume_aligned to Co… (PR #161945)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 3 21:47:29 PDT 2025
https://github.com/tbaederr created https://github.com/llvm/llvm-project/pull/161945
…nstantExpr (#161314)" (#161719)
This reverts commit f1650cf91b01470ce44f47797663d59f00828493.
>From 0a09022d5d8c736d1d1564034fee9f9ed7f3263e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Sat, 4 Oct 2025 06:45:55 +0200
Subject: [PATCH] Reapply "[clang] Convert second arg of
__builtin_assume_aligned to ConstantExpr (#161314)" (#161719)
This reverts commit f1650cf91b01470ce44f47797663d59f00828493.
---
clang/docs/ReleaseNotes.rst | 2 ++
clang/lib/CodeGen/CGExprScalar.cpp | 7 ++++++-
clang/lib/Sema/SemaChecking.cpp | 3 +++
clang/test/SemaCXX/builtin-assume-aligned.cpp | 13 +++++++++++++
4 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index d2e5bd284d350..7d07c3d9a0be7 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -250,6 +250,8 @@ Non-comprehensive list of changes in this release
- ``__builtin_assume_dereferenceable`` now accepts non-constant size operands.
+- Fixed a crash when the second argument to ``__builtin_assume_aligned`` was not constant (#GH161314)
+
New Compiler Flags
------------------
- New option ``-fno-sanitize-debug-trap-reasons`` added to disable emitting trap reasons into the debug info when compiling with trapping UBSan (e.g. ``-fsanitize-trap=undefined``).
diff --git a/clang/lib/CodeGen/CGExprScalar.cpp b/clang/lib/CodeGen/CGExprScalar.cpp
index f319b176513f8..c961222766475 100644
--- a/clang/lib/CodeGen/CGExprScalar.cpp
+++ b/clang/lib/CodeGen/CGExprScalar.cpp
@@ -465,11 +465,16 @@ class ScalarExprEmitter
return nullptr;
if (Value *Result = ConstantEmitter(CGF).tryEmitConstantExpr(E)) {
- if (E->isGLValue())
+ if (E->isGLValue()) {
+ // This was already converted to an rvalue when it was constant
+ // evaluated.
+ if (E->hasAPValueResult() && !E->getAPValueResult().isLValue())
+ return Result;
return CGF.EmitLoadOfScalar(
Address(Result, CGF.convertTypeForLoadStore(E->getType()),
CGF.getContext().getTypeAlignInChars(E->getType())),
/*Volatile*/ false, E->getType(), E->getExprLoc());
+ }
return Result;
}
return Visit(E->getSubExpr());
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 7ce3513fe0969..3cc61b167ba98 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -5954,6 +5954,9 @@ bool Sema::BuiltinAssumeAligned(CallExpr *TheCall) {
if (Result > Sema::MaximumAlignment)
Diag(TheCall->getBeginLoc(), diag::warn_assume_aligned_too_great)
<< SecondArg->getSourceRange() << Sema::MaximumAlignment;
+
+ TheCall->setArg(1,
+ ConstantExpr::Create(Context, SecondArg, APValue(Result)));
}
if (NumArgs > 2) {
diff --git a/clang/test/SemaCXX/builtin-assume-aligned.cpp b/clang/test/SemaCXX/builtin-assume-aligned.cpp
index 48bd8414fc50a..7bcf1427b020b 100644
--- a/clang/test/SemaCXX/builtin-assume-aligned.cpp
+++ b/clang/test/SemaCXX/builtin-assume-aligned.cpp
@@ -47,3 +47,16 @@ constexpr void *s1 = __builtin_assume_aligned(x, 32);
constexpr void *s2 = __builtin_assume_aligned(x, 32, 5);
constexpr void *s3 = __builtin_assume_aligned(x, 32, -1);
+
+constexpr int add(int a, int b) {
+ return a+b;
+}
+constexpr void *c1 = __builtin_assume_aligned(p, add(1,1));
+constexpr void *c2 = __builtin_assume_aligned(p, add(2,1)); // expected-error {{not a power of 2}}
+
+constexpr long kAlignment = 128;
+long AllocateAlignedBytes_payload;
+void AllocateAlignedBytes() {
+ __builtin_assume_aligned(
+ reinterpret_cast<void *>(AllocateAlignedBytes_payload), kAlignment);
+}
More information about the cfe-commits
mailing list