[clang] [Clang][CodeGen] Avoid emitting poison immargs for __builtin_prefetch (PR #201623)

via cfe-commits cfe-commits at lists.llvm.org
Sat Jun 6 05:15:05 PDT 2026


https://github.com/jjppp updated https://github.com/llvm/llvm-project/pull/201623

>From 791287b5b1da77830b8a71e48bb4a3a46fc4f94e Mon Sep 17 00:00:00 2001
From: jpwang <jpwang at smail.nju.edu.cn>
Date: Fri, 5 Jun 2026 00:37:01 +0800
Subject: [PATCH] [Clang][CodeGen] Avoid failing downcast when
 __builtin_prefetch's immarg is poison

---
 clang/lib/CodeGen/CGBuiltin.cpp          | 10 ++++++----
 clang/test/CodeGen/prefetch-poison-arg.c |  6 ++++++
 2 files changed, 12 insertions(+), 4 deletions(-)
 create mode 100644 clang/test/CodeGen/prefetch-poison-arg.c

diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index 7ce38c5d1922c..038517738d674 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -4305,11 +4305,13 @@ 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) ? EmitScalarExpr(E->getArg(1)) :
-      llvm::ConstantInt::get(Int32Ty, 0);
-    Locality = (E->getNumArgs() > 2) ? EmitScalarExpr(E->getArg(2)) :
-      llvm::ConstantInt::get(Int32Ty, 3);
+    RW = (E->getNumArgs() > 1) ? EmitScalarOrConstFoldImmArg(ICEArguments, 1, E)
+                               : llvm::ConstantInt::get(Int32Ty, 0);
+    Locality = (E->getNumArgs() > 2)
+                   ? EmitScalarOrConstFoldImmArg(ICEArguments, 2, E)
+                   : llvm::ConstantInt::get(Int32Ty, 3);
     Value *Data = llvm::ConstantInt::get(Int32Ty, 1);
     Function *F = CGM.getIntrinsic(Intrinsic::prefetch, Address->getType());
     Builder.CreateCall(F, {Address, RW, Locality, Data});
diff --git a/clang/test/CodeGen/prefetch-poison-arg.c b/clang/test/CodeGen/prefetch-poison-arg.c
new file mode 100644
index 0000000000000..3902352d3f117
--- /dev/null
+++ b/clang/test/CodeGen/prefetch-poison-arg.c
@@ -0,0 +1,6 @@
+// RUN: %clang_cc1 -triple x86_64-pc-linux -emit-llvm %s -o - | FileCheck %s
+
+void test_poison_rw(void) {
+  __builtin_prefetch(0, 2 >> 32, 2 >> 32);
+  // CHECK: call void @llvm.prefetch.p0(ptr null, i32 {{-?[0-9]+}}, i32 {{-?[0-9]+}}, i32 1)
+}



More information about the cfe-commits mailing list