[llvm] 33260cf - Intrinsics: Make vector reduce intrinsics speculatable
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 17 12:20:56 PDT 2023
Author: Matt Arsenault
Date: 2023-03-17T15:20:51-04:00
New Revision: 33260cf2c547b8c23eddcc9f95b6db2e828a55cf
URL: https://github.com/llvm/llvm-project/commit/33260cf2c547b8c23eddcc9f95b6db2e828a55cf
DIFF: https://github.com/llvm/llvm-project/commit/33260cf2c547b8c23eddcc9f95b6db2e828a55cf.diff
LOG: Intrinsics: Make vector reduce intrinsics speculatable
Added:
Modified:
llvm/include/llvm/IR/Intrinsics.td
llvm/test/Transforms/SpeculativeExecution/spec-calls.ll
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/Intrinsics.td b/llvm/include/llvm/IR/Intrinsics.td
index 84a4ca228f185..f42998a109988 100644
--- a/llvm/include/llvm/IR/Intrinsics.td
+++ b/llvm/include/llvm/IR/Intrinsics.td
@@ -1966,7 +1966,7 @@ def int_memset_element_unordered_atomic
//===------------------------ Reduction Intrinsics ------------------------===//
//
-let IntrProperties = [IntrNoMem] in {
+let IntrProperties = [IntrNoMem, IntrSpeculatable] in {
def int_vector_reduce_fadd : DefaultAttrsIntrinsic<[LLVMVectorElementType<0>],
[LLVMVectorElementType<0>,
diff --git a/llvm/test/Transforms/SpeculativeExecution/spec-calls.ll b/llvm/test/Transforms/SpeculativeExecution/spec-calls.ll
index 6a693b44d5380..8b40ac553ceea 100644
--- a/llvm/test/Transforms/SpeculativeExecution/spec-calls.ll
+++ b/llvm/test/Transforms/SpeculativeExecution/spec-calls.ll
@@ -109,3 +109,196 @@ b:
}
declare half @llvm.fptrunc.round.f16.f32(float, metadata)
+
+; CHECK-LABEL: @ifThen_vector_reduce_fadd(
+; CHECK: %reduce = call float @llvm.vector.reduce.fadd.v2f32(float %x, <2 x float> %y)
+; CHECK-NEXT: br i1 true
+define void @ifThen_vector_reduce_fadd(float %x, <2 x float> %y) {
+ br i1 true, label %a, label %b
+
+a:
+ %reduce = call float @llvm.vector.reduce.fadd.v2f32(float %x, <2 x float> %y)
+ br label %b
+
+b:
+ ret void
+}
+
+declare float @llvm.vector.reduce.fadd.v2f32(float, <2 x float>)
+
+; CHECK-LABEL: @ifThen_vector_reduce_fmul(
+; CHECK: %reduce = call float @llvm.vector.reduce.fmul.v2f32(float %x, <2 x float> %y)
+; CHECK-NEXT: br i1 true
+define void @ifThen_vector_reduce_fmul(float %x, <2 x float> %y) {
+ br i1 true, label %a, label %b
+
+a:
+ %reduce = call float @llvm.vector.reduce.fmul.v2f32(float %x, <2 x float> %y)
+ br label %b
+
+b:
+ ret void
+}
+
+declare float @llvm.vector.reduce.fmul.v2f32(float, <2 x float>)
+
+; CHECK-LABEL: @ifThen_vector_reduce_add(
+; CHECK: %reduce = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %x)
+; CHECK-NEXT: br i1 true
+define void @ifThen_vector_reduce_add(<2 x i32> %x) {
+ br i1 true, label %a, label %b
+
+a:
+ %reduce = call i32 @llvm.vector.reduce.add.v2i32(<2 x i32> %x)
+ br label %b
+
+b:
+ ret void
+}
+
+declare i32 @llvm.vector.reduce.add.v2i32(<2 x i32>)
+
+; CHECK-LABEL: @ifThen_vector_reduce_mul(
+; CHECK: %reduce = call i32 @llvm.vector.reduce.mul.v2i32(<2 x i32> %x)
+; CHECK-NEXT: br i1 true
+define void @ifThen_vector_reduce_mul(<2 x i32> %x) {
+ br i1 true, label %a, label %b
+
+a:
+ %reduce = call i32 @llvm.vector.reduce.mul.v2i32(<2 x i32> %x)
+ br label %b
+
+b:
+ ret void
+}
+
+declare i32 @llvm.vector.reduce.mul.v2i32(<2 x i32>)
+
+
+; CHECK-LABEL: @ifThen_vector_reduce_and(
+; CHECK: %reduce = call i32 @llvm.vector.reduce.and.v2i32(<2 x i32> %x)
+; CHECK-NEXT: br i1 true
+define void @ifThen_vector_reduce_and(<2 x i32> %x) {
+ br i1 true, label %a, label %b
+
+a:
+ %reduce = call i32 @llvm.vector.reduce.and.v2i32(<2 x i32> %x)
+ br label %b
+
+b:
+ ret void
+}
+
+declare i32 @llvm.vector.reduce.and.v2i32(<2 x i32>)
+
+; CHECK-LABEL: @ifThen_vector_reduce_or(
+; CHECK: %reduce = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %x)
+; CHECK-NEXT: br i1 true
+define void @ifThen_vector_reduce_or(<2 x i32> %x) {
+ br i1 true, label %a, label %b
+
+a:
+ %reduce = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %x)
+ br label %b
+
+b:
+ ret void
+}
+
+declare i32 @llvm.vector.reduce.or.v2i32(<2 x i32>)
+
+; CHECK-LABEL: @ifThen_vector_reduce_xor(
+; CHECK: %reduce = call i32 @llvm.vector.reduce.xor.v2i32(<2 x i32> %x)
+; CHECK-NEXT: br i1 true
+define void @ifThen_vector_reduce_xor(<2 x i32> %x) {
+ br i1 true, label %a, label %b
+
+a:
+ %reduce = call i32 @llvm.vector.reduce.xor.v2i32(<2 x i32> %x)
+ br label %b
+
+b:
+ ret void
+}
+
+declare i32 @llvm.vector.reduce.xor.v2i32(<2 x i32>)
+
+; CHECK-LABEL: @ifThen_vector_reduce_smax(
+; CHECK: %reduce = call i32 @llvm.vector.reduce.smax.v2i32(<2 x i32> %x)
+; CHECK-NEXT: br i1 true
+define void @ifThen_vector_reduce_smax(<2 x i32> %x) {
+ br i1 true, label %a, label %b
+
+a:
+ %reduce = call i32 @llvm.vector.reduce.smax.v2i32(<2 x i32> %x)
+ br label %b
+
+b:
+ ret void
+}
+
+declare i32 @llvm.vector.reduce.smax.v2i32(<2 x i32>)
+
+; CHECK-LABEL: @ifThen_vector_reduce_umax(
+; CHECK: %reduce = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> %x)
+; CHECK-NEXT: br i1 true
+define void @ifThen_vector_reduce_umax(<2 x i32> %x) {
+ br i1 true, label %a, label %b
+
+a:
+ %reduce = call i32 @llvm.vector.reduce.umax.v2i32(<2 x i32> %x)
+ br label %b
+
+b:
+ ret void
+}
+
+declare i32 @llvm.vector.reduce.umax.v2i32(<2 x i32>)
+
+; CHECK-LABEL: @ifThen_vector_reduce_umin(
+; CHECK: %reduce = call i32 @llvm.vector.reduce.umin.v2i32(<2 x i32> %x)
+; CHECK-NEXT: br i1 true
+define void @ifThen_vector_reduce_umin(<2 x i32> %x) {
+ br i1 true, label %a, label %b
+
+a:
+ %reduce = call i32 @llvm.vector.reduce.umin.v2i32(<2 x i32> %x)
+ br label %b
+
+b:
+ ret void
+}
+
+declare i32 @llvm.vector.reduce.umin.v2i32(<2 x i32>)
+
+; CHECK-LABEL: @ifThen_vector_reduce_fmax(
+; CHECK: %reduce = call float @llvm.vector.reduce.fmax.v2f32(<2 x float> %x)
+; CHECK-NEXT: br i1 true
+define void @ifThen_vector_reduce_fmax(<2 x float> %x) {
+ br i1 true, label %a, label %b
+
+a:
+ %reduce = call float @llvm.vector.reduce.fmax.v2f32(<2 x float> %x)
+ br label %b
+
+b:
+ ret void
+}
+
+declare float @llvm.vector.reduce.fmax.v2f32(<2 x float>)
+
+; CHECK-LABEL: @ifThen_vector_reduce_fmin(
+; CHECK: %reduce = call float @llvm.vector.reduce.fmin.v2f32(<2 x float> %x)
+; CHECK-NEXT: br i1 true
+define void @ifThen_vector_reduce_fmin(<2 x float> %x) {
+ br i1 true, label %a, label %b
+
+a:
+ %reduce = call float @llvm.vector.reduce.fmin.v2f32(<2 x float> %x)
+ br label %b
+
+b:
+ ret void
+}
+
+declare float @llvm.vector.reduce.fmin.v2f32(<2 x float>)
More information about the llvm-commits
mailing list