1; RUN: opt -S -instcombine < %s | FileCheck %s
2
3; CHECK-LABEL: @select_max_ugt(
4; CHECK: %cmp.inv = fcmp ole float %a, %b
5; CHECK-NEXT: %sel = select i1 %cmp.inv, float %b, float %a
6; CHECK-NEXT: ret float %sel
7define float @select_max_ugt(float %a, float %b) {
8  %cmp = fcmp ugt float %a, %b
9  %sel = select i1 %cmp, float %a, float %b
10  ret float %sel
11}
12
13; CHECK-LABEL: @select_max_uge(
14; CHECK: %cmp.inv = fcmp olt float %a, %b
15; CHECK-NEXT: %sel = select i1 %cmp.inv, float %b, float %a
16; CHECK-NEXT: ret float %sel
17define float @select_max_uge(float %a, float %b) {
18  %cmp = fcmp uge float %a, %b
19  %sel = select i1 %cmp, float %a, float %b
20  ret float %sel
21}
22
23; CHECK-LABEL: @select_min_ugt(
24; CHECK: %cmp.inv = fcmp ole float %a, %b
25; CHECK-NEXT: %sel = select i1 %cmp.inv, float %a, float %b
26; CHECK-NEXT: ret float %sel
27define float @select_min_ugt(float %a, float %b) {
28  %cmp = fcmp ugt float %a, %b
29  %sel = select i1 %cmp, float %b, float %a
30  ret float %sel
31}
32
33; CHECK-LABEL: @select_min_uge(
34; CHECK: %cmp.inv = fcmp olt float %a, %b
35; CHECK-NEXT: %sel = select i1 %cmp.inv, float %a, float %b
36; CHECK-NEXT: ret float %sel
37define float @select_min_uge(float %a, float %b) {
38  %cmp = fcmp uge float %a, %b
39  %sel = select i1 %cmp, float %b, float %a
40  ret float %sel
41}
42
43; CHECK-LABEL: @select_max_ult(
44; CHECK: %cmp.inv = fcmp oge float %a, %b
45; CHECK-NEXT: %sel = select i1 %cmp.inv, float %a, float %b
46; CHECK-NEXT: ret float %sel
47define float @select_max_ult(float %a, float %b) {
48  %cmp = fcmp ult float %a, %b
49  %sel = select i1 %cmp, float %b, float %a
50  ret float %sel
51}
52
53; CHECK-LABEL: @select_max_ule(
54; CHECK: %cmp.inv = fcmp ogt float %a, %b
55; CHECK-NEXT: %sel = select i1 %cmp.inv, float %a, float %b
56; CHECK: ret float %sel
57define float @select_max_ule(float %a, float %b) {
58  %cmp = fcmp ule float %a, %b
59  %sel = select i1 %cmp, float %b, float %a
60  ret float %sel
61}
62
63; CHECK-LABEL: @select_min_ult(
64; CHECK: %cmp.inv = fcmp oge float %a, %b
65; CHECK-NEXT: %sel = select i1 %cmp.inv, float %b, float %a
66; CHECK-NEXT: ret float %sel
67define float @select_min_ult(float %a, float %b) {
68  %cmp = fcmp ult float %a, %b
69  %sel = select i1 %cmp, float %a, float %b
70  ret float %sel
71}
72
73; CHECK-LABEL: @select_min_ule(
74; CHECK: %cmp.inv = fcmp ogt float %a, %b
75; CHECK-NEXT: %sel = select i1 %cmp.inv, float %b, float %a
76; CHECK-NEXT: ret float %sel
77define float @select_min_ule(float %a, float %b) {
78  %cmp = fcmp ule float %a, %b
79  %sel = select i1 %cmp, float %a, float %b
80  ret float %sel
81}
82
83; CHECK-LABEL: @select_fcmp_une(
84; CHECK:  %cmp.inv = fcmp oeq float %a, %b
85; CHECK-NEXT:  %sel = select i1 %cmp.inv, float %b, float %a
86; CHECK-NEXT: ret float %sel
87define float @select_fcmp_une(float %a, float %b) {
88  %cmp = fcmp une float %a, %b
89  %sel = select i1 %cmp, float %a, float %b
90  ret float %sel
91}
92
93; CHECK-LABEL: @select_fcmp_ueq
94; CHECK:  %cmp.inv = fcmp one float %a, %b
95; CHECK-NEXT:  %sel = select i1 %cmp.inv, float %b, float %a
96; CHECK-NEXT: ret float %sel
97define float @select_fcmp_ueq(float %a, float %b) {
98  %cmp = fcmp ueq float %a, %b
99  %sel = select i1 %cmp, float %a, float %b
100  ret float %sel
101}
102
103declare void @foo(i1)
104
105; CHECK-LABEL: @select_max_ugt_2_use_cmp(
106; CHECK: fcmp ugt
107; CHECK-NOT: fcmp
108; CHECK: ret
109define float @select_max_ugt_2_use_cmp(float %a, float %b) {
110  %cmp = fcmp ugt float %a, %b
111  call void @foo(i1 %cmp)
112  %sel = select i1 %cmp, float %a, float %b
113  ret float %sel
114}
115
116; CHECK-LABEL: @select_min_uge_2_use_cmp(
117; CHECK: fcmp uge
118; CHECK-NOT: fcmp
119; CHECK: ret
120define float @select_min_uge_2_use_cmp(float %a, float %b) {
121  %cmp = fcmp uge float %a, %b
122  call void @foo(i1 %cmp)
123  %sel = select i1 %cmp, float %b, float %a
124  ret float %sel
125}
126