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 6 define 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 } 11 define 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 } 16 define 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 } 21 define 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 } 26 define 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 } 31 define 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 } 36 define 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 } 41 define 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 } 46 define 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 } 51 define 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 } 56 define 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 } 61 define 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 } 66 define 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 } 71 define 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 } 76 define 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 } 81 define 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