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