xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/fnabs.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx| FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Verify that we generate a single OR instruction for a scalar, vec128, and vec256
4*9880d681SAndroid Build Coastguard Worker; FNABS(x) operation -> FNEG (FABS(x)).
5*9880d681SAndroid Build Coastguard Worker; If the FABS() result isn't used, the AND instruction should be eliminated.
6*9880d681SAndroid Build Coastguard Worker; PR20578: http://llvm.org/bugs/show_bug.cgi?id=20578
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine float @scalar_no_abs(float %a) {
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: scalar_no_abs:
10*9880d681SAndroid Build Coastguard Worker; CHECK: vorps
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq
12*9880d681SAndroid Build Coastguard Worker  %fabs = tail call float @fabsf(float %a) #1
13*9880d681SAndroid Build Coastguard Worker  %fsub = fsub float -0.0, %fabs
14*9880d681SAndroid Build Coastguard Worker  ret float %fsub
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine float @scalar_uses_abs(float %a) {
18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: scalar_uses_abs:
19*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vandps
20*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vorps
21*9880d681SAndroid Build Coastguard Worker; CHECK: vmulss
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq
23*9880d681SAndroid Build Coastguard Worker  %fabs = tail call float @fabsf(float %a) #1
24*9880d681SAndroid Build Coastguard Worker  %fsub = fsub float -0.0, %fabs
25*9880d681SAndroid Build Coastguard Worker  %fmul = fmul float %fsub, %fabs
26*9880d681SAndroid Build Coastguard Worker  ret float %fmul
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vector128_no_abs(<4 x float> %a) {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vector128_no_abs:
31*9880d681SAndroid Build Coastguard Worker; CHECK: vorps
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq
33*9880d681SAndroid Build Coastguard Worker  %fabs = tail call <4 x float> @llvm.fabs.v4f32(< 4 x float> %a) #1
34*9880d681SAndroid Build Coastguard Worker  %fsub = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %fabs
35*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %fsub
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vector128_uses_abs(<4 x float> %a) {
39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vector128_uses_abs:
40*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vandps
41*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vorps
42*9880d681SAndroid Build Coastguard Worker; CHECK: vmulps
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq
44*9880d681SAndroid Build Coastguard Worker  %fabs = tail call <4 x float> @llvm.fabs.v4f32(<4 x float> %a) #1
45*9880d681SAndroid Build Coastguard Worker  %fsub = fsub <4 x float> <float -0.0, float -0.0, float -0.0, float -0.0>, %fabs
46*9880d681SAndroid Build Coastguard Worker  %fmul = fmul <4 x float> %fsub, %fabs
47*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %fmul
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @vector256_no_abs(<8 x float> %a) {
51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vector256_no_abs:
52*9880d681SAndroid Build Coastguard Worker; CHECK: vorps
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq
54*9880d681SAndroid Build Coastguard Worker  %fabs = tail call <8 x float> @llvm.fabs.v8f32(< 8 x float> %a) #1
55*9880d681SAndroid Build Coastguard Worker  %fsub = fsub <8 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %fabs
56*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %fsub
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @vector256_uses_abs(<8 x float> %a) {
60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: vector256_uses_abs:
61*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vandps
62*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: vorps
63*9880d681SAndroid Build Coastguard Worker; CHECK: vmulps
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq
65*9880d681SAndroid Build Coastguard Worker  %fabs = tail call <8 x float> @llvm.fabs.v8f32(<8 x float> %a) #1
66*9880d681SAndroid Build Coastguard Worker  %fsub = fsub <8 x float> <float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0, float -0.0>, %fabs
67*9880d681SAndroid Build Coastguard Worker  %fmul = fmul <8 x float> %fsub, %fabs
68*9880d681SAndroid Build Coastguard Worker  ret <8 x float> %fmul
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.fabs.v4f32(<4 x float> %p)
72*9880d681SAndroid Build Coastguard Workerdeclare <8 x float> @llvm.fabs.v8f32(<8 x float> %p)
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdeclare float @fabsf(float)
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workerattributes #1 = { readnone }
77*9880d681SAndroid Build Coastguard Worker
78