Skip to content

[AArch64] Add support for intent to read prefetch intrinsic#179709

Merged
kmclaughlin-arm merged 2 commits intollvm:mainfrom
kmclaughlin-arm:pldir-builtin
Feb 10, 2026
Merged

[AArch64] Add support for intent to read prefetch intrinsic#179709
kmclaughlin-arm merged 2 commits intollvm:mainfrom
kmclaughlin-arm:pldir-builtin

Conversation

@kmclaughlin-arm
Copy link
Copy Markdown
Contributor

This patch adds support in Clang for the PRFM IR instruction, by adding the following builtin:

void __pldir(void const *addr);

This builtin is described in the following ACLE proposal: ARM-software/acle#406

This patch adds support in Clang for the PRFM IR instruction, by
adding the following builtin:

```
void __pldir(void const *addr);
```

This builtin is described in the following ACLE proposal:
ARM-software/acle#406
@llvmbot llvmbot added backend:AArch64 backend:X86 clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:headers Headers provided by Clang, e.g. for intrinsics llvm:ir labels Feb 4, 2026
@llvmbot
Copy link
Copy Markdown
Member

llvmbot commented Feb 4, 2026

@llvm/pr-subscribers-backend-aarch64

@llvm/pr-subscribers-backend-x86

Author: Kerry McLaughlin (kmclaughlin-arm)

Changes

This patch adds support in Clang for the PRFM IR instruction, by adding the following builtin:

void __pldir(void const *addr);

This builtin is described in the following ACLE proposal: ARM-software/acle#406


Full diff: https://github.com/llvm/llvm-project/pull/179709.diff

10 Files Affected:

  • (modified) clang/include/clang/Basic/BuiltinsAArch64.def (+2)
  • (modified) clang/lib/Headers/arm_acle.h (+1)
  • (modified) clang/test/CodeGen/arm_acle.c (+13)
  • (modified) clang/test/CodeGen/builtins-arm64.c (+5)
  • (modified) llvm/include/llvm/IR/IntrinsicsAArch64.td (+5)
  • (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp (+5)
  • (modified) llvm/lib/Target/AArch64/AArch64SystemOperands.td (+1)
  • (modified) llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp (+6)
  • (added) llvm/test/CodeGen/AArch64/arm64-prefetch-ri.ll (+12)
  • (modified) llvm/test/MC/AArch64/armv9.6a-pcdphint.s (+9-1)
diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def b/clang/include/clang/Basic/BuiltinsAArch64.def
index 5ae5affb51fde..5d7e956b73b87 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -96,6 +96,8 @@ TARGET_BUILTIN(__builtin_arm_jcvt, "Zid", "nc", "v8.3a")
 // Prefetch
 BUILTIN(__builtin_arm_prefetch, "vvC*UiUiUiUi", "nc")
 
+BUILTIN(__builtin_arm_prefetch_ir, "vvC*", "nc")
+
 // Range Prefetch
 BUILTIN(__builtin_arm_range_prefetch_x, "vvC*UiUiiUiiz", "n")
 BUILTIN(__builtin_arm_range_prefetch, "vvC*UiUiWUi", "n")
diff --git a/clang/lib/Headers/arm_acle.h b/clang/lib/Headers/arm_acle.h
index 622e8f3d6aa7b..9a6b6a837fa5a 100644
--- a/clang/lib/Headers/arm_acle.h
+++ b/clang/lib/Headers/arm_acle.h
@@ -115,6 +115,7 @@ __swp(uint32_t __x, volatile uint32_t *__p) {
 #else
 #define __plix(cache_level, retention_policy, addr) \
   __builtin_arm_prefetch(addr, 0, cache_level, retention_policy, 0)
+#define __pldir(addr) __builtin_arm_prefetch_ir(addr)
 #endif
 
 /* 7.7 NOP */
diff --git a/clang/test/CodeGen/arm_acle.c b/clang/test/CodeGen/arm_acle.c
index 2606ad6dd2ec1..b053778581134 100644
--- a/clang/test/CodeGen/arm_acle.c
+++ b/clang/test/CodeGen/arm_acle.c
@@ -186,6 +186,19 @@ void test_pldx_range() {
 
 #endif
 
+#if defined(__ARM_64BIT_STATE)
+
+// AArch64-LABEL: @test_pldir(
+// AArch64-NEXT:  entry:
+// AArch64-NEXT:    call void @llvm.aarch64.prefetch.ir(ptr null)
+// AArch64-NEXT:    ret void
+//
+void test_pldir() {
+  __pldir(0);
+}
+
+#endif
+
 // AArch32-LABEL: @test_pldx(
 // AArch32-NEXT:  entry:
 // AArch32-NEXT:    call void @llvm.prefetch.p0(ptr null, i32 1, i32 3, i32 1)
diff --git a/clang/test/CodeGen/builtins-arm64.c b/clang/test/CodeGen/builtins-arm64.c
index c1fd348371f38..3d054c79f1777 100644
--- a/clang/test/CodeGen/builtins-arm64.c
+++ b/clang/test/CodeGen/builtins-arm64.c
@@ -111,6 +111,11 @@ void range_prefetch_x(void) {
   // CHECK: call {{.*}} @llvm.aarch64.range.prefetch(ptr null, i32 0, i32 0, i64 0)
 }
 
+void read_intent_prefetch() {
+  // CHECK: call {{.*}} @llvm.aarch64.prefetch.ir(ptr null)
+  __builtin_arm_prefetch_ir(0);
+}
+
 __attribute__((target("v8.5a")))
 int32_t jcvt(double v) {
   //CHECK-LABEL: @jcvt(
diff --git a/llvm/include/llvm/IR/IntrinsicsAArch64.td b/llvm/include/llvm/IR/IntrinsicsAArch64.td
index fd56e0e3f9e7b..7f4b7383415c1 100644
--- a/llvm/include/llvm/IR/IntrinsicsAArch64.td
+++ b/llvm/include/llvm/IR/IntrinsicsAArch64.td
@@ -76,6 +76,11 @@ def int_aarch64_prefetch : Intrinsic<[],
      ]>,
     ClangBuiltin<"__builtin_arm_prefetch">;
 
+def int_aarch64_prefetch_ir : Intrinsic<[], [llvm_ptr_ty],
+    [IntrHasSideEffects, IntrInaccessibleMemOrArgMemOnly,
+     IntrWillReturn, ReadOnly<ArgIndex<0>>]>,
+    ClangBuiltin<"__builtin_arm_prefetch_ir">;
+
 def int_aarch64_range_prefetch : Intrinsic<[],
     [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty, llvm_i64_ty],
     [IntrInaccessibleMemOrArgMemOnly, IntrWillReturn, ReadOnly<ArgIndex<0>>,
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 840298ff965e1..d460997a31c9e 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -6279,6 +6279,11 @@ SDValue AArch64TargetLowering::LowerINTRINSIC_VOID(SDValue Op,
                        DAG.getTargetConstant(PrfOp, DL, MVT::i32), Addr,
                        Metadata);
   }
+  case Intrinsic::aarch64_prefetch_ir:
+    return DAG.getNode(AArch64ISD::PREFETCH, DL, MVT::Other,
+                       Op.getOperand(0),                        // Chain
+                       DAG.getTargetConstant(24, DL, MVT::i32), // Rt
+                       Op.getOperand(2));                       // Addr
   case Intrinsic::aarch64_sme_str:
   case Intrinsic::aarch64_sme_ldr: {
     return LowerSMELdrStr(Op, DAG, IntNo == Intrinsic::aarch64_sme_ldr);
diff --git a/llvm/lib/Target/AArch64/AArch64SystemOperands.td b/llvm/lib/Target/AArch64/AArch64SystemOperands.td
index cb098751fd74d..a1ab0da7b051c 100644
--- a/llvm/lib/Target/AArch64/AArch64SystemOperands.td
+++ b/llvm/lib/Target/AArch64/AArch64SystemOperands.td
@@ -435,6 +435,7 @@ let Requires = [{ {AArch64::FeaturePRFM_SLC} }] in {
 def : PRFM<"pst", 0b10, "slc", 0b11, "keep", 0b0>;
 def : PRFM<"pst", 0b10, "slc", 0b11, "strm", 0b1>;
 }
+def : PRFM<"ir",  0b11, "",    0b00, "",     0b0>;
 
 //===----------------------------------------------------------------------===//
 // SVE Prefetch instruction options.
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 62f8237dc3b6b..2ed567a1052ca 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -1769,6 +1769,12 @@ bool AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
     MI.eraseFromParent();
     return true;
   }
+  case Intrinsic::aarch64_prefetch_ir: {
+    auto &AddrVal = MI.getOperand(1);
+    MIB.buildInstr(AArch64::G_AARCH64_PREFETCH).addImm(24).add(AddrVal);
+    MI.eraseFromParent();
+    return true;
+  }
   case Intrinsic::aarch64_neon_uaddv:
   case Intrinsic::aarch64_neon_saddv:
   case Intrinsic::aarch64_neon_umaxv:
diff --git a/llvm/test/CodeGen/AArch64/arm64-prefetch-ri.ll b/llvm/test/CodeGen/AArch64/arm64-prefetch-ri.ll
new file mode 100644
index 0000000000000..6ce616ee59b50
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/arm64-prefetch-ri.ll
@@ -0,0 +1,12 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=aarch64 -mattr=+v9a -mattr=+pcdphint --global-isel=0 < %s | FileCheck %s
+; RUN: llc -mtriple=aarch64 -mattr=+v9a -mattr=+pcdphint --global-isel=1 --global-isel-abort=1 < %s | FileCheck %s
+
+define void @read_intent_prefetch(ptr %a, i64 %metadata) {
+; CHECK-LABEL: read_intent_prefetch:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    prfm ir, [x0]
+; CHECK-NEXT:    ret
+  call void @llvm.aarch64.prefetch.ir(ptr %a)
+  ret void
+}
diff --git a/llvm/test/MC/AArch64/armv9.6a-pcdphint.s b/llvm/test/MC/AArch64/armv9.6a-pcdphint.s
index 8394171740501..b54409abe4a06 100644
--- a/llvm/test/MC/AArch64/armv9.6a-pcdphint.s
+++ b/llvm/test/MC/AArch64/armv9.6a-pcdphint.s
@@ -3,7 +3,7 @@
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ERROR
 // RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+pcdphint < %s \
-// RUN:        | llvm-objdump -d --mattr=+pcdphint - | FileCheck %s --check-prefix=CHECK-INST
+// RUN:        | llvm-objdump -d --mattr=+pcdphint --no-print-imm-hex - | FileCheck %s --check-prefix=CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+pcdphint < %s \
 // RUN:        | llvm-objdump -d --mattr=-pcdphint - | FileCheck %s --check-prefix=CHECK-UNKNOWN
 // Disassemble encoding and check the re-encoding (-show-encoding) matches.
@@ -23,3 +23,11 @@ stshh strm
 // CHECK-ENCODING: encoding: [0x3f,0x96,0x01,0xd5]
 // CHECK-ERROR: error: instruction requires: pcdphint
 // CHECK-UNKNOWN:  d501963f      msr S0_1_C9_C6_1, xzr
+
+prfm ir, [x0]
+// CHECK-INST: prfm ir, [x0]
+// CHECK-ENCODING: [0x18,0x00,0x80,0xf9]
+
+prfm ir, [x2, #800]
+// CHECK-INST: prfm ir, [x2, #800]
+// CHECK-ENCODING: [0x58,0x90,0x81,0xf9]

@llvmbot
Copy link
Copy Markdown
Member

llvmbot commented Feb 4, 2026

@llvm/pr-subscribers-llvm-ir

Author: Kerry McLaughlin (kmclaughlin-arm)

Changes

This patch adds support in Clang for the PRFM IR instruction, by adding the following builtin:

void __pldir(void const *addr);

This builtin is described in the following ACLE proposal: ARM-software/acle#406


Full diff: https://github.com/llvm/llvm-project/pull/179709.diff

10 Files Affected:

  • (modified) clang/include/clang/Basic/BuiltinsAArch64.def (+2)
  • (modified) clang/lib/Headers/arm_acle.h (+1)
  • (modified) clang/test/CodeGen/arm_acle.c (+13)
  • (modified) clang/test/CodeGen/builtins-arm64.c (+5)
  • (modified) llvm/include/llvm/IR/IntrinsicsAArch64.td (+5)
  • (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp (+5)
  • (modified) llvm/lib/Target/AArch64/AArch64SystemOperands.td (+1)
  • (modified) llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp (+6)
  • (added) llvm/test/CodeGen/AArch64/arm64-prefetch-ri.ll (+12)
  • (modified) llvm/test/MC/AArch64/armv9.6a-pcdphint.s (+9-1)
diff --git a/clang/include/clang/Basic/BuiltinsAArch64.def b/clang/include/clang/Basic/BuiltinsAArch64.def
index 5ae5affb51fde..5d7e956b73b87 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.def
+++ b/clang/include/clang/Basic/BuiltinsAArch64.def
@@ -96,6 +96,8 @@ TARGET_BUILTIN(__builtin_arm_jcvt, "Zid", "nc", "v8.3a")
 // Prefetch
 BUILTIN(__builtin_arm_prefetch, "vvC*UiUiUiUi", "nc")
 
+BUILTIN(__builtin_arm_prefetch_ir, "vvC*", "nc")
+
 // Range Prefetch
 BUILTIN(__builtin_arm_range_prefetch_x, "vvC*UiUiiUiiz", "n")
 BUILTIN(__builtin_arm_range_prefetch, "vvC*UiUiWUi", "n")
diff --git a/clang/lib/Headers/arm_acle.h b/clang/lib/Headers/arm_acle.h
index 622e8f3d6aa7b..9a6b6a837fa5a 100644
--- a/clang/lib/Headers/arm_acle.h
+++ b/clang/lib/Headers/arm_acle.h
@@ -115,6 +115,7 @@ __swp(uint32_t __x, volatile uint32_t *__p) {
 #else
 #define __plix(cache_level, retention_policy, addr) \
   __builtin_arm_prefetch(addr, 0, cache_level, retention_policy, 0)
+#define __pldir(addr) __builtin_arm_prefetch_ir(addr)
 #endif
 
 /* 7.7 NOP */
diff --git a/clang/test/CodeGen/arm_acle.c b/clang/test/CodeGen/arm_acle.c
index 2606ad6dd2ec1..b053778581134 100644
--- a/clang/test/CodeGen/arm_acle.c
+++ b/clang/test/CodeGen/arm_acle.c
@@ -186,6 +186,19 @@ void test_pldx_range() {
 
 #endif
 
+#if defined(__ARM_64BIT_STATE)
+
+// AArch64-LABEL: @test_pldir(
+// AArch64-NEXT:  entry:
+// AArch64-NEXT:    call void @llvm.aarch64.prefetch.ir(ptr null)
+// AArch64-NEXT:    ret void
+//
+void test_pldir() {
+  __pldir(0);
+}
+
+#endif
+
 // AArch32-LABEL: @test_pldx(
 // AArch32-NEXT:  entry:
 // AArch32-NEXT:    call void @llvm.prefetch.p0(ptr null, i32 1, i32 3, i32 1)
diff --git a/clang/test/CodeGen/builtins-arm64.c b/clang/test/CodeGen/builtins-arm64.c
index c1fd348371f38..3d054c79f1777 100644
--- a/clang/test/CodeGen/builtins-arm64.c
+++ b/clang/test/CodeGen/builtins-arm64.c
@@ -111,6 +111,11 @@ void range_prefetch_x(void) {
   // CHECK: call {{.*}} @llvm.aarch64.range.prefetch(ptr null, i32 0, i32 0, i64 0)
 }
 
+void read_intent_prefetch() {
+  // CHECK: call {{.*}} @llvm.aarch64.prefetch.ir(ptr null)
+  __builtin_arm_prefetch_ir(0);
+}
+
 __attribute__((target("v8.5a")))
 int32_t jcvt(double v) {
   //CHECK-LABEL: @jcvt(
diff --git a/llvm/include/llvm/IR/IntrinsicsAArch64.td b/llvm/include/llvm/IR/IntrinsicsAArch64.td
index fd56e0e3f9e7b..7f4b7383415c1 100644
--- a/llvm/include/llvm/IR/IntrinsicsAArch64.td
+++ b/llvm/include/llvm/IR/IntrinsicsAArch64.td
@@ -76,6 +76,11 @@ def int_aarch64_prefetch : Intrinsic<[],
      ]>,
     ClangBuiltin<"__builtin_arm_prefetch">;
 
+def int_aarch64_prefetch_ir : Intrinsic<[], [llvm_ptr_ty],
+    [IntrHasSideEffects, IntrInaccessibleMemOrArgMemOnly,
+     IntrWillReturn, ReadOnly<ArgIndex<0>>]>,
+    ClangBuiltin<"__builtin_arm_prefetch_ir">;
+
 def int_aarch64_range_prefetch : Intrinsic<[],
     [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty, llvm_i64_ty],
     [IntrInaccessibleMemOrArgMemOnly, IntrWillReturn, ReadOnly<ArgIndex<0>>,
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 840298ff965e1..d460997a31c9e 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -6279,6 +6279,11 @@ SDValue AArch64TargetLowering::LowerINTRINSIC_VOID(SDValue Op,
                        DAG.getTargetConstant(PrfOp, DL, MVT::i32), Addr,
                        Metadata);
   }
+  case Intrinsic::aarch64_prefetch_ir:
+    return DAG.getNode(AArch64ISD::PREFETCH, DL, MVT::Other,
+                       Op.getOperand(0),                        // Chain
+                       DAG.getTargetConstant(24, DL, MVT::i32), // Rt
+                       Op.getOperand(2));                       // Addr
   case Intrinsic::aarch64_sme_str:
   case Intrinsic::aarch64_sme_ldr: {
     return LowerSMELdrStr(Op, DAG, IntNo == Intrinsic::aarch64_sme_ldr);
diff --git a/llvm/lib/Target/AArch64/AArch64SystemOperands.td b/llvm/lib/Target/AArch64/AArch64SystemOperands.td
index cb098751fd74d..a1ab0da7b051c 100644
--- a/llvm/lib/Target/AArch64/AArch64SystemOperands.td
+++ b/llvm/lib/Target/AArch64/AArch64SystemOperands.td
@@ -435,6 +435,7 @@ let Requires = [{ {AArch64::FeaturePRFM_SLC} }] in {
 def : PRFM<"pst", 0b10, "slc", 0b11, "keep", 0b0>;
 def : PRFM<"pst", 0b10, "slc", 0b11, "strm", 0b1>;
 }
+def : PRFM<"ir",  0b11, "",    0b00, "",     0b0>;
 
 //===----------------------------------------------------------------------===//
 // SVE Prefetch instruction options.
diff --git a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
index 62f8237dc3b6b..2ed567a1052ca 100644
--- a/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
+++ b/llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp
@@ -1769,6 +1769,12 @@ bool AArch64LegalizerInfo::legalizeIntrinsic(LegalizerHelper &Helper,
     MI.eraseFromParent();
     return true;
   }
+  case Intrinsic::aarch64_prefetch_ir: {
+    auto &AddrVal = MI.getOperand(1);
+    MIB.buildInstr(AArch64::G_AARCH64_PREFETCH).addImm(24).add(AddrVal);
+    MI.eraseFromParent();
+    return true;
+  }
   case Intrinsic::aarch64_neon_uaddv:
   case Intrinsic::aarch64_neon_saddv:
   case Intrinsic::aarch64_neon_umaxv:
diff --git a/llvm/test/CodeGen/AArch64/arm64-prefetch-ri.ll b/llvm/test/CodeGen/AArch64/arm64-prefetch-ri.ll
new file mode 100644
index 0000000000000..6ce616ee59b50
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/arm64-prefetch-ri.ll
@@ -0,0 +1,12 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc -mtriple=aarch64 -mattr=+v9a -mattr=+pcdphint --global-isel=0 < %s | FileCheck %s
+; RUN: llc -mtriple=aarch64 -mattr=+v9a -mattr=+pcdphint --global-isel=1 --global-isel-abort=1 < %s | FileCheck %s
+
+define void @read_intent_prefetch(ptr %a, i64 %metadata) {
+; CHECK-LABEL: read_intent_prefetch:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    prfm ir, [x0]
+; CHECK-NEXT:    ret
+  call void @llvm.aarch64.prefetch.ir(ptr %a)
+  ret void
+}
diff --git a/llvm/test/MC/AArch64/armv9.6a-pcdphint.s b/llvm/test/MC/AArch64/armv9.6a-pcdphint.s
index 8394171740501..b54409abe4a06 100644
--- a/llvm/test/MC/AArch64/armv9.6a-pcdphint.s
+++ b/llvm/test/MC/AArch64/armv9.6a-pcdphint.s
@@ -3,7 +3,7 @@
 // RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
 // RUN:        | FileCheck %s --check-prefixes=CHECK-ERROR
 // RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+pcdphint < %s \
-// RUN:        | llvm-objdump -d --mattr=+pcdphint - | FileCheck %s --check-prefix=CHECK-INST
+// RUN:        | llvm-objdump -d --mattr=+pcdphint --no-print-imm-hex - | FileCheck %s --check-prefix=CHECK-INST
 // RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+pcdphint < %s \
 // RUN:        | llvm-objdump -d --mattr=-pcdphint - | FileCheck %s --check-prefix=CHECK-UNKNOWN
 // Disassemble encoding and check the re-encoding (-show-encoding) matches.
@@ -23,3 +23,11 @@ stshh strm
 // CHECK-ENCODING: encoding: [0x3f,0x96,0x01,0xd5]
 // CHECK-ERROR: error: instruction requires: pcdphint
 // CHECK-UNKNOWN:  d501963f      msr S0_1_C9_C6_1, xzr
+
+prfm ir, [x0]
+// CHECK-INST: prfm ir, [x0]
+// CHECK-ENCODING: [0x18,0x00,0x80,0xf9]
+
+prfm ir, [x2, #800]
+// CHECK-INST: prfm ir, [x2, #800]
+// CHECK-ENCODING: [0x58,0x90,0x81,0xf9]

Comment thread llvm/lib/Target/AArch64/AArch64SystemOperands.td
Comment thread clang/lib/Headers/arm_acle.h
Copy link
Copy Markdown
Contributor

@jthackray jthackray left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks Kerry. The code implementation LGTM; just a question as to whether it should be gated or not.

Copy link
Copy Markdown
Contributor

@jthackray jthackray left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, Kerry. LGTM.

@@ -0,0 +1,12 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
; RUN: llc -mtriple=aarch64 -mattr=+v9a -mattr=+pcdphint --global-isel=0 < %s | FileCheck %s
; RUN: llc -mtriple=aarch64 -mattr=+v9a -mattr=+pcdphint --global-isel=1 --global-isel-abort=1 < %s | FileCheck %s
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Small nit: Can remove --global-isel-abort=1

- Renamed arm64-prefetch-ri.ll -> arm64-prefetch-ir.ll
@kmclaughlin-arm kmclaughlin-arm merged commit e043195 into llvm:main Feb 10, 2026
10 checks passed
@llvm-ci
Copy link
Copy Markdown

llvm-ci commented Feb 10, 2026

LLVM Buildbot has detected a new failure on builder arc-builder running on arc-worker while building clang,llvm at step 6 "test-build-unified-tree-check-all".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/3/builds/28378

Here is the relevant piece of the build log for the reference
Step 6 (test-build-unified-tree-check-all) failure: test (failure)
******************** TEST 'LLVM :: CodeGen/X86/sse2-intrinsics-fast-isel.ll' FAILED ********************
Exit Code: 1

Command Output (stdout):
--
# RUN: at line 2
/buildbot/worker/arc-folder/build/bin/llc < /buildbot/worker/arc-folder/llvm-project/llvm/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll -show-mc-encoding -fast-isel -mtriple=i386-unknown-unknown -mattr=+sse2 | /buildbot/worker/arc-folder/build/bin/FileCheck /buildbot/worker/arc-folder/llvm-project/llvm/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll --check-prefixes=CHECK,X86,SSE,X86-SSE
# executed command: /buildbot/worker/arc-folder/build/bin/llc -show-mc-encoding -fast-isel -mtriple=i386-unknown-unknown -mattr=+sse2
# .---command stderr------------
# | LLVM ERROR: Cannot select: intrinsic %llvm.x86.sse2.clflush
# | PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace and instructions to reproduce the bug.
# | Stack dump:
# | 0.	Program arguments: /buildbot/worker/arc-folder/build/bin/llc -show-mc-encoding -fast-isel -mtriple=i386-unknown-unknown -mattr=+sse2
# | 1.	Running pass 'Function Pass Manager' on module '<stdin>'.
# | 2.	Running pass 'X86 DAG->DAG Instruction Selection' on function '@test_mm_clflush'
# |  #0 0x000000000245ae68 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/buildbot/worker/arc-folder/build/bin/llc+0x245ae68)
# |  #1 0x0000000002457da5 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
# |  #2 0x00007f9def895630 __restore_rt sigaction.c:0:0
# |  #3 0x00007f9dee5e53d7 raise (/usr/lib64/libc.so.6+0x363d7)
# |  #4 0x00007f9dee5e6ac8 abort (/usr/lib64/libc.so.6+0x37ac8)
# |  #5 0x000000000073b98f llvm::json::operator==(llvm::json::Value const&, llvm::json::Value const&) (.cold) JSON.cpp:0:0
# |  #6 0x00000000021d4539 llvm::SelectionDAGISel::CannotYetSelect(llvm::SDNode*) (/buildbot/worker/arc-folder/build/bin/llc+0x21d4539)
# |  #7 0x00000000021d947a llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int, unsigned char const*) (/buildbot/worker/arc-folder/build/bin/llc+0x21d947a)
# |  #8 0x00000000009a1d8e (anonymous namespace)::X86DAGToDAGISel::Select(llvm::SDNode*) X86ISelDAGToDAG.cpp:0:0
# |  #9 0x00000000021cfccf llvm::SelectionDAGISel::DoInstructionSelection() (/buildbot/worker/arc-folder/build/bin/llc+0x21cfccf)
# | #10 0x00000000021e2b68 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/buildbot/worker/arc-folder/build/bin/llc+0x21e2b68)
# | #11 0x00000000021e66cc llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/buildbot/worker/arc-folder/build/bin/llc+0x21e66cc)
# | #12 0x00000000021e7afc llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/buildbot/worker/arc-folder/build/bin/llc+0x21e7afc)
# | #13 0x00000000021cf4df llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) (/buildbot/worker/arc-folder/build/bin/llc+0x21cf4df)
# | #14 0x00000000012922e7 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
# | #15 0x000000000191c9eb llvm::FPPassManager::runOnFunction(llvm::Function&) (/buildbot/worker/arc-folder/build/bin/llc+0x191c9eb)
# | #16 0x000000000191cd91 llvm::FPPassManager::runOnModule(llvm::Module&) (/buildbot/worker/arc-folder/build/bin/llc+0x191cd91)
# | #17 0x000000000191d9a5 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/buildbot/worker/arc-folder/build/bin/llc+0x191d9a5)
# | #18 0x00000000008148fc compileModule(char**, llvm::SmallVectorImpl<llvm::PassPlugin>&, llvm::LLVMContext&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&) llc.cpp:0:0
# | #19 0x0000000000743e6c main (/buildbot/worker/arc-folder/build/bin/llc+0x743e6c)
# | #20 0x00007f9dee5d1555 __libc_start_main (/usr/lib64/libc.so.6+0x22555)
# | #21 0x00000000008097a6 _start (/buildbot/worker/arc-folder/build/bin/llc+0x8097a6)
# `-----------------------------
# error: command failed with exit status: -6
# executed command: /buildbot/worker/arc-folder/build/bin/FileCheck /buildbot/worker/arc-folder/llvm-project/llvm/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll --check-prefixes=CHECK,X86,SSE,X86-SSE
# .---command stderr------------
# | /buildbot/worker/arc-folder/llvm-project/llvm/test/CodeGen/X86/sse2-intrinsics-fast-isel.ll:399:14: error: SSE-LABEL: expected string not found in input
# | ; SSE-LABEL: test_mm_bsrli_si128:
# |              ^
# | <stdin>:171:21: note: scanning from here
# | test_mm_bslli_si128: # @test_mm_bslli_si128
# |                     ^
# | <stdin>:179:9: note: possible intended match here
# |  .globl test_mm_bsrli_si128 
# |         ^
...

@kmclaughlin-arm kmclaughlin-arm deleted the pldir-builtin branch April 23, 2026 14:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend:AArch64 backend:X86 clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:headers Headers provided by Clang, e.g. for intrinsics llvm:ir

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants