1 ; RUN: opt < %s -instcombine -S | FileCheck %s 2 3 target datalayout = "e-p:64:64:64-p1:16:16:16-p2:32:32:32-p3:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 4 5 ; CHECK-LABEL: @lshr_eq_msb_low_last_zero 6 ; CHECK-NEXT: icmp ugt i8 %a, 6 7 define i1 @lshr_eq_msb_low_last_zero(i8 %a) { 8 %shr = lshr i8 127, %a 9 %cmp = icmp eq i8 %shr, 0 10 ret i1 %cmp 11 } 12 13 ; CHECK-LABEL: @ashr_eq_msb_low_second_zero 14 ; CHECK-NEXT: icmp ugt i8 %a, 6 15 define i1 @ashr_eq_msb_low_second_zero(i8 %a) { 16 %shr = ashr i8 127, %a 17 %cmp = icmp eq i8 %shr, 0 18 ret i1 %cmp 19 } 20 21 ; CHECK-LABEL: @lshr_ne_msb_low_last_zero 22 ; CHECK-NEXT: icmp ult i8 %a, 7 23 define i1 @lshr_ne_msb_low_last_zero(i8 %a) { 24 %shr = lshr i8 127, %a 25 %cmp = icmp ne i8 %shr, 0 26 ret i1 %cmp 27 } 28 29 ; CHECK-LABEL: @ashr_ne_msb_low_second_zero 30 ; CHECK-NEXT: icmp ult i8 %a, 7 31 define i1 @ashr_ne_msb_low_second_zero(i8 %a) { 32 %shr = ashr i8 127, %a 33 %cmp = icmp ne i8 %shr, 0 34 ret i1 %cmp 35 } 36 37 ; CHECK-LABEL: @ashr_eq_both_equal 38 ; CHECK-NEXT: icmp eq i8 %a, 0 39 define i1 @ashr_eq_both_equal(i8 %a) { 40 %shr = ashr i8 128, %a 41 %cmp = icmp eq i8 %shr, 128 42 ret i1 %cmp 43 } 44 45 ; CHECK-LABEL: @ashr_ne_both_equal 46 ; CHECK-NEXT: icmp ne i8 %a, 0 47 define i1 @ashr_ne_both_equal(i8 %a) { 48 %shr = ashr i8 128, %a 49 %cmp = icmp ne i8 %shr, 128 50 ret i1 %cmp 51 } 52 53 ; CHECK-LABEL: @lshr_eq_both_equal 54 ; CHECK-NEXT: icmp eq i8 %a, 0 55 define i1 @lshr_eq_both_equal(i8 %a) { 56 %shr = lshr i8 127, %a 57 %cmp = icmp eq i8 %shr, 127 58 ret i1 %cmp 59 } 60 61 ; CHECK-LABEL: @lshr_ne_both_equal 62 ; CHECK-NEXT: icmp ne i8 %a, 0 63 define i1 @lshr_ne_both_equal(i8 %a) { 64 %shr = lshr i8 127, %a 65 %cmp = icmp ne i8 %shr, 127 66 ret i1 %cmp 67 } 68 69 ; CHECK-LABEL: @exact_ashr_eq_both_equal 70 ; CHECK-NEXT: icmp eq i8 %a, 0 71 define i1 @exact_ashr_eq_both_equal(i8 %a) { 72 %shr = ashr exact i8 128, %a 73 %cmp = icmp eq i8 %shr, 128 74 ret i1 %cmp 75 } 76 77 ; CHECK-LABEL: @exact_ashr_ne_both_equal 78 ; CHECK-NEXT: icmp ne i8 %a, 0 79 define i1 @exact_ashr_ne_both_equal(i8 %a) { 80 %shr = ashr exact i8 128, %a 81 %cmp = icmp ne i8 %shr, 128 82 ret i1 %cmp 83 } 84 85 ; CHECK-LABEL: @exact_lshr_eq_both_equal 86 ; CHECK-NEXT: icmp eq i8 %a, 0 87 define i1 @exact_lshr_eq_both_equal(i8 %a) { 88 %shr = lshr exact i8 126, %a 89 %cmp = icmp eq i8 %shr, 126 90 ret i1 %cmp 91 } 92 93 ; CHECK-LABEL: @exact_lshr_ne_both_equal 94 ; CHECK-NEXT: icmp ne i8 %a, 0 95 define i1 @exact_lshr_ne_both_equal(i8 %a) { 96 %shr = lshr exact i8 126, %a 97 %cmp = icmp ne i8 %shr, 126 98 ret i1 %cmp 99 } 100 101 ; CHECK-LABEL: @exact_lshr_eq_opposite_msb 102 ; CHECK-NEXT: icmp eq i8 %a, 7 103 define i1 @exact_lshr_eq_opposite_msb(i8 %a) { 104 %shr = lshr exact i8 -128, %a 105 %cmp = icmp eq i8 %shr, 1 106 ret i1 %cmp 107 } 108 109 ; CHECK-LABEL: @lshr_eq_opposite_msb 110 ; CHECK-NEXT: icmp eq i8 %a, 7 111 define i1 @lshr_eq_opposite_msb(i8 %a) { 112 %shr = lshr i8 -128, %a 113 %cmp = icmp eq i8 %shr, 1 114 ret i1 %cmp 115 } 116 117 ; CHECK-LABEL: @exact_lshr_ne_opposite_msb 118 ; CHECK-NEXT: icmp ne i8 %a, 7 119 define i1 @exact_lshr_ne_opposite_msb(i8 %a) { 120 %shr = lshr exact i8 -128, %a 121 %cmp = icmp ne i8 %shr, 1 122 ret i1 %cmp 123 } 124 125 ; CHECK-LABEL: @lshr_ne_opposite_msb 126 ; CHECK-NEXT: icmp ne i8 %a, 7 127 define i1 @lshr_ne_opposite_msb(i8 %a) { 128 %shr = lshr i8 -128, %a 129 %cmp = icmp ne i8 %shr, 1 130 ret i1 %cmp 131 } 132 133 ; CHECK-LABEL: @exact_ashr_eq 134 ; CHECK-NEXT: icmp eq i8 %a, 7 135 define i1 @exact_ashr_eq(i8 %a) { 136 %shr = ashr exact i8 -128, %a 137 %cmp = icmp eq i8 %shr, -1 138 ret i1 %cmp 139 } 140 141 ; CHECK-LABEL: @exact_ashr_ne 142 ; CHECK-NEXT: icmp ne i8 %a, 7 143 define i1 @exact_ashr_ne(i8 %a) { 144 %shr = ashr exact i8 -128, %a 145 %cmp = icmp ne i8 %shr, -1 146 ret i1 %cmp 147 } 148 149 ; CHECK-LABEL: @exact_lshr_eq 150 ; CHECK-NEXT: icmp eq i8 %a, 2 151 define i1 @exact_lshr_eq(i8 %a) { 152 %shr = lshr exact i8 4, %a 153 %cmp = icmp eq i8 %shr, 1 154 ret i1 %cmp 155 } 156 157 ; CHECK-LABEL: @exact_lshr_ne 158 ; CHECK-NEXT: icmp ne i8 %a, 2 159 define i1 @exact_lshr_ne(i8 %a) { 160 %shr = lshr exact i8 4, %a 161 %cmp = icmp ne i8 %shr, 1 162 ret i1 %cmp 163 } 164 165 ; CHECK-LABEL: @nonexact_ashr_eq 166 ; CHECK-NEXT: icmp eq i8 %a, 7 167 define i1 @nonexact_ashr_eq(i8 %a) { 168 %shr = ashr i8 -128, %a 169 %cmp = icmp eq i8 %shr, -1 170 ret i1 %cmp 171 } 172 173 ; CHECK-LABEL: @nonexact_ashr_ne 174 ; CHECK-NEXT: icmp ne i8 %a, 7 175 define i1 @nonexact_ashr_ne(i8 %a) { 176 %shr = ashr i8 -128, %a 177 %cmp = icmp ne i8 %shr, -1 178 ret i1 %cmp 179 } 180 181 ; CHECK-LABEL: @nonexact_lshr_eq 182 ; CHECK-NEXT: icmp eq i8 %a, 2 183 define i1 @nonexact_lshr_eq(i8 %a) { 184 %shr = lshr i8 4, %a 185 %cmp = icmp eq i8 %shr, 1 186 ret i1 %cmp 187 } 188 189 ; CHECK-LABEL: @nonexact_lshr_ne 190 ; CHECK-NEXT: icmp ne i8 %a, 2 191 define i1 @nonexact_lshr_ne(i8 %a) { 192 %shr = lshr i8 4, %a 193 %cmp = icmp ne i8 %shr, 1 194 ret i1 %cmp 195 } 196 197 ; CHECK-LABEL: @exact_lshr_eq_exactdiv 198 ; CHECK-NEXT: icmp eq i8 %a, 4 199 define i1 @exact_lshr_eq_exactdiv(i8 %a) { 200 %shr = lshr exact i8 80, %a 201 %cmp = icmp eq i8 %shr, 5 202 ret i1 %cmp 203 } 204 205 ; CHECK-LABEL: @exact_lshr_ne_exactdiv 206 ; CHECK-NEXT: icmp ne i8 %a, 4 207 define i1 @exact_lshr_ne_exactdiv(i8 %a) { 208 %shr = lshr exact i8 80, %a 209 %cmp = icmp ne i8 %shr, 5 210 ret i1 %cmp 211 } 212 213 ; CHECK-LABEL: @nonexact_lshr_eq_exactdiv 214 ; CHECK-NEXT: icmp eq i8 %a, 4 215 define i1 @nonexact_lshr_eq_exactdiv(i8 %a) { 216 %shr = lshr i8 80, %a 217 %cmp = icmp eq i8 %shr, 5 218 ret i1 %cmp 219 } 220 221 ; CHECK-LABEL: @nonexact_lshr_ne_exactdiv 222 ; CHECK-NEXT: icmp ne i8 %a, 4 223 define i1 @nonexact_lshr_ne_exactdiv(i8 %a) { 224 %shr = lshr i8 80, %a 225 %cmp = icmp ne i8 %shr, 5 226 ret i1 %cmp 227 } 228 229 ; CHECK-LABEL: @exact_ashr_eq_exactdiv 230 ; CHECK-NEXT: icmp eq i8 %a, 4 231 define i1 @exact_ashr_eq_exactdiv(i8 %a) { 232 %shr = ashr exact i8 -80, %a 233 %cmp = icmp eq i8 %shr, -5 234 ret i1 %cmp 235 } 236 237 ; CHECK-LABEL: @exact_ashr_ne_exactdiv 238 ; CHECK-NEXT: icmp ne i8 %a, 4 239 define i1 @exact_ashr_ne_exactdiv(i8 %a) { 240 %shr = ashr exact i8 -80, %a 241 %cmp = icmp ne i8 %shr, -5 242 ret i1 %cmp 243 } 244 245 ; CHECK-LABEL: @nonexact_ashr_eq_exactdiv 246 ; CHECK-NEXT: icmp eq i8 %a, 4 247 define i1 @nonexact_ashr_eq_exactdiv(i8 %a) { 248 %shr = ashr i8 -80, %a 249 %cmp = icmp eq i8 %shr, -5 250 ret i1 %cmp 251 } 252 253 ; CHECK-LABEL: @nonexact_ashr_ne_exactdiv 254 ; CHECK-NEXT: icmp ne i8 %a, 4 255 define i1 @nonexact_ashr_ne_exactdiv(i8 %a) { 256 %shr = ashr i8 -80, %a 257 %cmp = icmp ne i8 %shr, -5 258 ret i1 %cmp 259 } 260 261 ; CHECK-LABEL: @exact_lshr_eq_noexactdiv 262 ; CHECK-NEXT: ret i1 false 263 define i1 @exact_lshr_eq_noexactdiv(i8 %a) { 264 %shr = lshr exact i8 80, %a 265 %cmp = icmp eq i8 %shr, 31 266 ret i1 %cmp 267 } 268 269 ; CHECK-LABEL: @exact_lshr_ne_noexactdiv 270 ; CHECK-NEXT: ret i1 true 271 define i1 @exact_lshr_ne_noexactdiv(i8 %a) { 272 %shr = lshr exact i8 80, %a 273 %cmp = icmp ne i8 %shr, 31 274 ret i1 %cmp 275 } 276 277 ; CHECK-LABEL: @nonexact_lshr_eq_noexactdiv 278 ; CHECK-NEXT: ret i1 false 279 define i1 @nonexact_lshr_eq_noexactdiv(i8 %a) { 280 %shr = lshr i8 80, %a 281 %cmp = icmp eq i8 %shr, 31 282 ret i1 %cmp 283 } 284 285 ; CHECK-LABEL: @nonexact_lshr_ne_noexactdiv 286 ; CHECK-NEXT: ret i1 true 287 define i1 @nonexact_lshr_ne_noexactdiv(i8 %a) { 288 %shr = lshr i8 80, %a 289 %cmp = icmp ne i8 %shr, 31 290 ret i1 %cmp 291 } 292 293 ; CHECK-LABEL: @exact_ashr_eq_noexactdiv 294 ; CHECK-NEXT: ret i1 false 295 define i1 @exact_ashr_eq_noexactdiv(i8 %a) { 296 %shr = ashr exact i8 -80, %a 297 %cmp = icmp eq i8 %shr, -31 298 ret i1 %cmp 299 } 300 301 ; CHECK-LABEL: @exact_ashr_ne_noexactdiv 302 ; CHECK-NEXT: ret i1 true 303 define i1 @exact_ashr_ne_noexactdiv(i8 %a) { 304 %shr = ashr exact i8 -80, %a 305 %cmp = icmp ne i8 %shr, -31 306 ret i1 %cmp 307 } 308 309 ; CHECK-LABEL: @nonexact_ashr_eq_noexactdiv 310 ; CHECK-NEXT: ret i1 false 311 define i1 @nonexact_ashr_eq_noexactdiv(i8 %a) { 312 %shr = ashr i8 -80, %a 313 %cmp = icmp eq i8 %shr, -31 314 ret i1 %cmp 315 } 316 317 ; CHECK-LABEL: @nonexact_ashr_ne_noexactdiv 318 ; CHECK-NEXT: ret i1 true 319 define i1 @nonexact_ashr_ne_noexactdiv(i8 %a) { 320 %shr = ashr i8 -80, %a 321 %cmp = icmp ne i8 %shr, -31 322 ret i1 %cmp 323 } 324 325 ; CHECK-LABEL: @nonexact_lshr_eq_noexactlog 326 ; CHECK-NEXT: ret i1 false 327 define i1 @nonexact_lshr_eq_noexactlog(i8 %a) { 328 %shr = lshr i8 90, %a 329 %cmp = icmp eq i8 %shr, 30 330 ret i1 %cmp 331 } 332 333 ; CHECK-LABEL: @nonexact_lshr_ne_noexactlog 334 ; CHECK-NEXT: ret i1 true 335 define i1 @nonexact_lshr_ne_noexactlog(i8 %a) { 336 %shr = lshr i8 90, %a 337 %cmp = icmp ne i8 %shr, 30 338 ret i1 %cmp 339 } 340 341 ; CHECK-LABEL: @nonexact_ashr_eq_noexactlog 342 ; CHECK-NEXT: ret i1 false 343 define i1 @nonexact_ashr_eq_noexactlog(i8 %a) { 344 %shr = ashr i8 -90, %a 345 %cmp = icmp eq i8 %shr, -30 346 ret i1 %cmp 347 } 348 349 ; CHECK-LABEL: @nonexact_ashr_ne_noexactlog 350 ; CHECK-NEXT: ret i1 true 351 define i1 @nonexact_ashr_ne_noexactlog(i8 %a) { 352 %shr = ashr i8 -90, %a 353 %cmp = icmp ne i8 %shr, -30 354 ret i1 %cmp 355 } 356 357 ; Don't try to fold the entire body of function @PR20945 into a 358 ; single `ret i1 true` statement. 359 ; If %B is equal to 1, then this function would return false. 360 ; As a consequence, the instruction combiner is not allowed to fold %cmp 361 ; to 'true'. Instead, it should replace %cmp with a simpler comparison 362 ; between %B and 1. 363 364 ; CHECK-LABEL: @PR20945( 365 ; CHECK: icmp ne i32 %B, 1 366 define i1 @PR20945(i32 %B) { 367 %shr = ashr i32 -9, %B 368 %cmp = icmp ne i32 %shr, -5 369 ret i1 %cmp 370 } 371 372 ; CHECK-LABEL: @PR21222 373 ; CHECK: icmp eq i32 %B, 6 374 define i1 @PR21222(i32 %B) { 375 %shr = ashr i32 -93, %B 376 %cmp = icmp eq i32 %shr, -2 377 ret i1 %cmp 378 } 379 380 ; CHECK-LABEL: @PR24873( 381 ; CHECK: %[[icmp:.*]] = icmp ugt i64 %V, 61 382 ; CHECK-NEXT: ret i1 %[[icmp]] 383 define i1 @PR24873(i64 %V) { 384 %ashr = ashr i64 -4611686018427387904, %V 385 %icmp = icmp eq i64 %ashr, -1 386 ret i1 %icmp 387 } 388