https://github.com/easyonaadit updated 
https://github.com/llvm/llvm-project/pull/170813

>From 2a3eeae12e684c995d98c6ac5783de8d120be0ad Mon Sep 17 00:00:00 2001
From: Aaditya <[email protected]>
Date: Fri, 5 Dec 2025 14:03:36 +0530
Subject: [PATCH] [AMDGPU] Add builtins for wave reduction intrinsics

---
 clang/include/clang/Basic/BuiltinsAMDGPU.def |  4 +
 clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp  |  8 ++
 clang/test/CodeGenOpenCL/builtins-amdgcn.cl  | 84 ++++++++++++++++++++
 3 files changed, 96 insertions(+)

diff --git a/clang/include/clang/Basic/BuiltinsAMDGPU.def 
b/clang/include/clang/Basic/BuiltinsAMDGPU.def
index 8af6ce1528a45..c6a275d5db9f2 100644
--- a/clang/include/clang/Basic/BuiltinsAMDGPU.def
+++ b/clang/include/clang/Basic/BuiltinsAMDGPU.def
@@ -406,6 +406,10 @@ BUILTIN(__builtin_amdgcn_wave_reduce_fadd_f32, "ffZi", 
"nc")
 BUILTIN(__builtin_amdgcn_wave_reduce_fsub_f32, "ffZi", "nc")
 BUILTIN(__builtin_amdgcn_wave_reduce_fmin_f32, "ffZi", "nc")
 BUILTIN(__builtin_amdgcn_wave_reduce_fmax_f32, "ffZi", "nc")
+BUILTIN(__builtin_amdgcn_wave_reduce_fadd_f64, "ddZi", "nc")
+BUILTIN(__builtin_amdgcn_wave_reduce_fsub_f64, "ddZi", "nc")
+BUILTIN(__builtin_amdgcn_wave_reduce_fmin_f64, "ddZi", "nc")
+BUILTIN(__builtin_amdgcn_wave_reduce_fmax_f64, "ddZi", "nc")
 
 
//===----------------------------------------------------------------------===//
 // R600-NI only builtins.
diff --git a/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp 
b/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp
index eabdc370da6b4..673d2752ee3e1 100644
--- a/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp
@@ -374,16 +374,19 @@ static Intrinsic::ID 
getIntrinsicIDforWaveReduction(unsigned BuiltinID) {
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_add_u64:
     return Intrinsic::amdgcn_wave_reduce_add;
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fadd_f32:
+  case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fadd_f64:
     return Intrinsic::amdgcn_wave_reduce_fadd;
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_sub_u32:
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_sub_u64:
     return Intrinsic::amdgcn_wave_reduce_sub;
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fsub_f32:
+  case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fsub_f64:
     return Intrinsic::amdgcn_wave_reduce_fsub;
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_min_i32:
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_min_i64:
     return Intrinsic::amdgcn_wave_reduce_min;
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fmin_f32:
+  case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fmin_f64:
     return Intrinsic::amdgcn_wave_reduce_fmin;
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_min_u32:
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_min_u64:
@@ -392,6 +395,7 @@ static Intrinsic::ID 
getIntrinsicIDforWaveReduction(unsigned BuiltinID) {
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_max_i64:
     return Intrinsic::amdgcn_wave_reduce_max;
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fmax_f32:
+  case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_fmax_f64:
     return Intrinsic::amdgcn_wave_reduce_fmax;
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_max_u32:
   case clang::AMDGPU::BI__builtin_amdgcn_wave_reduce_max_u64:
@@ -415,14 +419,18 @@ Value *CodeGenFunction::EmitAMDGPUBuiltinExpr(unsigned 
BuiltinID,
   switch (BuiltinID) {
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_add_u32:
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_fadd_f32:
+  case AMDGPU::BI__builtin_amdgcn_wave_reduce_fadd_f64:
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_sub_u32:
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_fsub_f32:
+  case AMDGPU::BI__builtin_amdgcn_wave_reduce_fsub_f64:
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_min_i32:
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_min_u32:
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_fmin_f32:
+  case AMDGPU::BI__builtin_amdgcn_wave_reduce_fmin_f64:
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_max_i32:
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_max_u32:
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_fmax_f32:
+  case AMDGPU::BI__builtin_amdgcn_wave_reduce_fmax_f64:
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_and_b32:
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_or_b32:
   case AMDGPU::BI__builtin_amdgcn_wave_reduce_xor_b32:
diff --git a/clang/test/CodeGenOpenCL/builtins-amdgcn.cl 
b/clang/test/CodeGenOpenCL/builtins-amdgcn.cl
index a5132c9114673..39f140ababab2 100644
--- a/clang/test/CodeGenOpenCL/builtins-amdgcn.cl
+++ b/clang/test/CodeGenOpenCL/builtins-amdgcn.cl
@@ -412,6 +412,13 @@ void test_wave_reduce_fadd_f32_default(global float* out, 
float in)
   *out = __builtin_amdgcn_wave_reduce_fadd_f32(in, 0);
 }
 
+// CHECK-LABEL: @test_wave_reduce_fadd_f64_default
+// CHECK: {{.*}}call{{.*}} double @llvm.amdgcn.wave.reduce.fadd.f64(
+void test_wave_reduce_fadd_f64_default(global double* out, double in)
+{
+  *out = __builtin_amdgcn_wave_reduce_fadd_f64(in, 0);
+}
+
 // CHECK-LABEL: @test_wave_reduce_add_u32_iterative
 // CHECK: {{.*}}call{{.*}} i32 @llvm.amdgcn.wave.reduce.add.i32(
 void test_wave_reduce_add_u32_iterative(global int* out, int in)
@@ -433,6 +440,13 @@ void test_wave_reduce_fadd_f32_iterative(global float* 
out, float in)
   *out = __builtin_amdgcn_wave_reduce_fadd_f32(in, 0);
 }
 
+// CHECK-LABEL: @test_wave_reduce_fadd_f64_iterative
+// CHECK: {{.*}}call{{.*}} double @llvm.amdgcn.wave.reduce.fadd.f64(
+void test_wave_reduce_fadd_f64_iterative(global double* out, double in)
+{
+  *out = __builtin_amdgcn_wave_reduce_fadd_f64(in, 0);
+}
+
 // CHECK-LABEL: @test_wave_reduce_add_u32_dpp
 // CHECK: {{.*}}call{{.*}} i32 @llvm.amdgcn.wave.reduce.add.i32(
 void test_wave_reduce_add_u32_dpp(global int* out, int in)
@@ -454,6 +468,13 @@ void test_wave_reduce_fadd_f32_dpp(global float* out, 
float in)
   *out = __builtin_amdgcn_wave_reduce_fadd_f32(in, 0);
 }
 
+// CHECK-LABEL: @test_wave_reduce_fadd_f64_dpp
+// CHECK: {{.*}}call{{.*}} double @llvm.amdgcn.wave.reduce.fadd.f64(
+void test_wave_reduce_fadd_f64_dpp(global double* out, double in)
+{
+  *out = __builtin_amdgcn_wave_reduce_fadd_f64(in, 0);
+}
+
 // CHECK-LABEL: @test_wave_reduce_sub_u32_default
 // CHECK: {{.*}}call{{.*}} i32 @llvm.amdgcn.wave.reduce.sub.i32(
 void test_wave_reduce_sub_u32_default(global int* out, int in)
@@ -475,6 +496,13 @@ void test_wave_reduce_fsub_f32_default(global float* out, 
float in)
   *out = __builtin_amdgcn_wave_reduce_fsub_f32(in, 0);
 }
 
+// CHECK-LABEL: @test_wave_reduce_fsub_f64_default
+// CHECK: {{.*}}call{{.*}} double @llvm.amdgcn.wave.reduce.fsub.f64(
+void test_wave_reduce_fsub_f64_default(global double* out, double in)
+{
+  *out = __builtin_amdgcn_wave_reduce_fsub_f64(in, 0);
+}
+
 // CHECK-LABEL: @test_wave_reduce_sub_u32_iterative
 // CHECK: {{.*}}call{{.*}} i32 @llvm.amdgcn.wave.reduce.sub.i32(
 void test_wave_reduce_sub_u32_iterative(global int* out, int in)
@@ -496,6 +524,13 @@ void test_wave_reduce_fsub_f32_iterative(global float* 
out, float in)
   *out = __builtin_amdgcn_wave_reduce_fsub_f32(in, 0);
 }
 
+// CHECK-LABEL: @test_wave_reduce_fsub_f64_iterative
+// CHECK: {{.*}}call{{.*}} double @llvm.amdgcn.wave.reduce.fsub.f64(
+void test_wave_reduce_fsub_f64_iterative(global double* out, double in)
+{
+  *out = __builtin_amdgcn_wave_reduce_fsub_f64(in, 0);
+}
+
 // CHECK-LABEL: @test_wave_reduce_sub_u32_dpp
 // CHECK: {{.*}}call{{.*}} i32 @llvm.amdgcn.wave.reduce.sub.i32(
 void test_wave_reduce_sub_u32_dpp(global int* out, int in)
@@ -517,6 +552,13 @@ void test_wave_reduce_fsub_f32_dpp(global float* out, 
float in)
   *out = __builtin_amdgcn_wave_reduce_fsub_f32(in, 0);
 }
 
+// CHECK-LABEL: @test_wave_reduce_fsub_f64_dpp
+// CHECK: {{.*}}call{{.*}} double @llvm.amdgcn.wave.reduce.fsub.f64(
+void test_wave_reduce_fsub_f64_dpp(global double* out, double in)
+{
+  *out = __builtin_amdgcn_wave_reduce_fsub_f64(in, 0);
+}
+
 // CHECK-LABEL: @test_wave_reduce_and_b32_default
 // CHECK: {{.*}}call{{.*}} i32 @llvm.amdgcn.wave.reduce.and.i32(
 void test_wave_reduce_and_b32_default(global int* out, int in)
@@ -664,6 +706,13 @@ void test_wave_reduce_fmin_f32_default(global float* out, 
float in)
   *out = __builtin_amdgcn_wave_reduce_fmin_f32(in, 0);
 }
 
+// CHECK-LABEL: @test_wave_reduce_fmin_f64_default
+// CHECK: {{.*}}call{{.*}} double @llvm.amdgcn.wave.reduce.fmin.f64(
+void test_wave_reduce_fmin_f64_default(global double* out, double in)
+{
+  *out = __builtin_amdgcn_wave_reduce_fmin_f64(in, 0);
+}
+
 // CHECK-LABEL: @test_wave_reduce_min_i32_iterative
 // CHECK: {{.*}}call{{.*}} i32 @llvm.amdgcn.wave.reduce.min.i32(
 void test_wave_reduce_min_i32_iterative(global int* out, int in)
@@ -685,6 +734,13 @@ void test_wave_reduce_fmin_f32_iterative(global float* 
out, float in)
   *out = __builtin_amdgcn_wave_reduce_fmin_f32(in, 0);
 }
 
+// CHECK-LABEL: @test_wave_reduce_fmin_f64_iterative
+// CHECK: {{.*}}call{{.*}} double @llvm.amdgcn.wave.reduce.fmin.f64(
+void test_wave_reduce_fmin_f64_iterative(global double* out, double in)
+{
+  *out = __builtin_amdgcn_wave_reduce_fmin_f64(in, 0);
+}
+
 // CHECK-LABEL: @test_wave_reduce_min_i32_dpp
 // CHECK: {{.*}}call{{.*}} i32 @llvm.amdgcn.wave.reduce.min.i32(
 void test_wave_reduce_min_i32_dpp(global int* out, int in)
@@ -706,6 +762,13 @@ void test_wave_reduce_fmin_f32_dpp(global float* out, 
float in)
   *out = __builtin_amdgcn_wave_reduce_fmin_f32(in, 0);
 }
 
+// CHECK-LABEL: @test_wave_reduce_fmin_f64_dpp
+// CHECK: {{.*}}call{{.*}} double @llvm.amdgcn.wave.reduce.fmin.f64(
+void test_wave_reduce_fmin_f64_dpp(global double* out, double in)
+{
+  *out = __builtin_amdgcn_wave_reduce_fmin_f64(in, 0);
+}
+
 // CHECK-LABEL: @test_wave_reduce_min_u32_default
 // CHECK: {{.*}}call{{.*}} i32 @llvm.amdgcn.wave.reduce.umin.i32(
 void test_wave_reduce_min_u32_default(global int* out, int in)
@@ -769,6 +832,13 @@ void test_wave_reduce_fmax_f32_default(global float* out, 
float in)
   *out = __builtin_amdgcn_wave_reduce_fmax_f32(in, 0);
 }
 
+// CHECK-LABEL: @test_wave_reduce_fmax_f64_default
+// CHECK: {{.*}}call{{.*}} double @llvm.amdgcn.wave.reduce.fmax.f64(
+void test_wave_reduce_fmax_f64_default(global double* out, double in)
+{
+  *out = __builtin_amdgcn_wave_reduce_fmax_f64(in, 0);
+}
+
 // CHECK-LABEL: @test_wave_reduce_max_i32_iterative
 // CHECK: {{.*}}call{{.*}} i32 @llvm.amdgcn.wave.reduce.max.i32(
 void test_wave_reduce_max_i32_iterative(global int* out, int in)
@@ -790,6 +860,13 @@ void test_wave_reduce_fmax_f32_iterative(global float* 
out, float in)
   *out = __builtin_amdgcn_wave_reduce_fmax_f32(in, 0);
 }
 
+// CHECK-LABEL: @test_wave_reduce_fmax_f64_iterative
+// CHECK: {{.*}}call{{.*}} double @llvm.amdgcn.wave.reduce.fmax.f64(
+void test_wave_reduce_fmax_f64_iterative(global double* out, double in)
+{
+  *out = __builtin_amdgcn_wave_reduce_fmax_f64(in, 0);
+}
+
 // CHECK-LABEL: @test_wave_reduce_max_i32_dpp
 // CHECK: {{.*}}call{{.*}} i32 @llvm.amdgcn.wave.reduce.max.i32(
 void test_wave_reduce_max_i32_dpp(global int* out, int in)
@@ -811,6 +888,13 @@ void test_wave_reduce_fmax_f32_dpp(global float* out, 
float in)
   *out = __builtin_amdgcn_wave_reduce_fmax_f32(in, 0);
 }
 
+// CHECK-LABEL: @test_wave_reduce_fmax_f64_dpp
+// CHECK: {{.*}}call{{.*}} double @llvm.amdgcn.wave.reduce.fmax.f64(
+void test_wave_reduce_fmax_f64_dpp(global double* out, double in)
+{
+  *out = __builtin_amdgcn_wave_reduce_fmax_f64(in, 0);
+}
+
 // CHECK-LABEL: @test_wave_reduce_max_u32_default
 // CHECK: {{.*}}call{{.*}} i32 @llvm.amdgcn.wave.reduce.umax.i32(
 void test_wave_reduce_max_u32_default(global int* out, int in)

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

Reply via email to