xref: /aosp_15_r20/external/llvm/test/Transforms/InstSimplify/floating-point-compare.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instsimplify -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; These tests choose arbitrarily between float and double,
5*9880d681SAndroid Build Coastguard Worker; and between uge and olt, to give reasonble coverage
6*9880d681SAndroid Build Coastguard Worker; without combinatorial explosion.
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fabs.f32(float)
9*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.sqrt.f32(float)
10*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.powi.f64(double,i32)
11*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.exp.f32(float)
12*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.minnum.f32(float, float)
13*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.maxnum.f32(float, float)
14*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.exp2.f64(double)
15*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fma.f32(float,float,float)
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdeclare void @expect_equal(i1,i1)
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerdefine i1 @orderedLessZeroTree(float,float,float,float) {
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @orderedLessZeroTree(
21*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i1 true
22*9880d681SAndroid Build Coastguard Worker;
23*9880d681SAndroid Build Coastguard Worker  %square = fmul float %0, %0
24*9880d681SAndroid Build Coastguard Worker  %abs = call float @llvm.fabs.f32(float %1)
25*9880d681SAndroid Build Coastguard Worker  %sqrt = call float @llvm.sqrt.f32(float %2)
26*9880d681SAndroid Build Coastguard Worker  %fma = call float @llvm.fma.f32(float %3, float %3, float %sqrt)
27*9880d681SAndroid Build Coastguard Worker  %div = fdiv float %square, %abs
28*9880d681SAndroid Build Coastguard Worker  %rem = frem float %sqrt, %fma
29*9880d681SAndroid Build Coastguard Worker  %add = fadd float %div, %rem
30*9880d681SAndroid Build Coastguard Worker  %uge = fcmp uge float %add, 0.000000e+00
31*9880d681SAndroid Build Coastguard Worker  ret i1 %uge
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerdefine i1 @orderedLessZeroExpExt(float) {
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @orderedLessZeroExpExt(
36*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i1 true
37*9880d681SAndroid Build Coastguard Worker;
38*9880d681SAndroid Build Coastguard Worker  %a = call float @llvm.exp.f32(float %0)
39*9880d681SAndroid Build Coastguard Worker  %b = fpext float %a to double
40*9880d681SAndroid Build Coastguard Worker  %uge = fcmp uge double %b, 0.000000e+00
41*9880d681SAndroid Build Coastguard Worker  ret i1 %uge
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine i1 @orderedLessZeroExp2Trunc(double) {
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @orderedLessZeroExp2Trunc(
46*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i1 false
47*9880d681SAndroid Build Coastguard Worker;
48*9880d681SAndroid Build Coastguard Worker  %a = call double @llvm.exp2.f64(double %0)
49*9880d681SAndroid Build Coastguard Worker  %b = fptrunc double %a to float
50*9880d681SAndroid Build Coastguard Worker  %olt = fcmp olt float %b, 0.000000e+00
51*9880d681SAndroid Build Coastguard Worker  ret i1 %olt
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine i1 @orderedLessZeroPowi(double,double) {
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @orderedLessZeroPowi(
56*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i1 false
57*9880d681SAndroid Build Coastguard Worker;
58*9880d681SAndroid Build Coastguard Worker  ; Even constant exponent
59*9880d681SAndroid Build Coastguard Worker  %a = call double @llvm.powi.f64(double %0, i32 2)
60*9880d681SAndroid Build Coastguard Worker  %square = fmul double %1, %1
61*9880d681SAndroid Build Coastguard Worker  ; Odd constant exponent with provably non-negative base
62*9880d681SAndroid Build Coastguard Worker  %b = call double @llvm.powi.f64(double %square, i32 3)
63*9880d681SAndroid Build Coastguard Worker  %c = fadd double %a, %b
64*9880d681SAndroid Build Coastguard Worker  %olt = fcmp olt double %b, 0.000000e+00
65*9880d681SAndroid Build Coastguard Worker  ret i1 %olt
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine i1 @orderedLessZeroUIToFP(i32) {
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @orderedLessZeroUIToFP(
70*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i1 true
71*9880d681SAndroid Build Coastguard Worker;
72*9880d681SAndroid Build Coastguard Worker  %a = uitofp i32 %0 to float
73*9880d681SAndroid Build Coastguard Worker  %uge = fcmp uge float %a, 0.000000e+00
74*9880d681SAndroid Build Coastguard Worker  ret i1 %uge
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdefine i1 @orderedLessZeroSelect(float, float) {
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @orderedLessZeroSelect(
79*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i1 true
80*9880d681SAndroid Build Coastguard Worker;
81*9880d681SAndroid Build Coastguard Worker  %a = call float @llvm.exp.f32(float %0)
82*9880d681SAndroid Build Coastguard Worker  %b = call float @llvm.fabs.f32(float %1)
83*9880d681SAndroid Build Coastguard Worker  %c = fcmp olt float %0, %1
84*9880d681SAndroid Build Coastguard Worker  %d = select i1 %c, float %a, float %b
85*9880d681SAndroid Build Coastguard Worker  %e = fadd float %d, 1.0
86*9880d681SAndroid Build Coastguard Worker  %uge = fcmp uge float %e, 0.000000e+00
87*9880d681SAndroid Build Coastguard Worker  ret i1 %uge
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Workerdefine i1 @orderedLessZeroMinNum(float, float) {
91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @orderedLessZeroMinNum(
92*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i1 true
93*9880d681SAndroid Build Coastguard Worker;
94*9880d681SAndroid Build Coastguard Worker  %a = call float @llvm.exp.f32(float %0)
95*9880d681SAndroid Build Coastguard Worker  %b = call float @llvm.fabs.f32(float %1)
96*9880d681SAndroid Build Coastguard Worker  %c = call float @llvm.minnum.f32(float %a, float %b)
97*9880d681SAndroid Build Coastguard Worker  %uge = fcmp uge float %c, 0.000000e+00
98*9880d681SAndroid Build Coastguard Worker  ret i1 %uge
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdefine i1 @orderedLessZeroMaxNum(float, float) {
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @orderedLessZeroMaxNum(
103*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i1 true
104*9880d681SAndroid Build Coastguard Worker;
105*9880d681SAndroid Build Coastguard Worker  %a = call float @llvm.exp.f32(float %0)
106*9880d681SAndroid Build Coastguard Worker  %b = call float @llvm.maxnum.f32(float %a, float %1)
107*9880d681SAndroid Build Coastguard Worker  %uge = fcmp uge float %b, 0.000000e+00
108*9880d681SAndroid Build Coastguard Worker  ret i1 %uge
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine i1 @nonans1(double %in1, double %in2) {
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonans1(
113*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i1 false
114*9880d681SAndroid Build Coastguard Worker;
115*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp nnan uno double %in1, %in2
116*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdefine i1 @nonans2(double %in1, double %in2) {
120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @nonans2(
121*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i1 true
122*9880d681SAndroid Build Coastguard Worker;
123*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp nnan ord double %in1, %in2
124*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
125*9880d681SAndroid Build Coastguard Worker}
126