xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/fabs.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Make sure all library calls are eliminated when the input is known positive.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdeclare float @fabsf(float)
6*9880d681SAndroid Build Coastguard Workerdeclare double @fabs(double)
7*9880d681SAndroid Build Coastguard Workerdeclare fp128 @fabsl(fp128)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine float @square_fabs_call_f32(float %x) {
10*9880d681SAndroid Build Coastguard Worker  %mul = fmul float %x, %x
11*9880d681SAndroid Build Coastguard Worker  %fabsf = tail call float @fabsf(float %mul)
12*9880d681SAndroid Build Coastguard Worker  ret float %fabsf
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: square_fabs_call_f32(
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %mul = fmul float %x, %x
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %mul
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerdefine double @square_fabs_call_f64(double %x) {
20*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %x, %x
21*9880d681SAndroid Build Coastguard Worker  %fabs = tail call double @fabs(double %mul)
22*9880d681SAndroid Build Coastguard Worker  ret double %fabs
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: square_fabs_call_f64(
25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %mul = fmul double %x, %x
26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %mul
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine fp128 @square_fabs_call_f128(fp128 %x) {
30*9880d681SAndroid Build Coastguard Worker  %mul = fmul fp128 %x, %x
31*9880d681SAndroid Build Coastguard Worker  %fabsl = tail call fp128 @fabsl(fp128 %mul)
32*9880d681SAndroid Build Coastguard Worker  ret fp128 %fabsl
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: square_fabs_call_f128(
35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %mul = fmul fp128 %x, %x
36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret fp128 %mul
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; Make sure all intrinsic calls are eliminated when the input is known positive.
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fabs.f32(float)
42*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.fabs.f64(double)
43*9880d681SAndroid Build Coastguard Workerdeclare fp128 @llvm.fabs.f128(fp128)
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdefine float @square_fabs_intrinsic_f32(float %x) {
46*9880d681SAndroid Build Coastguard Worker  %mul = fmul float %x, %x
47*9880d681SAndroid Build Coastguard Worker  %fabsf = tail call float @llvm.fabs.f32(float %mul)
48*9880d681SAndroid Build Coastguard Worker  ret float %fabsf
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: square_fabs_intrinsic_f32(
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %mul = fmul float %x, %x
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %mul
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerdefine double @square_fabs_intrinsic_f64(double %x) {
56*9880d681SAndroid Build Coastguard Worker  %mul = fmul double %x, %x
57*9880d681SAndroid Build Coastguard Worker  %fabs = tail call double @llvm.fabs.f64(double %mul)
58*9880d681SAndroid Build Coastguard Worker  ret double %fabs
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: square_fabs_intrinsic_f64(
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %mul = fmul double %x, %x
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %mul
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine fp128 @square_fabs_intrinsic_f128(fp128 %x) {
66*9880d681SAndroid Build Coastguard Worker  %mul = fmul fp128 %x, %x
67*9880d681SAndroid Build Coastguard Worker  %fabsl = tail call fp128 @llvm.fabs.f128(fp128 %mul)
68*9880d681SAndroid Build Coastguard Worker  ret fp128 %fabsl
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: square_fabs_intrinsic_f128(
71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %mul = fmul fp128 %x, %x
72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret fp128 %mul
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker; Shrinking a library call to a smaller type should not be inhibited by nor inhibit the square optimization.
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdefine float @square_fabs_shrink_call1(float %x) {
78*9880d681SAndroid Build Coastguard Worker  %ext = fpext float %x to double
79*9880d681SAndroid Build Coastguard Worker  %sq = fmul double %ext, %ext
80*9880d681SAndroid Build Coastguard Worker  %fabs = call double @fabs(double %sq)
81*9880d681SAndroid Build Coastguard Worker  %trunc = fptrunc double %fabs to float
82*9880d681SAndroid Build Coastguard Worker  ret float %trunc
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: square_fabs_shrink_call1(
85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %trunc = fmul float %x, %x
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %trunc
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine float @square_fabs_shrink_call2(float %x) {
90*9880d681SAndroid Build Coastguard Worker  %sq = fmul float %x, %x
91*9880d681SAndroid Build Coastguard Worker  %ext = fpext float %sq to double
92*9880d681SAndroid Build Coastguard Worker  %fabs = call double @fabs(double %ext)
93*9880d681SAndroid Build Coastguard Worker  %trunc = fptrunc double %fabs to float
94*9880d681SAndroid Build Coastguard Worker  ret float %trunc
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: square_fabs_shrink_call2(
97*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %sq = fmul float %x, %x
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %sq
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101