xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/minmax-fp.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; CHECK-LABEL: @t1
4*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oge float %a, 5.000000e+00
5*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float 5.000000e+00, float %a
6*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fpext float %1 to double
7*9880d681SAndroid Build Coastguard Workerdefine double @t1(float %a) {
8*9880d681SAndroid Build Coastguard Worker  ; This is the canonical form for a type-changing min/max.
9*9880d681SAndroid Build Coastguard Worker  %1 = fcmp ult float %a, 5.0
10*9880d681SAndroid Build Coastguard Worker  %2 = select i1 %1, float %a, float 5.0
11*9880d681SAndroid Build Coastguard Worker  %3 = fpext float %2 to double
12*9880d681SAndroid Build Coastguard Worker  ret double %3
13*9880d681SAndroid Build Coastguard Worker}
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t2
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oge float %a, 5.000000e+00
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float 5.000000e+00, float %a
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fpext float %1 to double
19*9880d681SAndroid Build Coastguard Workerdefine double @t2(float %a) {
20*9880d681SAndroid Build Coastguard Worker  ; Check this is converted into canonical form, as above.
21*9880d681SAndroid Build Coastguard Worker  %1 = fcmp ult float %a, 5.0
22*9880d681SAndroid Build Coastguard Worker  %2 = fpext float %a to double
23*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %1, double %2, double 5.0
24*9880d681SAndroid Build Coastguard Worker  ret double %3
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t4
28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oge double %a, 5.000000e+00
29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, double 5.000000e+00, double %a
30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptrunc double %1 to float
31*9880d681SAndroid Build Coastguard Workerdefine float @t4(double %a) {
32*9880d681SAndroid Build Coastguard Worker  ; Same again, with trunc.
33*9880d681SAndroid Build Coastguard Worker  %1 = fcmp ult double %a, 5.0
34*9880d681SAndroid Build Coastguard Worker  %2 = fptrunc double %a to float
35*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %1, float %2, float 5.0
36*9880d681SAndroid Build Coastguard Worker  ret float %3
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t5
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ult float %a, 5.000000e+00
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fpext float %a to double
42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %1, double %2, double 5.001
43*9880d681SAndroid Build Coastguard Workerdefine double @t5(float %a) {
44*9880d681SAndroid Build Coastguard Worker  ; different values, should not be converted.
45*9880d681SAndroid Build Coastguard Worker  %1 = fcmp ult float %a, 5.0
46*9880d681SAndroid Build Coastguard Worker  %2 = fpext float %a to double
47*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %1, double %2, double 5.001
48*9880d681SAndroid Build Coastguard Worker  ret double %3
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t6
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ult float %a, -0.0
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fpext float %a to double
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %1, double %2, double 0.0
55*9880d681SAndroid Build Coastguard Workerdefine double @t6(float %a) {
56*9880d681SAndroid Build Coastguard Worker  ; Signed zero, should not be converted
57*9880d681SAndroid Build Coastguard Worker  %1 = fcmp ult float %a, -0.0
58*9880d681SAndroid Build Coastguard Worker  %2 = fpext float %a to double
59*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %1, double %2, double 0.0
60*9880d681SAndroid Build Coastguard Worker  ret double %3
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t7
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ult float %a, 0.0
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fpext float %a to double
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %1, double %2, double -0.0
67*9880d681SAndroid Build Coastguard Workerdefine double @t7(float %a) {
68*9880d681SAndroid Build Coastguard Worker  ; Signed zero, should not be converted
69*9880d681SAndroid Build Coastguard Worker  %1 = fcmp ult float %a, 0.0
70*9880d681SAndroid Build Coastguard Worker  %2 = fpext float %a to double
71*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %1, double %2, double -0.0
72*9880d681SAndroid Build Coastguard Worker  ret double %3
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t8
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oge float %a, 5.000000e+00
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float 5.000000e+00, float %a
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptoui float %1 to i64
79*9880d681SAndroid Build Coastguard Workerdefine i64 @t8(float %a) {
80*9880d681SAndroid Build Coastguard Worker  %1 = fcmp ult float %a, 5.0
81*9880d681SAndroid Build Coastguard Worker  %2 = fptoui float %a to i64
82*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %1, i64 %2, i64 5
83*9880d681SAndroid Build Coastguard Worker  ret i64 %3
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t9
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp oge float %a, 0.000000e+00
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float 0.000000e+00, float %a
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi float %1 to i8
90*9880d681SAndroid Build Coastguard Workerdefine i8 @t9(float %a) {
91*9880d681SAndroid Build Coastguard Worker  %1 = fcmp ult float %a, 0.0
92*9880d681SAndroid Build Coastguard Worker  %2 = fptosi float %a to i8
93*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %1, i8 %2, i8 0
94*9880d681SAndroid Build Coastguard Worker  ret i8 %3
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t11
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp fast oge float %b, %a
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float %a, float %b
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi
101*9880d681SAndroid Build Coastguard Workerdefine i8 @t11(float %a, float %b) {
102*9880d681SAndroid Build Coastguard Worker  ; Either operand could be NaN, but fast modifier applied.
103*9880d681SAndroid Build Coastguard Worker  %1 = fcmp fast ult float %b, %a
104*9880d681SAndroid Build Coastguard Worker  %2 = fptosi float %a to i8
105*9880d681SAndroid Build Coastguard Worker  %3 = fptosi float %b to i8
106*9880d681SAndroid Build Coastguard Worker  %4 = select i1 %1, i8 %3, i8 %2
107*9880d681SAndroid Build Coastguard Worker  ret i8 %4
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t12
111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp nnan oge float %b, %a
112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float %a, float %b
113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi float %.v to i8
114*9880d681SAndroid Build Coastguard Workerdefine i8 @t12(float %a, float %b) {
115*9880d681SAndroid Build Coastguard Worker  ; Either operand could be NaN, but nnan modifier applied.
116*9880d681SAndroid Build Coastguard Worker  %1 = fcmp nnan ult float %b, %a
117*9880d681SAndroid Build Coastguard Worker  %2 = fptosi float %a to i8
118*9880d681SAndroid Build Coastguard Worker  %3 = fptosi float %b to i8
119*9880d681SAndroid Build Coastguard Worker  %4 = select i1 %1, i8 %3, i8 %2
120*9880d681SAndroid Build Coastguard Worker  ret i8 %4
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t13
124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ult float %a, 1.500000e+00
125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi float %a to i8
126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %1, i8 %2, i8 1
127*9880d681SAndroid Build Coastguard Workerdefine i8 @t13(float %a) {
128*9880d681SAndroid Build Coastguard Worker  ; Float and int values do not match.
129*9880d681SAndroid Build Coastguard Worker  %1 = fcmp ult float %a, 1.5
130*9880d681SAndroid Build Coastguard Worker  %2 = fptosi float %a to i8
131*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %1, i8 %2, i8 1
132*9880d681SAndroid Build Coastguard Worker  ret i8 %3
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t14
136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp ule float %a, 0.000000e+00
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi float %a to i8
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %1, i8 %2, i8 0
139*9880d681SAndroid Build Coastguard Workerdefine i8 @t14(float %a) {
140*9880d681SAndroid Build Coastguard Worker  ; <= comparison, where %a could be -0.0. Not safe.
141*9880d681SAndroid Build Coastguard Worker  %1 = fcmp ule float %a, 0.0
142*9880d681SAndroid Build Coastguard Worker  %2 = fptosi float %a to i8
143*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %1, i8 %2, i8 0
144*9880d681SAndroid Build Coastguard Worker  ret i8 %3
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t15
148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fcmp nsz oge float %a, 0.000000e+00
149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select i1 %.inv, float 0.000000e+00, float %a
150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: fptosi float %1 to i8
151*9880d681SAndroid Build Coastguard Workerdefine i8 @t15(float %a) {
152*9880d681SAndroid Build Coastguard Worker  %1 = fcmp nsz ule float %a, 0.0
153*9880d681SAndroid Build Coastguard Worker  %2 = fptosi float %a to i8
154*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %1, i8 %2, i8 0
155*9880d681SAndroid Build Coastguard Worker  ret i8 %3
156*9880d681SAndroid Build Coastguard Worker}
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t16
159*9880d681SAndroid Build Coastguard Worker; CHECK:  %[[cmp:.*]] = icmp sgt i32 %x, 0
160*9880d681SAndroid Build Coastguard Worker; CHECK:  %[[cst:.*]] = sitofp i32 %x to double
161*9880d681SAndroid Build Coastguard Worker; CHECK:  %[[sel:.*]] = select i1 %[[cmp]], double %[[cst]], double 5.000000e-01
162*9880d681SAndroid Build Coastguard Worker; CHECK:  ret double %[[sel]]
163*9880d681SAndroid Build Coastguard Workerdefine double @t16(i32 %x) {
164*9880d681SAndroid Build Coastguard Workerentry:
165*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %x, 0
166*9880d681SAndroid Build Coastguard Worker  %cst = sitofp i32 %x to double
167*9880d681SAndroid Build Coastguard Worker  %sel = select i1 %cmp, double %cst, double 5.000000e-01
168*9880d681SAndroid Build Coastguard Worker  ret double %sel
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @t17
172*9880d681SAndroid Build Coastguard Worker; CHECK:  %[[cmp:.*]] = icmp sgt i32 %x, 2
173*9880d681SAndroid Build Coastguard Worker; CHECK:  %[[sel:.*]] = select i1 %[[cmp]], i32 %x, i32 2
174*9880d681SAndroid Build Coastguard Worker; CHECK:  %[[cst:.*]] = sitofp i32 %[[sel]] to double
175*9880d681SAndroid Build Coastguard Worker; CHECK:  ret double %[[cst]]
176*9880d681SAndroid Build Coastguard Workerdefine double @t17(i32 %x) {
177*9880d681SAndroid Build Coastguard Workerentry:
178*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %x, 2
179*9880d681SAndroid Build Coastguard Worker  %cst = sitofp i32 %x to double
180*9880d681SAndroid Build Coastguard Worker  %sel = select i1 %cmp, double %cst, double 2.0
181*9880d681SAndroid Build Coastguard Worker  ret double %sel
182*9880d681SAndroid Build Coastguard Worker}
183