blob: 0eb729047e7100c7f7ec493953badb8db159a47e [file] [log] [blame]
Matt Arsenault238ff1a2014-11-24 23:15:18 +00001; 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}