1; RUN: opt < %s -instsimplify -S | FileCheck %s 2target datalayout = "p:32:32" 3 4define i1 @ptrtoint() { 5; CHECK-LABEL: @ptrtoint( 6 %a = alloca i8 7 %tmp = ptrtoint i8* %a to i32 8 %r = icmp eq i32 %tmp, 0 9 ret i1 %r 10; CHECK: ret i1 false 11} 12 13define i1 @bitcast() { 14; CHECK-LABEL: @bitcast( 15 %a = alloca i32 16 %b = alloca i64 17 %x = bitcast i32* %a to i8* 18 %y = bitcast i64* %b to i8* 19 %cmp = icmp eq i8* %x, %y 20 ret i1 %cmp 21; CHECK-NEXT: ret i1 false 22} 23 24define i1 @gep() { 25; CHECK-LABEL: @gep( 26 %a = alloca [3 x i8], align 8 27 %x = getelementptr inbounds [3 x i8], [3 x i8]* %a, i32 0, i32 0 28 %cmp = icmp eq i8* %x, null 29 ret i1 %cmp 30; CHECK-NEXT: ret i1 false 31} 32 33define i1 @gep2() { 34; CHECK-LABEL: @gep2( 35 %a = alloca [3 x i8], align 8 36 %x = getelementptr inbounds [3 x i8], [3 x i8]* %a, i32 0, i32 0 37 %y = getelementptr inbounds [3 x i8], [3 x i8]* %a, i32 0, i32 0 38 %cmp = icmp eq i8* %x, %y 39 ret i1 %cmp 40; CHECK-NEXT: ret i1 true 41} 42 43; PR11238 44%gept = type { i32, i32 } 45@gepy = global %gept zeroinitializer, align 8 46@gepz = extern_weak global %gept 47 48define i1 @gep3() { 49; CHECK-LABEL: @gep3( 50 %x = alloca %gept, align 8 51 %a = getelementptr %gept, %gept* %x, i64 0, i32 0 52 %b = getelementptr %gept, %gept* %x, i64 0, i32 1 53 %equal = icmp eq i32* %a, %b 54 ret i1 %equal 55; CHECK-NEXT: ret i1 false 56} 57 58define i1 @gep4() { 59; CHECK-LABEL: @gep4( 60 %x = alloca %gept, align 8 61 %a = getelementptr %gept, %gept* @gepy, i64 0, i32 0 62 %b = getelementptr %gept, %gept* @gepy, i64 0, i32 1 63 %equal = icmp eq i32* %a, %b 64 ret i1 %equal 65; CHECK-NEXT: ret i1 false 66} 67 68@a = common global [1 x i32] zeroinitializer, align 4 69 70define i1 @PR31262() { 71; CHECK-LABEL: @PR31262( 72; CHECK-NEXT: ret i1 icmp uge (i32* getelementptr ([1 x i32], [1 x i32]* @a, i64 0, i64 undef), i32* getelementptr inbounds ([1 x i32], [1 x i32]* @a, i32 0, i32 0)) 73; 74 %idx = getelementptr inbounds [1 x i32], [1 x i32]* @a, i64 0, i64 undef 75 %cmp = icmp uge i32* %idx, getelementptr inbounds ([1 x i32], [1 x i32]* @a, i32 0, i32 0) 76 ret i1 %cmp 77} 78 79define i1 @gep5() { 80; CHECK-LABEL: @gep5( 81 %x = alloca %gept, align 8 82 %a = getelementptr inbounds %gept, %gept* %x, i64 0, i32 1 83 %b = getelementptr %gept, %gept* @gepy, i64 0, i32 0 84 %equal = icmp eq i32* %a, %b 85 ret i1 %equal 86; CHECK-NEXT: ret i1 false 87} 88 89define i1 @gep6(%gept* %x) { 90; Same as @gep3 but potentially null. 91; CHECK-LABEL: @gep6( 92 %a = getelementptr %gept, %gept* %x, i64 0, i32 0 93 %b = getelementptr %gept, %gept* %x, i64 0, i32 1 94 %equal = icmp eq i32* %a, %b 95 ret i1 %equal 96; CHECK-NEXT: ret i1 false 97} 98 99define i1 @gep7(%gept* %x) { 100; CHECK-LABEL: @gep7( 101 %a = getelementptr %gept, %gept* %x, i64 0, i32 0 102 %b = getelementptr %gept, %gept* @gepz, i64 0, i32 0 103 %equal = icmp eq i32* %a, %b 104 ret i1 %equal 105; CHECK: ret i1 %equal 106} 107 108define i1 @gep8(%gept* %x) { 109; CHECK-LABEL: @gep8( 110 %a = getelementptr %gept, %gept* %x, i32 1 111 %b = getelementptr %gept, %gept* %x, i32 -1 112 %equal = icmp ugt %gept* %a, %b 113 ret i1 %equal 114; CHECK: ret i1 %equal 115} 116 117define i1 @gep9(i8* %ptr) { 118; CHECK-LABEL: @gep9( 119; CHECK-NOT: ret 120; CHECK: ret i1 true 121 122entry: 123 %first1 = getelementptr inbounds i8, i8* %ptr, i32 0 124 %first2 = getelementptr inbounds i8, i8* %first1, i32 1 125 %first3 = getelementptr inbounds i8, i8* %first2, i32 2 126 %first4 = getelementptr inbounds i8, i8* %first3, i32 4 127 %last1 = getelementptr inbounds i8, i8* %first2, i32 48 128 %last2 = getelementptr inbounds i8, i8* %last1, i32 8 129 %last3 = getelementptr inbounds i8, i8* %last2, i32 -4 130 %last4 = getelementptr inbounds i8, i8* %last3, i32 -4 131 %first.int = ptrtoint i8* %first4 to i32 132 %last.int = ptrtoint i8* %last4 to i32 133 %cmp = icmp ne i32 %last.int, %first.int 134 ret i1 %cmp 135} 136 137define i1 @gep10(i8* %ptr) { 138; CHECK-LABEL: @gep10( 139; CHECK-NOT: ret 140; CHECK: ret i1 true 141 142entry: 143 %first1 = getelementptr inbounds i8, i8* %ptr, i32 -2 144 %first2 = getelementptr inbounds i8, i8* %first1, i32 44 145 %last1 = getelementptr inbounds i8, i8* %ptr, i32 48 146 %last2 = getelementptr inbounds i8, i8* %last1, i32 -6 147 %first.int = ptrtoint i8* %first2 to i32 148 %last.int = ptrtoint i8* %last2 to i32 149 %cmp = icmp eq i32 %last.int, %first.int 150 ret i1 %cmp 151} 152 153define i1 @gep11(i8* %ptr) { 154; CHECK-LABEL: @gep11( 155; CHECK-NOT: ret 156; CHECK: ret i1 true 157 158entry: 159 %first1 = getelementptr inbounds i8, i8* %ptr, i32 -2 160 %last1 = getelementptr inbounds i8, i8* %ptr, i32 48 161 %last2 = getelementptr inbounds i8, i8* %last1, i32 -6 162 %cmp = icmp ult i8* %first1, %last2 163 ret i1 %cmp 164} 165 166define i1 @gep12(i8* %ptr) { 167; CHECK-LABEL: @gep12( 168; CHECK-NOT: ret 169; CHECK: ret i1 %cmp 170 171entry: 172 %first1 = getelementptr inbounds i8, i8* %ptr, i32 -2 173 %last1 = getelementptr inbounds i8, i8* %ptr, i32 48 174 %last2 = getelementptr inbounds i8, i8* %last1, i32 -6 175 %cmp = icmp slt i8* %first1, %last2 176 ret i1 %cmp 177} 178 179define i1 @gep13(i8* %ptr) { 180; CHECK-LABEL: @gep13( 181; We can prove this GEP is non-null because it is inbounds. 182 %x = getelementptr inbounds i8, i8* %ptr, i32 1 183 %cmp = icmp eq i8* %x, null 184 ret i1 %cmp 185; CHECK-NEXT: ret i1 false 186} 187 188define i1 @gep14({ {}, i8 }* %ptr) { 189; CHECK-LABEL: @gep14( 190; We can't simplify this because the offset of one in the GEP actually doesn't 191; move the pointer. 192 %x = getelementptr inbounds { {}, i8 }, { {}, i8 }* %ptr, i32 0, i32 1 193 %cmp = icmp eq i8* %x, null 194 ret i1 %cmp 195; CHECK-NOT: ret i1 false 196} 197 198define i1 @gep15({ {}, [4 x {i8, i8}]}* %ptr, i32 %y) { 199; CHECK-LABEL: @gep15( 200; We can prove this GEP is non-null even though there is a user value, as we 201; would necessarily violate inbounds on one side or the other. 202 %x = getelementptr inbounds { {}, [4 x {i8, i8}]}, { {}, [4 x {i8, i8}]}* %ptr, i32 0, i32 1, i32 %y, i32 1 203 %cmp = icmp eq i8* %x, null 204 ret i1 %cmp 205; CHECK-NEXT: ret i1 false 206} 207 208define i1 @gep16(i8* %ptr, i32 %a) { 209; CHECK-LABEL: @gep16( 210; We can prove this GEP is non-null because it is inbounds and because we know 211; %b is non-zero even though we don't know its value. 212 %b = or i32 %a, 1 213 %x = getelementptr inbounds i8, i8* %ptr, i32 %b 214 %cmp = icmp eq i8* %x, null 215 ret i1 %cmp 216; CHECK-NEXT: ret i1 false 217} 218 219define i1 @gep17() { 220; CHECK-LABEL: @gep17( 221 %alloca = alloca i32, align 4 222 %bc = bitcast i32* %alloca to [4 x i8]* 223 %gep1 = getelementptr inbounds i32, i32* %alloca, i32 1 224 %pti1 = ptrtoint i32* %gep1 to i32 225 %gep2 = getelementptr inbounds [4 x i8], [4 x i8]* %bc, i32 0, i32 1 226 %pti2 = ptrtoint i8* %gep2 to i32 227 %cmp = icmp ugt i32 %pti1, %pti2 228 ret i1 %cmp 229; CHECK-NEXT: ret i1 true 230} 231 232define i1 @zext(i32 %x) { 233; CHECK-LABEL: @zext( 234 %e1 = zext i32 %x to i64 235 %e2 = zext i32 %x to i64 236 %r = icmp eq i64 %e1, %e2 237 ret i1 %r 238; CHECK: ret i1 true 239} 240 241define i1 @zext2(i1 %x) { 242; CHECK-LABEL: @zext2( 243 %e = zext i1 %x to i32 244 %c = icmp ne i32 %e, 0 245 ret i1 %c 246; CHECK: ret i1 %x 247} 248 249define i1 @zext3() { 250; CHECK-LABEL: @zext3( 251 %e = zext i1 1 to i32 252 %c = icmp ne i32 %e, 0 253 ret i1 %c 254; CHECK: ret i1 true 255} 256 257define i1 @sext(i32 %x) { 258; CHECK-LABEL: @sext( 259 %e1 = sext i32 %x to i64 260 %e2 = sext i32 %x to i64 261 %r = icmp eq i64 %e1, %e2 262 ret i1 %r 263; CHECK: ret i1 true 264} 265 266define i1 @sext2(i1 %x) { 267; CHECK-LABEL: @sext2( 268 %e = sext i1 %x to i32 269 %c = icmp ne i32 %e, 0 270 ret i1 %c 271; CHECK: ret i1 %x 272} 273 274define i1 @sext3() { 275; CHECK-LABEL: @sext3( 276 %e = sext i1 1 to i32 277 %c = icmp ne i32 %e, 0 278 ret i1 %c 279; CHECK: ret i1 true 280} 281 282define i1 @add(i32 %x, i32 %y) { 283; CHECK-LABEL: @add( 284 %l = lshr i32 %x, 1 285 %q = lshr i32 %y, 1 286 %r = or i32 %q, 1 287 %s = add i32 %l, %r 288 %c = icmp eq i32 %s, 0 289 ret i1 %c 290; CHECK: ret i1 false 291} 292 293define i1 @add2(i8 %x, i8 %y) { 294; CHECK-LABEL: @add2( 295 %l = or i8 %x, 128 296 %r = or i8 %y, 129 297 %s = add i8 %l, %r 298 %c = icmp eq i8 %s, 0 299 ret i1 %c 300; CHECK: ret i1 false 301} 302 303define i1 @add3(i8 %x, i8 %y) { 304; CHECK-LABEL: @add3( 305 %l = zext i8 %x to i32 306 %r = zext i8 %y to i32 307 %s = add i32 %l, %r 308 %c = icmp eq i32 %s, 0 309 ret i1 %c 310; CHECK: ret i1 %c 311} 312 313define i1 @add4(i32 %x, i32 %y) { 314; CHECK-LABEL: @add4( 315 %z = add nsw i32 %y, 1 316 %s1 = add nsw i32 %x, %y 317 %s2 = add nsw i32 %x, %z 318 %c = icmp slt i32 %s1, %s2 319 ret i1 %c 320; CHECK: ret i1 true 321} 322 323define i1 @add5(i32 %x, i32 %y) { 324; CHECK-LABEL: @add5( 325 %z = add nuw i32 %y, 1 326 %s1 = add nuw i32 %x, %z 327 %s2 = add nuw i32 %x, %y 328 %c = icmp ugt i32 %s1, %s2 329 ret i1 %c 330; CHECK: ret i1 true 331} 332 333define i1 @add6(i64 %A, i64 %B) { 334; CHECK-LABEL: @add6( 335 %s1 = add i64 %A, %B 336 %s2 = add i64 %B, %A 337 %cmp = icmp eq i64 %s1, %s2 338 ret i1 %cmp 339; CHECK: ret i1 true 340} 341 342define i1 @addpowtwo(i32 %x, i32 %y) { 343; CHECK-LABEL: @addpowtwo( 344 %l = lshr i32 %x, 1 345 %r = shl i32 1, %y 346 %s = add i32 %l, %r 347 %c = icmp eq i32 %s, 0 348 ret i1 %c 349; CHECK: ret i1 false 350} 351 352define i1 @or(i32 %x) { 353; CHECK-LABEL: @or( 354 %o = or i32 %x, 1 355 %c = icmp eq i32 %o, 0 356 ret i1 %c 357; CHECK: ret i1 false 358} 359 360; Do not simplify if we cannot guarantee that the ConstantExpr is a non-zero 361; constant. 362@GV = common global i32* null 363define i1 @or_constexp(i32 %x) { 364; CHECK-LABEL: @or_constexp( 365entry: 366 %0 = and i32 ptrtoint (i32** @GV to i32), 32 367 %o = or i32 %x, %0 368 %c = icmp eq i32 %o, 0 369 ret i1 %c 370; CHECK: or 371; CHECK-NEXT: icmp eq 372; CHECK-NOT: ret i1 false 373} 374 375define i1 @shl1(i32 %x) { 376; CHECK-LABEL: @shl1( 377 %s = shl i32 1, %x 378 %c = icmp eq i32 %s, 0 379 ret i1 %c 380; CHECK: ret i1 false 381} 382 383define i1 @shl3(i32 %X) { 384; CHECK: @shl3 385 %sub = shl nuw i32 4, %X 386 %cmp = icmp eq i32 %sub, 31 387 ret i1 %cmp 388; CHECK-NEXT: ret i1 false 389} 390 391define i1 @lshr1(i32 %x) { 392; CHECK-LABEL: @lshr1( 393 %s = lshr i32 -1, %x 394 %c = icmp eq i32 %s, 0 395 ret i1 %c 396; CHECK: ret i1 false 397} 398 399define i1 @lshr3(i32 %x) { 400; CHECK-LABEL: @lshr3( 401 %s = lshr i32 %x, %x 402 %c = icmp eq i32 %s, 0 403 ret i1 %c 404; CHECK: ret i1 true 405} 406 407define i1 @lshr4(i32 %X, i32 %Y) { 408; CHECK-LABEL: @lshr4( 409 %A = lshr i32 %X, %Y 410 %C = icmp ule i32 %A, %X 411 ret i1 %C 412; CHECK: ret i1 true 413} 414 415define i1 @lshr5(i32 %X, i32 %Y) { 416; CHECK-LABEL: @lshr5( 417 %A = lshr i32 %X, %Y 418 %C = icmp ugt i32 %A, %X 419 ret i1 %C 420; CHECK: ret i1 false 421} 422 423define i1 @lshr6(i32 %X, i32 %Y) { 424; CHECK-LABEL: @lshr6( 425 %A = lshr i32 %X, %Y 426 %C = icmp ult i32 %X, %A 427 ret i1 %C 428; CHECK: ret i1 false 429} 430 431define i1 @lshr7(i32 %X, i32 %Y) { 432; CHECK-LABEL: @lshr7( 433 %A = lshr i32 %X, %Y 434 %C = icmp uge i32 %X, %A 435 ret i1 %C 436; CHECK: ret i1 true 437} 438 439define i1 @ashr1(i32 %x) { 440; CHECK-LABEL: @ashr1( 441 %s = ashr i32 -1, %x 442 %c = icmp eq i32 %s, 0 443 ret i1 %c 444; CHECK: ret i1 false 445} 446 447define i1 @ashr3(i32 %x) { 448; CHECK-LABEL: @ashr3( 449 %s = ashr i32 %x, %x 450 %c = icmp eq i32 %s, 0 451 ret i1 %c 452; CHECK: ret i1 true 453} 454 455define i1 @select1(i1 %cond) { 456; CHECK-LABEL: @select1( 457 %s = select i1 %cond, i32 1, i32 0 458 %c = icmp eq i32 %s, 1 459 ret i1 %c 460; CHECK: ret i1 %cond 461} 462 463define i1 @select2(i1 %cond) { 464; CHECK-LABEL: @select2( 465 %x = zext i1 %cond to i32 466 %s = select i1 %cond, i32 %x, i32 0 467 %c = icmp ne i32 %s, 0 468 ret i1 %c 469; CHECK: ret i1 %cond 470} 471 472define i1 @select3(i1 %cond) { 473; CHECK-LABEL: @select3( 474 %x = zext i1 %cond to i32 475 %s = select i1 %cond, i32 1, i32 %x 476 %c = icmp ne i32 %s, 0 477 ret i1 %c 478; CHECK: ret i1 %cond 479} 480 481define i1 @select4(i1 %cond) { 482; CHECK-LABEL: @select4( 483 %invert = xor i1 %cond, 1 484 %s = select i1 %invert, i32 0, i32 1 485 %c = icmp ne i32 %s, 0 486 ret i1 %c 487; CHECK: ret i1 %cond 488} 489 490define i1 @select5(i32 %x) { 491; CHECK-LABEL: @select5( 492 %c = icmp eq i32 %x, 0 493 %s = select i1 %c, i32 1, i32 %x 494 %c2 = icmp eq i32 %s, 0 495 ret i1 %c2 496; CHECK: ret i1 false 497} 498 499define i1 @select6(i32 %x) { 500; CHECK-LABEL: @select6( 501 %c = icmp sgt i32 %x, 0 502 %s = select i1 %c, i32 %x, i32 4 503 %c2 = icmp eq i32 %s, 0 504 ret i1 %c2 505; CHECK: ret i1 %c2 506} 507 508define i1 @urem1(i32 %X, i32 %Y) { 509; CHECK-LABEL: @urem1( 510 %A = urem i32 %X, %Y 511 %B = icmp ult i32 %A, %Y 512 ret i1 %B 513; CHECK: ret i1 true 514} 515 516define i1 @urem2(i32 %X, i32 %Y) { 517; CHECK-LABEL: @urem2( 518 %A = urem i32 %X, %Y 519 %B = icmp eq i32 %A, %Y 520 ret i1 %B 521; CHECK: ret i1 false 522} 523 524define i1 @urem4(i32 %X) { 525; CHECK-LABEL: @urem4( 526 %A = urem i32 %X, 15 527 %B = icmp ult i32 %A, 10 528 ret i1 %B 529; CHECK: ret i1 %B 530} 531 532define i1 @urem5(i16 %X, i32 %Y) { 533; CHECK-LABEL: @urem5( 534 %A = zext i16 %X to i32 535 %B = urem i32 %A, %Y 536 %C = icmp slt i32 %B, %Y 537 ret i1 %C 538; CHECK-NOT: ret i1 true 539} 540 541define i1 @urem6(i32 %X, i32 %Y) { 542; CHECK-LABEL: @urem6( 543 %A = urem i32 %X, %Y 544 %B = icmp ugt i32 %Y, %A 545 ret i1 %B 546; CHECK: ret i1 true 547} 548 549define i1 @urem7(i32 %X) { 550; CHECK-LABEL: @urem7( 551 %A = urem i32 1, %X 552 %B = icmp sgt i32 %A, %X 553 ret i1 %B 554; CHECK-NOT: ret i1 false 555} 556 557; PR9343 #15 558; CHECK-LABEL: @srem2( 559; CHECK: ret i1 false 560define i1 @srem2(i16 %X, i32 %Y) { 561 %A = zext i16 %X to i32 562 %B = add nsw i32 %A, 1 563 %C = srem i32 %B, %Y 564 %D = icmp slt i32 %C, 0 565 ret i1 %D 566} 567 568; CHECK-LABEL: @srem3( 569; CHECK-NEXT: ret i1 false 570define i1 @srem3(i16 %X, i32 %Y) { 571 %A = zext i16 %X to i32 572 %B = or i32 2147483648, %A 573 %C = sub nsw i32 1, %B 574 %D = srem i32 %C, %Y 575 %E = icmp slt i32 %D, 0 576 ret i1 %E 577} 578 579define i1 @udiv2(i32 %X, i32 %Y, i32 %Z) { 580; CHECK-LABEL: @udiv2( 581 %A = udiv exact i32 10, %Z 582 %B = udiv exact i32 20, %Z 583 %C = icmp ult i32 %A, %B 584 ret i1 %C 585; CHECK: ret i1 true 586} 587 588define i1 @udiv3(i32 %X, i32 %Y) { 589; CHECK-LABEL: @udiv3( 590 %A = udiv i32 %X, %Y 591 %C = icmp ugt i32 %A, %X 592 ret i1 %C 593; CHECK: ret i1 false 594} 595 596define i1 @udiv4(i32 %X, i32 %Y) { 597; CHECK-LABEL: @udiv4( 598 %A = udiv i32 %X, %Y 599 %C = icmp ule i32 %A, %X 600 ret i1 %C 601; CHECK: ret i1 true 602} 603 604; PR11340 605define i1 @udiv6(i32 %X) nounwind { 606; CHECK-LABEL: @udiv6( 607 %A = udiv i32 1, %X 608 %C = icmp eq i32 %A, 0 609 ret i1 %C 610; CHECK: ret i1 %C 611} 612 613define i1 @udiv7(i32 %X, i32 %Y) { 614; CHECK-LABEL: @udiv7( 615 %A = udiv i32 %X, %Y 616 %C = icmp ult i32 %X, %A 617 ret i1 %C 618; CHECK: ret i1 false 619} 620 621define i1 @udiv8(i32 %X, i32 %Y) { 622; CHECK-LABEL: @udiv8( 623 %A = udiv i32 %X, %Y 624 %C = icmp uge i32 %X, %A 625 ret i1 %C 626; CHECK: ret i1 true 627} 628 629define i1 @mul1(i32 %X) { 630; CHECK-LABEL: @mul1( 631; Square of a non-zero number is non-zero if there is no overflow. 632 %Y = or i32 %X, 1 633 %M = mul nuw i32 %Y, %Y 634 %C = icmp eq i32 %M, 0 635 ret i1 %C 636; CHECK: ret i1 false 637} 638 639define i1 @mul2(i32 %X) { 640; CHECK-LABEL: @mul2( 641; Square of a non-zero number is positive if there is no signed overflow. 642 %Y = or i32 %X, 1 643 %M = mul nsw i32 %Y, %Y 644 %C = icmp sgt i32 %M, 0 645 ret i1 %C 646; CHECK: ret i1 true 647} 648 649define i1 @mul3(i32 %X, i32 %Y) { 650; CHECK-LABEL: @mul3( 651; Product of non-negative numbers is non-negative if there is no signed overflow. 652 %XX = mul nsw i32 %X, %X 653 %YY = mul nsw i32 %Y, %Y 654 %M = mul nsw i32 %XX, %YY 655 %C = icmp sge i32 %M, 0 656 ret i1 %C 657; CHECK: ret i1 true 658} 659 660define <2 x i1> @vectorselect1(<2 x i1> %cond) { 661; CHECK-LABEL: @vectorselect1( 662 %invert = xor <2 x i1> %cond, <i1 1, i1 1> 663 %s = select <2 x i1> %invert, <2 x i32> <i32 0, i32 0>, <2 x i32> <i32 1, i32 1> 664 %c = icmp ne <2 x i32> %s, <i32 0, i32 0> 665 ret <2 x i1> %c 666; CHECK: ret <2 x i1> %cond 667} 668 669; PR11948 670define <2 x i1> @vectorselectcrash(i32 %arg1) { 671 %tobool40 = icmp ne i32 %arg1, 0 672 %cond43 = select i1 %tobool40, <2 x i16> <i16 -5, i16 66>, <2 x i16> <i16 46, i16 1> 673 %cmp45 = icmp ugt <2 x i16> %cond43, <i16 73, i16 21> 674 ret <2 x i1> %cmp45 675} 676 677; PR12013 678define i1 @alloca_compare(i64 %idx) { 679 %sv = alloca { i32, i32, [124 x i32] } 680 %1 = getelementptr inbounds { i32, i32, [124 x i32] }, { i32, i32, [124 x i32] }* %sv, i32 0, i32 2, i64 %idx 681 %2 = icmp eq i32* %1, null 682 ret i1 %2 683 ; CHECK: alloca_compare 684 ; CHECK: ret i1 false 685} 686 687; PR12075 688define i1 @infinite_gep() { 689 ret i1 1 690 691unreachableblock: 692 %X = getelementptr i32, i32 *%X, i32 1 693 %Y = icmp eq i32* %X, null 694 ret i1 %Y 695} 696 697; It's not valid to fold a comparison of an argument with an alloca, even though 698; that's tempting. An argument can't *alias* an alloca, however the aliasing rule 699; relies on restrictions against guessing an object's address and dereferencing. 700; There are no restrictions against guessing an object's address and comparing. 701 702define i1 @alloca_argument_compare(i64* %arg) { 703 %alloc = alloca i64 704 %cmp = icmp eq i64* %arg, %alloc 705 ret i1 %cmp 706 ; CHECK: alloca_argument_compare 707 ; CHECK: ret i1 %cmp 708} 709 710; As above, but with the operands reversed. 711 712define i1 @alloca_argument_compare_swapped(i64* %arg) { 713 %alloc = alloca i64 714 %cmp = icmp eq i64* %alloc, %arg 715 ret i1 %cmp 716 ; CHECK: alloca_argument_compare_swapped 717 ; CHECK: ret i1 %cmp 718} 719 720; Don't assume that a noalias argument isn't equal to a global variable's 721; address. This is an example where AliasAnalysis' NoAlias concept is 722; different from actual pointer inequality. 723 724@y = external global i32 725define zeroext i1 @external_compare(i32* noalias %x) { 726 %cmp = icmp eq i32* %x, @y 727 ret i1 %cmp 728 ; CHECK: external_compare 729 ; CHECK: ret i1 %cmp 730} 731 732define i1 @alloca_gep(i64 %a, i64 %b) { 733; CHECK-LABEL: @alloca_gep( 734; We can prove this GEP is non-null because it is inbounds and the pointer 735; is non-null. 736 %strs = alloca [1000 x [1001 x i8]], align 16 737 %x = getelementptr inbounds [1000 x [1001 x i8]], [1000 x [1001 x i8]]* %strs, i64 0, i64 %a, i64 %b 738 %cmp = icmp eq i8* %x, null 739 ret i1 %cmp 740; CHECK-NEXT: ret i1 false 741} 742 743define i1 @non_inbounds_gep_compare(i64* %a) { 744; CHECK-LABEL: @non_inbounds_gep_compare( 745; Equality compares with non-inbounds GEPs can be folded. 746 %x = getelementptr i64, i64* %a, i64 42 747 %y = getelementptr inbounds i64, i64* %x, i64 -42 748 %z = getelementptr i64, i64* %a, i64 -42 749 %w = getelementptr inbounds i64, i64* %z, i64 42 750 %cmp = icmp eq i64* %y, %w 751 ret i1 %cmp 752; CHECK-NEXT: ret i1 true 753} 754 755define i1 @non_inbounds_gep_compare2(i64* %a) { 756; CHECK-LABEL: @non_inbounds_gep_compare2( 757; Equality compares with non-inbounds GEPs can be folded. 758 %x = getelementptr i64, i64* %a, i64 4294967297 759 %y = getelementptr i64, i64* %a, i64 1 760 %cmp = icmp eq i64* %y, %y 761 ret i1 %cmp 762; CHECK-NEXT: ret i1 true 763} 764 765define <4 x i8> @vectorselectfold(<4 x i8> %a, <4 x i8> %b) { 766 %false = icmp ne <4 x i8> zeroinitializer, zeroinitializer 767 %sel = select <4 x i1> %false, <4 x i8> %a, <4 x i8> %b 768 ret <4 x i8> %sel 769 770; CHECK-LABEL: @vectorselectfold 771; CHECK-NEXT: ret <4 x i8> %b 772} 773 774define <4 x i8> @vectorselectfold2(<4 x i8> %a, <4 x i8> %b) { 775 %true = icmp eq <4 x i8> zeroinitializer, zeroinitializer 776 %sel = select <4 x i1> %true, <4 x i8> %a, <4 x i8> %b 777 ret <4 x i8> %sel 778 779; CHECK-LABEL: @vectorselectfold 780; CHECK-NEXT: ret <4 x i8> %a 781} 782 783define i1 @compare_always_true_slt(i16 %a) { 784 %1 = zext i16 %a to i32 785 %2 = sub nsw i32 0, %1 786 %3 = icmp slt i32 %2, 1 787 ret i1 %3 788 789; CHECK-LABEL: @compare_always_true_slt 790; CHECK-NEXT: ret i1 true 791} 792 793define i1 @compare_always_true_sle(i16 %a) { 794 %1 = zext i16 %a to i32 795 %2 = sub nsw i32 0, %1 796 %3 = icmp sle i32 %2, 0 797 ret i1 %3 798 799; CHECK-LABEL: @compare_always_true_sle 800; CHECK-NEXT: ret i1 true 801} 802 803define i1 @compare_always_false_sgt(i16 %a) { 804 %1 = zext i16 %a to i32 805 %2 = sub nsw i32 0, %1 806 %3 = icmp sgt i32 %2, 0 807 ret i1 %3 808 809; CHECK-LABEL: @compare_always_false_sgt 810; CHECK-NEXT: ret i1 false 811} 812 813define i1 @compare_always_false_sge(i16 %a) { 814 %1 = zext i16 %a to i32 815 %2 = sub nsw i32 0, %1 816 %3 = icmp sge i32 %2, 1 817 ret i1 %3 818 819; CHECK-LABEL: @compare_always_false_sge 820; CHECK-NEXT: ret i1 false 821} 822 823define i1 @compare_always_false_eq(i16 %a) { 824 %1 = zext i16 %a to i32 825 %2 = sub nsw i32 0, %1 826 %3 = icmp eq i32 %2, 1 827 ret i1 %3 828 829; CHECK-LABEL: @compare_always_false_eq 830; CHECK-NEXT: ret i1 false 831} 832 833define i1 @compare_always_false_ne(i16 %a) { 834 %1 = zext i16 %a to i32 835 %2 = sub nsw i32 0, %1 836 %3 = icmp ne i32 %2, 1 837 ret i1 %3 838 839; CHECK-LABEL: @compare_always_false_ne 840; CHECK-NEXT: ret i1 true 841} 842 843define i1 @lshr_ugt_false(i32 %a) { 844 %shr = lshr i32 1, %a 845 %cmp = icmp ugt i32 %shr, 1 846 ret i1 %cmp 847; CHECK-LABEL: @lshr_ugt_false 848; CHECK-NEXT: ret i1 false 849} 850 851define i1 @nonnull_arg(i32* nonnull %i) { 852 %cmp = icmp eq i32* %i, null 853 ret i1 %cmp 854; CHECK-LABEL: @nonnull_arg 855; CHECK: ret i1 false 856} 857 858define i1 @nonnull_deref_arg(i32* dereferenceable(4) %i) { 859 %cmp = icmp eq i32* %i, null 860 ret i1 %cmp 861; CHECK-LABEL: @nonnull_deref_arg 862; CHECK: ret i1 false 863} 864 865define i1 @nonnull_deref_as_arg(i32 addrspace(1)* dereferenceable(4) %i) { 866 %cmp = icmp eq i32 addrspace(1)* %i, null 867 ret i1 %cmp 868; CHECK-LABEL: @nonnull_deref_as_arg 869; CHECK: icmp 870; CHECK: ret 871} 872 873declare nonnull i32* @returns_nonnull_helper() 874define i1 @returns_nonnull() { 875 %call = call nonnull i32* @returns_nonnull_helper() 876 %cmp = icmp eq i32* %call, null 877 ret i1 %cmp 878; CHECK-LABEL: @returns_nonnull 879; CHECK: ret i1 false 880} 881 882declare dereferenceable(4) i32* @returns_nonnull_deref_helper() 883define i1 @returns_nonnull_deref() { 884 %call = call dereferenceable(4) i32* @returns_nonnull_deref_helper() 885 %cmp = icmp eq i32* %call, null 886 ret i1 %cmp 887; CHECK-LABEL: @returns_nonnull_deref 888; CHECK: ret i1 false 889} 890 891declare dereferenceable(4) i32 addrspace(1)* @returns_nonnull_deref_as_helper() 892define i1 @returns_nonnull_as_deref() { 893 %call = call dereferenceable(4) i32 addrspace(1)* @returns_nonnull_deref_as_helper() 894 %cmp = icmp eq i32 addrspace(1)* %call, null 895 ret i1 %cmp 896; CHECK-LABEL: @returns_nonnull_as_deref 897; CHECK: icmp 898; CHECK: ret 899} 900 901define i1 @nonnull_load(i32** %addr) { 902 %ptr = load i32*, i32** %addr, !nonnull !{} 903 %cmp = icmp eq i32* %ptr, null 904 ret i1 %cmp 905; CHECK-LABEL: @nonnull_load 906; CHECK: ret i1 false 907} 908 909define i1 @nonnull_load_as_outer(i32* addrspace(1)* %addr) { 910 %ptr = load i32*, i32* addrspace(1)* %addr, !nonnull !{} 911 %cmp = icmp eq i32* %ptr, null 912 ret i1 %cmp 913; CHECK-LABEL: @nonnull_load_as_outer 914; CHECK: ret i1 false 915} 916define i1 @nonnull_load_as_inner(i32 addrspace(1)** %addr) { 917 %ptr = load i32 addrspace(1)*, i32 addrspace(1)** %addr, !nonnull !{} 918 %cmp = icmp eq i32 addrspace(1)* %ptr, null 919 ret i1 %cmp 920; CHECK-LABEL: @nonnull_load_as_inner 921; CHECK: ret i1 false 922} 923 924; If a bit is known to be zero for A and known to be one for B, 925; then A and B cannot be equal. 926define i1 @icmp_eq_const(i32 %a) { 927; CHECK-LABEL: @icmp_eq_const( 928; CHECK-NEXT: ret i1 false 929; 930 %b = mul nsw i32 %a, -2 931 %c = icmp eq i32 %b, 1 932 ret i1 %c 933} 934 935define <2 x i1> @icmp_eq_const_vec(<2 x i32> %a) { 936; CHECK-LABEL: @icmp_eq_const_vec( 937; CHECK-NEXT: ret <2 x i1> zeroinitializer 938; 939 %b = mul nsw <2 x i32> %a, <i32 -2, i32 -2> 940 %c = icmp eq <2 x i32> %b, <i32 1, i32 1> 941 ret <2 x i1> %c 942} 943 944define i1 @icmp_ne_const(i32 %a) { 945; CHECK-LABEL: @icmp_ne_const( 946; CHECK-NEXT: ret i1 true 947; 948 %b = mul nsw i32 %a, -2 949 %c = icmp ne i32 %b, 1 950 ret i1 %c 951} 952 953define <2 x i1> @icmp_ne_const_vec(<2 x i32> %a) { 954; CHECK-LABEL: @icmp_ne_const_vec( 955; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true> 956; 957 %b = mul nsw <2 x i32> %a, <i32 -2, i32 -2> 958 %c = icmp ne <2 x i32> %b, <i32 1, i32 1> 959 ret <2 x i1> %c 960} 961 962define i1 @icmp_sdiv_int_min(i32 %a) { 963 %div = sdiv i32 -2147483648, %a 964 %cmp = icmp ne i32 %div, -1073741824 965 ret i1 %cmp 966 967; CHECK-LABEL: @icmp_sdiv_int_min 968; CHECK-NEXT: [[DIV:%.*]] = sdiv i32 -2147483648, %a 969; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[DIV]], -1073741824 970; CHECK-NEXT: ret i1 [[CMP]] 971} 972 973define i1 @icmp_sdiv_pr20288(i64 %a) { 974 %div = sdiv i64 %a, -8589934592 975 %cmp = icmp ne i64 %div, 1073741824 976 ret i1 %cmp 977 978; CHECK-LABEL: @icmp_sdiv_pr20288 979; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 %a, -8589934592 980; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[DIV]], 1073741824 981; CHECK-NEXT: ret i1 [[CMP]] 982} 983 984define i1 @icmp_sdiv_neg1(i64 %a) { 985 %div = sdiv i64 %a, -1 986 %cmp = icmp ne i64 %div, 1073741824 987 ret i1 %cmp 988 989; CHECK-LABEL: @icmp_sdiv_neg1 990; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 %a, -1 991; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[DIV]], 1073741824 992; CHECK-NEXT: ret i1 [[CMP]] 993} 994 995define i1 @icmp_known_bits(i4 %x, i4 %y) { 996 %and1 = and i4 %y, -7 997 %and2 = and i4 %x, -7 998 %or1 = or i4 %and1, 2 999 %or2 = or i4 %and2, 2 1000 %add = add i4 %or1, %or2 1001 %cmp = icmp eq i4 %add, 0 1002 ret i1 %cmp 1003 1004; CHECK-LABEL: @icmp_known_bits 1005; CHECK-NEXT: ret i1 false 1006} 1007 1008define i1 @icmp_shl_nuw_1(i64 %a) { 1009 %shl = shl nuw i64 1, %a 1010 %cmp = icmp ne i64 %shl, 0 1011 ret i1 %cmp 1012 1013; CHECK-LABEL: @icmp_shl_nuw_1 1014; CHECK-NEXT: ret i1 true 1015} 1016 1017define i1 @icmp_shl_1_V_ugt_2147483648(i32 %V) { 1018 %shl = shl i32 1, %V 1019 %cmp = icmp ugt i32 %shl, 2147483648 1020 ret i1 %cmp 1021 1022; CHECK-LABEL: @icmp_shl_1_V_ugt_2147483648( 1023; CHECK-NEXT: ret i1 false 1024} 1025 1026define i1 @icmp_shl_1_V_ule_2147483648(i32 %V) { 1027 %shl = shl i32 1, %V 1028 %cmp = icmp ule i32 %shl, 2147483648 1029 ret i1 %cmp 1030 1031; CHECK-LABEL: @icmp_shl_1_V_ule_2147483648( 1032; CHECK-NEXT: ret i1 true 1033} 1034 1035define i1 @icmp_shl_1_V_eq_31(i32 %V) { 1036 %shl = shl i32 1, %V 1037 %cmp = icmp eq i32 %shl, 31 1038 ret i1 %cmp 1039 1040; CHECK-LABEL: @icmp_shl_1_V_eq_31( 1041; CHECK-NEXT: ret i1 false 1042} 1043 1044define i1 @icmp_shl_1_V_ne_31(i32 %V) { 1045 %shl = shl i32 1, %V 1046 %cmp = icmp ne i32 %shl, 31 1047 ret i1 %cmp 1048 1049; CHECK-LABEL: @icmp_shl_1_V_ne_31( 1050; CHECK-NEXT: ret i1 true 1051} 1052 1053define i1 @tautological1(i32 %A, i32 %B) { 1054 %C = and i32 %A, %B 1055 %D = icmp ugt i32 %C, %A 1056 ret i1 %D 1057; CHECK-LABEL: @tautological1( 1058; CHECK: ret i1 false 1059} 1060 1061define i1 @tautological2(i32 %A, i32 %B) { 1062 %C = and i32 %A, %B 1063 %D = icmp ule i32 %C, %A 1064 ret i1 %D 1065; CHECK-LABEL: @tautological2( 1066; CHECK: ret i1 true 1067} 1068 1069define i1 @tautological3(i32 %A, i32 %B) { 1070 %C = or i32 %A, %B 1071 %D = icmp ule i32 %A, %C 1072 ret i1 %D 1073; CHECK-LABEL: @tautological3( 1074; CHECK: ret i1 true 1075} 1076 1077define i1 @tautological4(i32 %A, i32 %B) { 1078 %C = or i32 %A, %B 1079 %D = icmp ugt i32 %A, %C 1080 ret i1 %D 1081; CHECK-LABEL: @tautological4( 1082; CHECK: ret i1 false 1083} 1084 1085define i1 @tautological5(i32 %A, i32 %B) { 1086 %C = or i32 %A, %B 1087 %D = icmp ult i32 %C, %A 1088 ret i1 %D 1089; CHECK-LABEL: @tautological5( 1090; CHECK: ret i1 false 1091} 1092 1093define i1 @tautological6(i32 %A, i32 %B) { 1094 %C = or i32 %A, %B 1095 %D = icmp uge i32 %C, %A 1096 ret i1 %D 1097; CHECK-LABEL: @tautological6( 1098; CHECK: ret i1 true 1099} 1100 1101define i1 @tautological7(i32 %A, i32 %B) { 1102 %C = and i32 %A, %B 1103 %D = icmp uge i32 %A, %C 1104 ret i1 %D 1105; CHECK-LABEL: @tautological7( 1106; CHECK: ret i1 true 1107} 1108 1109define i1 @tautological8(i32 %A, i32 %B) { 1110 %C = and i32 %A, %B 1111 %D = icmp ult i32 %A, %C 1112 ret i1 %D 1113; CHECK-LABEL: @tautological8( 1114; CHECK: ret i1 false 1115} 1116 1117declare void @helper_i1(i1) 1118; Series of tests for icmp s[lt|ge] (or A, B), A and icmp s[gt|le] A, (or A, B) 1119define void @icmp_slt_sge_or(i32 %Ax, i32 %Bx) { 1120; 'p' for positive, 'n' for negative, 'x' for potentially either. 1121; %D is 'icmp slt (or A, B), A' 1122; %E is 'icmp sge (or A, B), A' making it the not of %D 1123; %F is 'icmp sgt A, (or A, B)' making it the same as %D 1124; %G is 'icmp sle A, (or A, B)' making it the not of %D 1125 %Aneg = or i32 %Ax, 2147483648 1126 %Apos = and i32 %Ax, 2147483647 1127 %Bneg = or i32 %Bx, 2147483648 1128 %Bpos = and i32 %Bx, 2147483647 1129 1130 %Cpp = or i32 %Apos, %Bpos 1131 %Dpp = icmp slt i32 %Cpp, %Apos 1132 %Epp = icmp sge i32 %Cpp, %Apos 1133 %Fpp = icmp sgt i32 %Apos, %Cpp 1134 %Gpp = icmp sle i32 %Apos, %Cpp 1135 %Cpx = or i32 %Apos, %Bx 1136 %Dpx = icmp slt i32 %Cpx, %Apos 1137 %Epx = icmp sge i32 %Cpx, %Apos 1138 %Fpx = icmp sgt i32 %Apos, %Cpx 1139 %Gpx = icmp sle i32 %Apos, %Cpx 1140 %Cpn = or i32 %Apos, %Bneg 1141 %Dpn = icmp slt i32 %Cpn, %Apos 1142 %Epn = icmp sge i32 %Cpn, %Apos 1143 %Fpn = icmp sgt i32 %Apos, %Cpn 1144 %Gpn = icmp sle i32 %Apos, %Cpn 1145 1146 %Cxp = or i32 %Ax, %Bpos 1147 %Dxp = icmp slt i32 %Cxp, %Ax 1148 %Exp = icmp sge i32 %Cxp, %Ax 1149 %Fxp = icmp sgt i32 %Ax, %Cxp 1150 %Gxp = icmp sle i32 %Ax, %Cxp 1151 %Cxx = or i32 %Ax, %Bx 1152 %Dxx = icmp slt i32 %Cxx, %Ax 1153 %Exx = icmp sge i32 %Cxx, %Ax 1154 %Fxx = icmp sgt i32 %Ax, %Cxx 1155 %Gxx = icmp sle i32 %Ax, %Cxx 1156 %Cxn = or i32 %Ax, %Bneg 1157 %Dxn = icmp slt i32 %Cxn, %Ax 1158 %Exn = icmp sge i32 %Cxn, %Ax 1159 %Fxn = icmp sgt i32 %Ax, %Cxn 1160 %Gxn = icmp sle i32 %Ax, %Cxn 1161 1162 %Cnp = or i32 %Aneg, %Bpos 1163 %Dnp = icmp slt i32 %Cnp, %Aneg 1164 %Enp = icmp sge i32 %Cnp, %Aneg 1165 %Fnp = icmp sgt i32 %Aneg, %Cnp 1166 %Gnp = icmp sle i32 %Aneg, %Cnp 1167 %Cnx = or i32 %Aneg, %Bx 1168 %Dnx = icmp slt i32 %Cnx, %Aneg 1169 %Enx = icmp sge i32 %Cnx, %Aneg 1170 %Fnx = icmp sgt i32 %Aneg, %Cnx 1171 %Gnx = icmp sle i32 %Aneg, %Cnx 1172 %Cnn = or i32 %Aneg, %Bneg 1173 %Dnn = icmp slt i32 %Cnn, %Aneg 1174 %Enn = icmp sge i32 %Cnn, %Aneg 1175 %Fnn = icmp sgt i32 %Aneg, %Cnn 1176 %Gnn = icmp sle i32 %Aneg, %Cnn 1177 1178 call void @helper_i1(i1 %Dpp) 1179 call void @helper_i1(i1 %Epp) 1180 call void @helper_i1(i1 %Fpp) 1181 call void @helper_i1(i1 %Gpp) 1182 call void @helper_i1(i1 %Dpx) 1183 call void @helper_i1(i1 %Epx) 1184 call void @helper_i1(i1 %Fpx) 1185 call void @helper_i1(i1 %Gpx) 1186 call void @helper_i1(i1 %Dpn) 1187 call void @helper_i1(i1 %Epn) 1188 call void @helper_i1(i1 %Fpn) 1189 call void @helper_i1(i1 %Gpn) 1190 call void @helper_i1(i1 %Dxp) 1191 call void @helper_i1(i1 %Exp) 1192 call void @helper_i1(i1 %Fxp) 1193 call void @helper_i1(i1 %Gxp) 1194 call void @helper_i1(i1 %Dxx) 1195 call void @helper_i1(i1 %Exx) 1196 call void @helper_i1(i1 %Fxx) 1197 call void @helper_i1(i1 %Gxx) 1198 call void @helper_i1(i1 %Dxn) 1199 call void @helper_i1(i1 %Exn) 1200 call void @helper_i1(i1 %Fxn) 1201 call void @helper_i1(i1 %Gxn) 1202 call void @helper_i1(i1 %Dnp) 1203 call void @helper_i1(i1 %Enp) 1204 call void @helper_i1(i1 %Fnp) 1205 call void @helper_i1(i1 %Gnp) 1206 call void @helper_i1(i1 %Dnx) 1207 call void @helper_i1(i1 %Enx) 1208 call void @helper_i1(i1 %Fnx) 1209 call void @helper_i1(i1 %Gnx) 1210 call void @helper_i1(i1 %Dnn) 1211 call void @helper_i1(i1 %Enn) 1212 call void @helper_i1(i1 %Fnn) 1213 call void @helper_i1(i1 %Gnn) 1214; CHECK-LABEL: @icmp_slt_sge_or 1215; CHECK: call void @helper_i1(i1 false) 1216; CHECK: call void @helper_i1(i1 true) 1217; CHECK: call void @helper_i1(i1 false) 1218; CHECK: call void @helper_i1(i1 true) 1219; CHECK: call void @helper_i1(i1 %Dpx) 1220; CHECK: call void @helper_i1(i1 %Epx) 1221; CHECK: call void @helper_i1(i1 %Fpx) 1222; CHECK: call void @helper_i1(i1 %Gpx) 1223; CHECK: call void @helper_i1(i1 true) 1224; CHECK: call void @helper_i1(i1 false) 1225; CHECK: call void @helper_i1(i1 true) 1226; CHECK: call void @helper_i1(i1 false) 1227; CHECK: call void @helper_i1(i1 false) 1228; CHECK: call void @helper_i1(i1 true) 1229; CHECK: call void @helper_i1(i1 false) 1230; CHECK: call void @helper_i1(i1 true) 1231; CHECK: call void @helper_i1(i1 %Dxx) 1232; CHECK: call void @helper_i1(i1 %Exx) 1233; CHECK: call void @helper_i1(i1 %Fxx) 1234; CHECK: call void @helper_i1(i1 %Gxx) 1235; CHECK: call void @helper_i1(i1 %Dxn) 1236; CHECK: call void @helper_i1(i1 %Exn) 1237; CHECK: call void @helper_i1(i1 %Fxn) 1238; CHECK: call void @helper_i1(i1 %Gxn) 1239; CHECK: call void @helper_i1(i1 false) 1240; CHECK: call void @helper_i1(i1 true) 1241; CHECK: call void @helper_i1(i1 false) 1242; CHECK: call void @helper_i1(i1 true) 1243; CHECK: call void @helper_i1(i1 false) 1244; CHECK: call void @helper_i1(i1 true) 1245; CHECK: call void @helper_i1(i1 false) 1246; CHECK: call void @helper_i1(i1 true) 1247; CHECK: call void @helper_i1(i1 false) 1248; CHECK: call void @helper_i1(i1 true) 1249; CHECK: call void @helper_i1(i1 false) 1250; CHECK: call void @helper_i1(i1 true) 1251 ret void 1252} 1253