https://github.com/mygitljf updated 
https://github.com/llvm/llvm-project/pull/202111

>From e91ba5cc2caca2209d576715bbedc12d242dfceb Mon Sep 17 00:00:00 2001
From: mygitljf <[email protected]>
Date: Sun, 7 Jun 2026 07:49:54 +0000
Subject: [PATCH 1/2] [clang] Emit i32 prefetch args

---
 clang/lib/CodeGen/CGBuiltin.cpp |  1 -
 clang/lib/Sema/SemaChecking.cpp |  7 ++++++-
 clang/test/CodeGen/PR32874.c    | 10 ++++++++++
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 682b125890fe1..17c3b9d97e4c4 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -4289,7 +4289,6 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl 
GD, unsigned BuiltinID,
   case Builtin::BI__builtin_prefetch: {
     Value *Locality, *RW, *Address = EmitScalarExpr(E->getArg(0));
     unsigned ICEArguments = (1 << 1) | (1 << 2);
-    // FIXME: Technically these constants should of type 'int', yes?
     RW = (E->getNumArgs() > 1) ? EmitScalarOrConstFoldImmArg(ICEArguments, 1, 
E)
                                : llvm::ConstantInt::get(Int32Ty, 0);
     Locality = (E->getNumArgs() > 2)
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 5e5fcb39905d6..6fec6468d87b2 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -6492,10 +6492,15 @@ bool Sema::BuiltinPrefetch(CallExpr *TheCall) {
 
   // Argument 0 is checked for us and the remaining arguments must be
   // constant integers.
-  for (unsigned i = 1; i != NumArgs; ++i)
+  for (unsigned i = 1; i != NumArgs; ++i) {
     if (BuiltinConstantArgRange(TheCall, i, 0, i == 1 ? 1 : 3))
       return true;
 
+    ExprResult Arg =
+        ImpCastExprToType(TheCall->getArg(i), Context.IntTy, CK_IntegralCast);
+    TheCall->setArg(i, Arg.get());
+  }
+
   return false;
 }
 
diff --git a/clang/test/CodeGen/PR32874.c b/clang/test/CodeGen/PR32874.c
index 234eebcbe4574..665b327528b0a 100644
--- a/clang/test/CodeGen/PR32874.c
+++ b/clang/test/CodeGen/PR32874.c
@@ -23,6 +23,16 @@ void foo(const int *p) {
   __builtin_prefetch(p, 3U % 2U, 3U % 1U);
 }
 
+// CHECK-LABEL: define{{.*}} void @prefetch_non_int_constant_types
+// CHECK: call void @llvm.prefetch.p0(ptr {{.*}}, i32 0, i32 3, i32 1)
+// CHECK: call void @llvm.prefetch.p0(ptr {{.*}}, i32 0, i32 0, i32 1)
+// CHECK: call void @llvm.prefetch.p0(ptr {{.*}}, i32 1, i32 3, i32 1)
+void prefetch_non_int_constant_types(const int *p) {
+  __builtin_prefetch(p, 0 * sizeof(int));
+  __builtin_prefetch(p, 0, 0 * sizeof(int));
+  __builtin_prefetch(p, 1ULL, 3ULL);
+}
+
 // CHECK-LABEL: define{{.*}} void @ub_constant_arithmetic
 void ub_constant_arithmetic(void) {
   // Check that we still instrument unsafe arithmetic, even if it is known to

>From 52f24882a63f496e02a585694b169605064a5434 Mon Sep 17 00:00:00 2001
From: mygitljf <[email protected]>
Date: Thu, 16 Jul 2026 10:49:39 +0800
Subject: [PATCH 2/2] [clang] Convert prefetch arguments before range checking

---
 clang/lib/Sema/SemaChecking.cpp      |  9 +++++----
 clang/test/Sema/builtin-prefetch.c   |  2 +-
 clang/test/SemaCXX/prefetch-enum.cpp | 10 ++++++++++
 3 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 6fec6468d87b2..e7c5b38f7e799 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -6493,12 +6493,13 @@ bool Sema::BuiltinPrefetch(CallExpr *TheCall) {
   // Argument 0 is checked for us and the remaining arguments must be
   // constant integers.
   for (unsigned i = 1; i != NumArgs; ++i) {
-    if (BuiltinConstantArgRange(TheCall, i, 0, i == 1 ? 1 : 3))
+    Expr *Arg = TheCall->getArg(i);
+    if (convertArgumentToType(*this, Arg, Context.IntTy))
       return true;
+    TheCall->setArg(i, Arg);
 
-    ExprResult Arg =
-        ImpCastExprToType(TheCall->getArg(i), Context.IntTy, CK_IntegralCast);
-    TheCall->setArg(i, Arg.get());
+    if (BuiltinConstantArgRange(TheCall, i, 0, i == 1 ? 1 : 3))
+      return true;
   }
 
   return false;
diff --git a/clang/test/Sema/builtin-prefetch.c 
b/clang/test/Sema/builtin-prefetch.c
index 16029b60690f6..521c0d975cfbe 100644
--- a/clang/test/Sema/builtin-prefetch.c
+++ b/clang/test/Sema/builtin-prefetch.c
@@ -6,7 +6,7 @@ void foo(void) {
   __builtin_prefetch(&a, 1);
   __builtin_prefetch(&a, 1, 2);
   __builtin_prefetch(&a, 1, 9, 3); // expected-error{{too many arguments to 
function}}
-  __builtin_prefetch(&a, "hello", 2); // expected-error{{argument to 
'__builtin_prefetch' must be a constant integer}}
+  __builtin_prefetch(&a, "hello", 2); // expected-error{{incompatible pointer 
to integer conversion passing 'char *' to parameter of type 'int'}} 
expected-error{{argument to '__builtin_prefetch' must be a constant integer}}
   __builtin_prefetch(&a, a, 2); // expected-error{{argument to 
'__builtin_prefetch' must be a constant integer}}
   __builtin_prefetch(&a, 2); // expected-error{{argument value 2 is outside 
the valid range [0, 1]}}
   __builtin_prefetch(&a, 0, 4); // expected-error{{argument value 4 is outside 
the valid range [0, 3]}}
diff --git a/clang/test/SemaCXX/prefetch-enum.cpp 
b/clang/test/SemaCXX/prefetch-enum.cpp
index 5457bbe498fff..f0f481c33a56e 100644
--- a/clang/test/SemaCXX/prefetch-enum.cpp
+++ b/clang/test/SemaCXX/prefetch-enum.cpp
@@ -4,7 +4,17 @@
 
 enum X { A = 3 };
 
+struct ReadWrite {
+  constexpr operator int() const { return 1; }
+};
+
+struct Locality {
+  constexpr operator int() const { return 3; }
+};
+
 void Test() {
   char ch;
   __builtin_prefetch(&ch, 0, A);
+  __builtin_prefetch(&ch, ReadWrite());
+  __builtin_prefetch(&ch, 0, Locality());
 }

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to