1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=instsimplify -S < %s | FileCheck %s 3 4define i1 @sdiv_neg_neg_high_bits(i8 %x, i8 %y) { 5; CHECK-LABEL: @sdiv_neg_neg_high_bits( 6; CHECK-NEXT: ret i1 false 7; 8 %num = or i8 %x, 128 9 %denum = or i8 %y, 131 10 %div = sdiv i8 %num, %denum 11 %and = and i8 %div, 128 12 %r = icmp eq i8 %and, 128 13 ret i1 %r 14} 15 16define i1 @sdiv_pos_neg_high_bits(i8 %x, i8 %y) { 17; CHECK-LABEL: @sdiv_pos_neg_high_bits( 18; CHECK-NEXT: ret i1 false 19; 20 %xx = and i8 %x, 127 21 %num = or i8 %xx, 49 22 %denum = or i8 %y, 241 23 %div = sdiv i8 %num, %denum 24 %and = and i8 %div, 128 25 %r = icmp eq i8 %and, 0 26 ret i1 %r 27} 28 29define i1 @sdiv_pos_neg_high_bits_fail_maybez(i8 %x, i8 %y) { 30; CHECK-LABEL: @sdiv_pos_neg_high_bits_fail_maybez( 31; CHECK-NEXT: [[XX:%.*]] = and i8 [[X:%.*]], 127 32; CHECK-NEXT: [[NUM:%.*]] = or i8 [[XX]], 49 33; CHECK-NEXT: [[DENUM:%.*]] = or i8 [[Y:%.*]], -64 34; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[NUM]], [[DENUM]] 35; CHECK-NEXT: [[AND:%.*]] = and i8 [[DIV]], -128 36; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 0 37; CHECK-NEXT: ret i1 [[R]] 38; 39 %xx = and i8 %x, 127 40 %num = or i8 %xx, 49 41 %denum = or i8 %y, 192 42 %div = sdiv i8 %num, %denum 43 %and = and i8 %div, 128 44 %r = icmp eq i8 %and, 0 45 ret i1 %r 46} 47 48define i1 @sdiv_exact_pos_neg_high_bits(i8 %x, i8 %y) { 49; CHECK-LABEL: @sdiv_exact_pos_neg_high_bits( 50; CHECK-NEXT: ret i1 false 51; 52 %xx = and i8 %x, 127 53 %num = or i8 %xx, 49 54 %denum = or i8 %y, 192 55 %div = sdiv exact i8 %num, %denum 56 %and = and i8 %div, 128 57 %r = icmp eq i8 %and, 0 58 ret i1 %r 59} 60 61define i1 @sdiv_neg_pos_high_bits(i8 %x, i8 %y) { 62; CHECK-LABEL: @sdiv_neg_pos_high_bits( 63; CHECK-NEXT: ret i1 false 64; 65 %xx = and i8 %x, 159 66 %num = or i8 %xx, 129 67 %yy = and i8 %y, 15 68 %denum = or i8 %yy, 9 69 %div = sdiv i8 %num, %denum 70 %and = and i8 %div, 128 71 %r = icmp eq i8 %and, 0 72 ret i1 %r 73} 74 75define i1 @sdiv_neg_pos_high_bits_fail_maybez(i8 %x, i8 %y) { 76; CHECK-LABEL: @sdiv_neg_pos_high_bits_fail_maybez( 77; CHECK-NEXT: [[NUM:%.*]] = or i8 [[X:%.*]], -128 78; CHECK-NEXT: [[YY:%.*]] = and i8 [[Y:%.*]], 15 79; CHECK-NEXT: [[DENUM:%.*]] = or i8 [[YY]], 9 80; CHECK-NEXT: [[DIV:%.*]] = sdiv i8 [[NUM]], [[DENUM]] 81; CHECK-NEXT: [[AND:%.*]] = and i8 [[DIV]], -128 82; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 0 83; CHECK-NEXT: ret i1 [[R]] 84; 85 %num = or i8 %x, 128 86 %yy = and i8 %y, 15 87 %denum = or i8 %yy, 9 88 %div = sdiv i8 %num, %denum 89 %and = and i8 %div, 128 90 %r = icmp eq i8 %and, 0 91 ret i1 %r 92} 93 94define i1 @sdiv_exact_odd_odd(i8 %x, i8 %y) { 95; CHECK-LABEL: @sdiv_exact_odd_odd( 96; CHECK-NEXT: ret i1 false 97; 98 %num = or i8 %x, 1 99 %denum = or i8 %y, 1 100 %div = sdiv exact i8 %num, %denum 101 %and = and i8 %div, 1 102 %r = icmp eq i8 %and, 0 103 ret i1 %r 104} 105 106define i1 @sdiv_exact_even_odd(i8 %x, i8 %y) { 107; CHECK-LABEL: @sdiv_exact_even_odd( 108; CHECK-NEXT: ret i1 false 109; 110 %num = and i8 %x, -2 111 %denum = or i8 %y, 1 112 %div = sdiv exact i8 %num, %denum 113 %and = and i8 %div, 1 114 %r = icmp eq i8 %and, 1 115 ret i1 %r 116} 117 118define i1 @sdiv_exact_even_even_fail_unknown(i8 %x, i8 %y) { 119; CHECK-LABEL: @sdiv_exact_even_even_fail_unknown( 120; CHECK-NEXT: [[NUM:%.*]] = and i8 [[X:%.*]], -2 121; CHECK-NEXT: [[DENUM:%.*]] = and i8 [[Y:%.*]], -2 122; CHECK-NEXT: [[DIV:%.*]] = sdiv exact i8 [[NUM]], [[DENUM]] 123; CHECK-NEXT: [[AND:%.*]] = and i8 [[DIV]], 1 124; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 1 125; CHECK-NEXT: ret i1 [[R]] 126; 127 %num = and i8 %x, -2 128 %denum = and i8 %y, -2 129 %div = sdiv exact i8 %num, %denum 130 %and = and i8 %div, 1 131 %r = icmp eq i8 %and, 1 132 ret i1 %r 133} 134 135define i1 @sdiv_exact_even_even_fail_unknown2(i8 %x, i8 %y) { 136; CHECK-LABEL: @sdiv_exact_even_even_fail_unknown2( 137; CHECK-NEXT: [[NUM:%.*]] = and i8 [[X:%.*]], -2 138; CHECK-NEXT: [[DENUM:%.*]] = and i8 [[Y:%.*]], -2 139; CHECK-NEXT: [[DIV:%.*]] = sdiv exact i8 [[NUM]], [[DENUM]] 140; CHECK-NEXT: [[AND:%.*]] = and i8 [[DIV]], 1 141; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 0 142; CHECK-NEXT: ret i1 [[R]] 143; 144 %num = and i8 %x, -2 145 %denum = and i8 %y, -2 146 %div = sdiv exact i8 %num, %denum 147 %and = and i8 %div, 1 148 %r = icmp eq i8 %and, 0 149 ret i1 %r 150} 151 152define i1 @udiv_high_bits(i8 %x, i8 %y) { 153; CHECK-LABEL: @udiv_high_bits( 154; CHECK-NEXT: ret i1 false 155; 156 %num = and i8 %x, 129 157 %denum = or i8 %y, 31 158 %div = udiv i8 %num, %denum 159 %and = and i8 %div, 8 160 %r = icmp eq i8 %and, 8 161 ret i1 %r 162} 163 164define i1 @udiv_exact_odd_odd(i8 %x, i8 %y) { 165; CHECK-LABEL: @udiv_exact_odd_odd( 166; CHECK-NEXT: ret i1 false 167; 168 %num = or i8 %x, 1 169 %denum = or i8 %y, 1 170 %div = udiv exact i8 %num, %denum 171 %and = and i8 %div, 1 172 %r = icmp eq i8 %and, 0 173 ret i1 %r 174} 175 176define i1 @udiv_exact_even_odd(i8 %x, i8 %y) { 177; CHECK-LABEL: @udiv_exact_even_odd( 178; CHECK-NEXT: ret i1 false 179; 180 %num = and i8 %x, -2 181 %denum = or i8 %y, 1 182 %div = udiv exact i8 %num, %denum 183 %and = and i8 %div, 1 184 %r = icmp eq i8 %and, 1 185 ret i1 %r 186} 187 188define i1 @udiv_exact_even_even_fail_unknown(i8 %x, i8 %y) { 189; CHECK-LABEL: @udiv_exact_even_even_fail_unknown( 190; CHECK-NEXT: [[NUM:%.*]] = and i8 [[X:%.*]], -2 191; CHECK-NEXT: [[DENUM:%.*]] = and i8 [[Y:%.*]], -2 192; CHECK-NEXT: [[DIV:%.*]] = udiv exact i8 [[NUM]], [[DENUM]] 193; CHECK-NEXT: [[AND:%.*]] = and i8 [[DIV]], 1 194; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 1 195; CHECK-NEXT: ret i1 [[R]] 196; 197 %num = and i8 %x, -2 198 %denum = and i8 %y, -2 199 %div = udiv exact i8 %num, %denum 200 %and = and i8 %div, 1 201 %r = icmp eq i8 %and, 1 202 ret i1 %r 203} 204 205define i1 @udiv_exact_even_even_fail_unknown2(i8 %x, i8 %y) { 206; CHECK-LABEL: @udiv_exact_even_even_fail_unknown2( 207; CHECK-NEXT: [[NUM:%.*]] = and i8 [[X:%.*]], -2 208; CHECK-NEXT: [[DENUM:%.*]] = and i8 [[Y:%.*]], -2 209; CHECK-NEXT: [[DIV:%.*]] = udiv exact i8 [[NUM]], [[DENUM]] 210; CHECK-NEXT: [[AND:%.*]] = and i8 [[DIV]], 1 211; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[AND]], 0 212; CHECK-NEXT: ret i1 [[R]] 213; 214 %num = and i8 %x, -2 215 %denum = and i8 %y, -2 216 %div = udiv exact i8 %num, %denum 217 %and = and i8 %div, 1 218 %r = icmp eq i8 %and, 0 219 ret i1 %r 220} 221