Skip to content

Commit e4c7350

Browse files
committed
[llvm] Improve TLI for Darwin libsystem_m functions
... to ensure we can vectorize these under -veclib=Darwin_libsystem_m
1 parent b3f3c0c commit e4c7350

File tree

2 files changed

+69
-19
lines changed

2 files changed

+69
-19
lines changed

llvm/include/llvm/Analysis/TargetLibraryInfo.h

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -408,35 +408,42 @@ class TargetLibraryInfo {
408408
switch (F) {
409409
default: break;
410410
// clang-format off
411-
case LibFunc_copysign: case LibFunc_copysignf: case LibFunc_copysignl:
412-
case LibFunc_fabs: case LibFunc_fabsf: case LibFunc_fabsl:
413-
case LibFunc_sin: case LibFunc_sinf: case LibFunc_sinl:
414-
case LibFunc_cos: case LibFunc_cosf: case LibFunc_cosl:
415-
case LibFunc_tan: case LibFunc_tanf: case LibFunc_tanl:
416-
case LibFunc_asin: case LibFunc_asinf: case LibFunc_asinl:
417411
case LibFunc_acos: case LibFunc_acosf: case LibFunc_acosl:
412+
case LibFunc_acosh: case LibFunc_acoshf: case LibFunc_acoshl:
413+
case LibFunc_asin: case LibFunc_asinf: case LibFunc_asinl:
414+
case LibFunc_asinh: case LibFunc_asinhf: case LibFunc_asinhl:
415+
case LibFunc_atan2: case LibFunc_atan2f: case LibFunc_atan2l:
418416
case LibFunc_atan: case LibFunc_atanf: case LibFunc_atanl:
419-
case LibFunc_sinh: case LibFunc_sinhf: case LibFunc_sinhl:
417+
case LibFunc_atanh: case LibFunc_atanhf: case LibFunc_atanhl:
418+
case LibFunc_cbrt: case LibFunc_cbrtf: case LibFunc_cbrtl:
419+
case LibFunc_ceil: case LibFunc_ceilf: case LibFunc_ceill:
420+
case LibFunc_copysign: case LibFunc_copysignf: case LibFunc_copysignl:
421+
case LibFunc_cos: case LibFunc_cosf: case LibFunc_cosl:
420422
case LibFunc_cosh: case LibFunc_coshf: case LibFunc_coshl:
421-
case LibFunc_tanh: case LibFunc_tanhf: case LibFunc_tanhl:
422-
case LibFunc_sqrt: case LibFunc_sqrtf: case LibFunc_sqrtl:
423-
case LibFunc_sqrt_finite: case LibFunc_sqrtf_finite:
424-
case LibFunc_sqrtl_finite:
423+
case LibFunc_erf: case LibFunc_erff: case LibFunc_erfl:
424+
case LibFunc_exp2: case LibFunc_exp2f: case LibFunc_exp2l:
425+
case LibFunc_fabs: case LibFunc_fabsf: case LibFunc_fabsl:
426+
case LibFunc_floor: case LibFunc_floorf: case LibFunc_floorl:
425427
case LibFunc_fmax: case LibFunc_fmaxf: case LibFunc_fmaxl:
426428
case LibFunc_fmin: case LibFunc_fminf: case LibFunc_fminl:
427-
case LibFunc_floor: case LibFunc_floorf: case LibFunc_floorl:
429+
case LibFunc_ldexp: case LibFunc_ldexpf: case LibFunc_ldexpl:
430+
case LibFunc_log2: case LibFunc_log2f: case LibFunc_log2l:
431+
case LibFunc_memcmp: case LibFunc_bcmp: case LibFunc_strcmp:
432+
case LibFunc_memcpy: case LibFunc_memset: case LibFunc_memmove:
428433
case LibFunc_nearbyint: case LibFunc_nearbyintf: case LibFunc_nearbyintl:
429-
case LibFunc_ceil: case LibFunc_ceilf: case LibFunc_ceill:
434+
case LibFunc_pow: case LibFunc_powf: case LibFunc_powl:
430435
case LibFunc_rint: case LibFunc_rintf: case LibFunc_rintl:
431436
case LibFunc_round: case LibFunc_roundf: case LibFunc_roundl:
432-
case LibFunc_trunc: case LibFunc_truncf: case LibFunc_truncl:
433-
case LibFunc_log2: case LibFunc_log2f: case LibFunc_log2l:
434-
case LibFunc_exp2: case LibFunc_exp2f: case LibFunc_exp2l:
435-
case LibFunc_ldexp: case LibFunc_ldexpf: case LibFunc_ldexpl:
436-
case LibFunc_memcpy: case LibFunc_memset: case LibFunc_memmove:
437-
case LibFunc_memcmp: case LibFunc_bcmp: case LibFunc_strcmp:
437+
case LibFunc_sin: case LibFunc_sinf: case LibFunc_sinl:
438+
case LibFunc_sinh: case LibFunc_sinhf: case LibFunc_sinhl:
439+
case LibFunc_sqrt: case LibFunc_sqrtf: case LibFunc_sqrtl:
440+
case LibFunc_sqrt_finite: case LibFunc_sqrtf_finite:
441+
case LibFunc_sqrtl_finite:
438442
case LibFunc_strcpy: case LibFunc_stpcpy: case LibFunc_strlen:
439443
case LibFunc_strnlen: case LibFunc_memchr: case LibFunc_mempcpy:
444+
case LibFunc_tan: case LibFunc_tanf: case LibFunc_tanl:
445+
case LibFunc_tanh: case LibFunc_tanhf: case LibFunc_tanhl:
446+
case LibFunc_trunc: case LibFunc_truncf: case LibFunc_truncl:
440447
// clang-format on
441448
return true;
442449
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
; RUN: opt -passes='default<O2>' -vector-library=Darwin_libsystem_m -passes=inject-tli-mappings,loop-vectorize -S < %s | FileCheck %s
2+
3+
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
4+
target triple = "arm64-apple-ios"
5+
6+
declare float @atan2f(float, float)
7+
8+
define void @foo(ptr noalias nocapture %ptrA,
9+
ptr noalias nocapture readonly %ptrB,
10+
ptr noalias nocapture readonly %ptrC,
11+
i64 %size) {
12+
; CHECK-LABEL: @foo(
13+
; CHECK: call <4 x float> @_simd_atan2_f4(<4 x float>
14+
;
15+
entry:
16+
br label %for.cond
17+
18+
for.cond: ; preds = %for.body, %entry
19+
%indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
20+
%exitcond = icmp eq i64 %indvars.iv, %size
21+
br i1 %exitcond, label %for.cond.cleanup, label %for.body
22+
23+
for.body: ; preds = %for.cond
24+
%arrayidx = getelementptr inbounds float, ptr %ptrB, i64 %indvars.iv
25+
%src1 = load float, ptr %arrayidx, align 4
26+
27+
%arrayidx2 = getelementptr inbounds float, ptr %ptrC, i64 %indvars.iv
28+
%src2 = load float, ptr %arrayidx, align 4
29+
30+
%arrayidx3 = getelementptr inbounds float, ptr %ptrA, i64 %indvars.iv
31+
32+
%phase = call float @atan2f(float %src1, float %src2)
33+
34+
store float %phase, ptr %arrayidx3, align 4
35+
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
36+
br label %for.cond, !llvm.loop !0
37+
38+
for.cond.cleanup: ; preds = %for.cond
39+
ret void
40+
}
41+
42+
!0 = distinct !{!0, !1}
43+
!1 = !{!"llvm.loop.vectorize.enable", i1 true}

0 commit comments

Comments
 (0)