[llvm] [llvm] Improve TLI for Darwin libsystem_m functions (PR #109479)
Jon Roelofs via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 20 14:07:32 PDT 2024
https://github.com/jroelofs created https://github.com/llvm/llvm-project/pull/109479
... to ensure we can vectorize these under -veclib=Darwin_libsystem_m
>From e4c7350f5b988f8177b302925a90a7f60f80dc32 Mon Sep 17 00:00:00 2001
From: Jon Roelofs <jonathan_roelofs at apple.com>
Date: Fri, 20 Sep 2024 14:02:38 -0700
Subject: [PATCH] [llvm] Improve TLI for Darwin libsystem_m functions
... to ensure we can vectorize these under -veclib=Darwin_libsystem_m
---
.../include/llvm/Analysis/TargetLibraryInfo.h | 45 +++++++++++--------
.../AArch64/vectorize-atan2-darwin.ll | 43 ++++++++++++++++++
2 files changed, 69 insertions(+), 19 deletions(-)
create mode 100644 llvm/test/Transforms/LoopVectorize/AArch64/vectorize-atan2-darwin.ll
diff --git a/llvm/include/llvm/Analysis/TargetLibraryInfo.h b/llvm/include/llvm/Analysis/TargetLibraryInfo.h
index 9e543b844ad768..222ab9f010943d 100644
--- a/llvm/include/llvm/Analysis/TargetLibraryInfo.h
+++ b/llvm/include/llvm/Analysis/TargetLibraryInfo.h
@@ -408,35 +408,42 @@ class TargetLibraryInfo {
switch (F) {
default: break;
// clang-format off
- case LibFunc_copysign: case LibFunc_copysignf: case LibFunc_copysignl:
- case LibFunc_fabs: case LibFunc_fabsf: case LibFunc_fabsl:
- case LibFunc_sin: case LibFunc_sinf: case LibFunc_sinl:
- case LibFunc_cos: case LibFunc_cosf: case LibFunc_cosl:
- case LibFunc_tan: case LibFunc_tanf: case LibFunc_tanl:
- case LibFunc_asin: case LibFunc_asinf: case LibFunc_asinl:
case LibFunc_acos: case LibFunc_acosf: case LibFunc_acosl:
+ case LibFunc_acosh: case LibFunc_acoshf: case LibFunc_acoshl:
+ case LibFunc_asin: case LibFunc_asinf: case LibFunc_asinl:
+ case LibFunc_asinh: case LibFunc_asinhf: case LibFunc_asinhl:
+ case LibFunc_atan2: case LibFunc_atan2f: case LibFunc_atan2l:
case LibFunc_atan: case LibFunc_atanf: case LibFunc_atanl:
- case LibFunc_sinh: case LibFunc_sinhf: case LibFunc_sinhl:
+ case LibFunc_atanh: case LibFunc_atanhf: case LibFunc_atanhl:
+ case LibFunc_cbrt: case LibFunc_cbrtf: case LibFunc_cbrtl:
+ case LibFunc_ceil: case LibFunc_ceilf: case LibFunc_ceill:
+ case LibFunc_copysign: case LibFunc_copysignf: case LibFunc_copysignl:
+ case LibFunc_cos: case LibFunc_cosf: case LibFunc_cosl:
case LibFunc_cosh: case LibFunc_coshf: case LibFunc_coshl:
- case LibFunc_tanh: case LibFunc_tanhf: case LibFunc_tanhl:
- case LibFunc_sqrt: case LibFunc_sqrtf: case LibFunc_sqrtl:
- case LibFunc_sqrt_finite: case LibFunc_sqrtf_finite:
- case LibFunc_sqrtl_finite:
+ case LibFunc_erf: case LibFunc_erff: case LibFunc_erfl:
+ case LibFunc_exp2: case LibFunc_exp2f: case LibFunc_exp2l:
+ case LibFunc_fabs: case LibFunc_fabsf: case LibFunc_fabsl:
+ case LibFunc_floor: case LibFunc_floorf: case LibFunc_floorl:
case LibFunc_fmax: case LibFunc_fmaxf: case LibFunc_fmaxl:
case LibFunc_fmin: case LibFunc_fminf: case LibFunc_fminl:
- case LibFunc_floor: case LibFunc_floorf: case LibFunc_floorl:
+ case LibFunc_ldexp: case LibFunc_ldexpf: case LibFunc_ldexpl:
+ case LibFunc_log2: case LibFunc_log2f: case LibFunc_log2l:
+ case LibFunc_memcmp: case LibFunc_bcmp: case LibFunc_strcmp:
+ case LibFunc_memcpy: case LibFunc_memset: case LibFunc_memmove:
case LibFunc_nearbyint: case LibFunc_nearbyintf: case LibFunc_nearbyintl:
- case LibFunc_ceil: case LibFunc_ceilf: case LibFunc_ceill:
+ case LibFunc_pow: case LibFunc_powf: case LibFunc_powl:
case LibFunc_rint: case LibFunc_rintf: case LibFunc_rintl:
case LibFunc_round: case LibFunc_roundf: case LibFunc_roundl:
- case LibFunc_trunc: case LibFunc_truncf: case LibFunc_truncl:
- case LibFunc_log2: case LibFunc_log2f: case LibFunc_log2l:
- case LibFunc_exp2: case LibFunc_exp2f: case LibFunc_exp2l:
- case LibFunc_ldexp: case LibFunc_ldexpf: case LibFunc_ldexpl:
- case LibFunc_memcpy: case LibFunc_memset: case LibFunc_memmove:
- case LibFunc_memcmp: case LibFunc_bcmp: case LibFunc_strcmp:
+ case LibFunc_sin: case LibFunc_sinf: case LibFunc_sinl:
+ case LibFunc_sinh: case LibFunc_sinhf: case LibFunc_sinhl:
+ case LibFunc_sqrt: case LibFunc_sqrtf: case LibFunc_sqrtl:
+ case LibFunc_sqrt_finite: case LibFunc_sqrtf_finite:
+ case LibFunc_sqrtl_finite:
case LibFunc_strcpy: case LibFunc_stpcpy: case LibFunc_strlen:
case LibFunc_strnlen: case LibFunc_memchr: case LibFunc_mempcpy:
+ case LibFunc_tan: case LibFunc_tanf: case LibFunc_tanl:
+ case LibFunc_tanh: case LibFunc_tanhf: case LibFunc_tanhl:
+ case LibFunc_trunc: case LibFunc_truncf: case LibFunc_truncl:
// clang-format on
return true;
}
diff --git a/llvm/test/Transforms/LoopVectorize/AArch64/vectorize-atan2-darwin.ll b/llvm/test/Transforms/LoopVectorize/AArch64/vectorize-atan2-darwin.ll
new file mode 100644
index 00000000000000..fd56d03d678846
--- /dev/null
+++ b/llvm/test/Transforms/LoopVectorize/AArch64/vectorize-atan2-darwin.ll
@@ -0,0 +1,43 @@
+; RUN: opt -passes='default<O2>' -vector-library=Darwin_libsystem_m -passes=inject-tli-mappings,loop-vectorize -S < %s | FileCheck %s
+
+target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
+target triple = "arm64-apple-ios"
+
+declare float @atan2f(float, float)
+
+define void @foo(ptr noalias nocapture %ptrA,
+ ptr noalias nocapture readonly %ptrB,
+ ptr noalias nocapture readonly %ptrC,
+ i64 %size) {
+; CHECK-LABEL: @foo(
+; CHECK: call <4 x float> @_simd_atan2_f4(<4 x float>
+;
+entry:
+ br label %for.cond
+
+for.cond: ; preds = %for.body, %entry
+ %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
+ %exitcond = icmp eq i64 %indvars.iv, %size
+ br i1 %exitcond, label %for.cond.cleanup, label %for.body
+
+for.body: ; preds = %for.cond
+ %arrayidx = getelementptr inbounds float, ptr %ptrB, i64 %indvars.iv
+ %src1 = load float, ptr %arrayidx, align 4
+
+ %arrayidx2 = getelementptr inbounds float, ptr %ptrC, i64 %indvars.iv
+ %src2 = load float, ptr %arrayidx, align 4
+
+ %arrayidx3 = getelementptr inbounds float, ptr %ptrA, i64 %indvars.iv
+
+ %phase = call float @atan2f(float %src1, float %src2)
+
+ store float %phase, ptr %arrayidx3, align 4
+ %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+ br label %for.cond, !llvm.loop !0
+
+for.cond.cleanup: ; preds = %for.cond
+ ret void
+}
+
+!0 = distinct !{!0, !1}
+!1 = !{!"llvm.loop.vectorize.enable", i1 true}
More information about the llvm-commits
mailing list