1; RUN: opt < %s -instcombine -S | grep "icmp s[lg]t i32 %n, 0" | count 16
2
3; Instcombine should recognize that this code can be adjusted
4; to fit the canonical smax/smin pattern.
5
6define i32 @floor_a(i32 %n) {
7  %t = icmp sgt i32 %n, -1
8  %m = select i1 %t, i32 %n, i32 0
9  ret i32 %m
10}
11define i32 @ceil_a(i32 %n) {
12  %t = icmp slt i32 %n, 1
13  %m = select i1 %t, i32 %n, i32 0
14  ret i32 %m
15}
16define i32 @floor_b(i32 %n) {
17  %t = icmp sgt i32 %n, 0
18  %m = select i1 %t, i32 %n, i32 0
19  ret i32 %m
20}
21define i32 @ceil_b(i32 %n) {
22  %t = icmp slt i32 %n, 0
23  %m = select i1 %t, i32 %n, i32 0
24  ret i32 %m
25}
26define i32 @floor_c(i32 %n) {
27  %t = icmp sge i32 %n, 0
28  %m = select i1 %t, i32 %n, i32 0
29  ret i32 %m
30}
31define i32 @ceil_c(i32 %n) {
32  %t = icmp sle i32 %n, 0
33  %m = select i1 %t, i32 %n, i32 0
34  ret i32 %m
35}
36define i32 @floor_d(i32 %n) {
37  %t = icmp sge i32 %n, 1
38  %m = select i1 %t, i32 %n, i32 0
39  ret i32 %m
40}
41define i32 @ceil_d(i32 %n) {
42  %t = icmp sle i32 %n, -1
43  %m = select i1 %t, i32 %n, i32 0
44  ret i32 %m
45}
46define i32 @floor_e(i32 %n) {
47  %t = icmp sgt i32 %n, -1
48  %m = select i1 %t, i32 %n, i32 0
49  ret i32 %m
50}
51define i32 @ceil_e(i32 %n) {
52  %t = icmp slt i32 %n, 1
53  %m = select i1 %t, i32 %n, i32 0
54  ret i32 %m
55}
56define i32 @floor_f(i32 %n) {
57  %t = icmp sgt i32 %n, 0
58  %m = select i1 %t, i32 %n, i32 0
59  ret i32 %m
60}
61define i32 @ceil_f(i32 %n) {
62  %t = icmp slt i32 %n, 0
63  %m = select i1 %t, i32 %n, i32 0
64  ret i32 %m
65}
66define i32 @floor_g(i32 %n) {
67  %t = icmp sge i32 %n, 0
68  %m = select i1 %t, i32 %n, i32 0
69  ret i32 %m
70}
71define i32 @ceil_g(i32 %n) {
72  %t = icmp sle i32 %n, 0
73  %m = select i1 %t, i32 %n, i32 0
74  ret i32 %m
75}
76define i32 @floor_h(i32 %n) {
77  %t = icmp sge i32 %n, 1
78  %m = select i1 %t, i32 %n, i32 0
79  ret i32 %m
80}
81define i32 @ceil_h(i32 %n) {
82  %t = icmp sle i32 %n, -1
83  %m = select i1 %t, i32 %n, i32 0
84  ret i32 %m
85}
86