1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=armv7a < %s | FileCheck %s --check-prefix=ARM 3; RUN: llc -mtriple=armv6m < %s | FileCheck %s --check-prefix=THUMB 4; RUN: llc -mtriple=armv7m < %s | FileCheck %s --check-prefix=THUMB2 5 6define i1 @cmp_ne_zero_and_rr(i32 %a, i32 %b) { 7; ARM-LABEL: cmp_ne_zero_and_rr: 8; ARM: @ %bb.0: 9; ARM-NEXT: ands r0, r0, r1 10; ARM-NEXT: movwne r0, #1 11; ARM-NEXT: bx lr 12; 13; THUMB-LABEL: cmp_ne_zero_and_rr: 14; THUMB: @ %bb.0: 15; THUMB-NEXT: ands r0, r1 16; THUMB-NEXT: subs r1, r0, #1 17; THUMB-NEXT: sbcs r0, r1 18; THUMB-NEXT: bx lr 19; 20; THUMB2-LABEL: cmp_ne_zero_and_rr: 21; THUMB2: @ %bb.0: 22; THUMB2-NEXT: ands r0, r1 23; THUMB2-NEXT: it ne 24; THUMB2-NEXT: movne r0, #1 25; THUMB2-NEXT: bx lr 26 %and = and i32 %a, %b 27 %res = icmp ne i32 %and, 0 28 ret i1 %res 29} 30 31define i1 @cmp_ne_zero_and_ri(i32 %a) { 32; ARM-LABEL: cmp_ne_zero_and_ri: 33; ARM: @ %bb.0: 34; ARM-NEXT: ands r0, r0, #42 35; ARM-NEXT: movwne r0, #1 36; ARM-NEXT: bx lr 37; 38; THUMB-LABEL: cmp_ne_zero_and_ri: 39; THUMB: @ %bb.0: 40; THUMB-NEXT: movs r1, #42 41; THUMB-NEXT: ands r0, r1 42; THUMB-NEXT: subs r1, r0, #1 43; THUMB-NEXT: sbcs r0, r1 44; THUMB-NEXT: bx lr 45; 46; THUMB2-LABEL: cmp_ne_zero_and_ri: 47; THUMB2: @ %bb.0: 48; THUMB2-NEXT: ands r0, r0, #42 49; THUMB2-NEXT: it ne 50; THUMB2-NEXT: movne r0, #1 51; THUMB2-NEXT: bx lr 52 %and = and i32 %a, 42 53 %res = icmp ne i32 %and, 0 54 ret i1 %res 55} 56 57define i1 @cmp_ne_zero_and_rsr(i32 %a, i32 %b, i32 %c) { 58; ARM-LABEL: cmp_ne_zero_and_rsr: 59; ARM: @ %bb.0: 60; ARM-NEXT: ands r0, r0, r1, lsl r2 61; ARM-NEXT: movwne r0, #1 62; ARM-NEXT: bx lr 63; 64; THUMB-LABEL: cmp_ne_zero_and_rsr: 65; THUMB: @ %bb.0: 66; THUMB-NEXT: lsls r1, r2 67; THUMB-NEXT: ands r0, r1 68; THUMB-NEXT: subs r1, r0, #1 69; THUMB-NEXT: sbcs r0, r1 70; THUMB-NEXT: bx lr 71; 72; THUMB2-LABEL: cmp_ne_zero_and_rsr: 73; THUMB2: @ %bb.0: 74; THUMB2-NEXT: lsls r1, r2 75; THUMB2-NEXT: ands r0, r1 76; THUMB2-NEXT: it ne 77; THUMB2-NEXT: movne r0, #1 78; THUMB2-NEXT: bx lr 79 %sh = shl i32 %b, %c 80 %and = and i32 %sh, %a 81 %res = icmp ne i32 %and, 0 82 ret i1 %res 83} 84 85define i1 @cmp_ne_zero_and_rsi(i32 %a, i32 %b) { 86; ARM-LABEL: cmp_ne_zero_and_rsi: 87; ARM: @ %bb.0: 88; ARM-NEXT: ands r0, r0, r1, lsr #17 89; ARM-NEXT: movwne r0, #1 90; ARM-NEXT: bx lr 91; 92; THUMB-LABEL: cmp_ne_zero_and_rsi: 93; THUMB: @ %bb.0: 94; THUMB-NEXT: lsrs r1, r1, #17 95; THUMB-NEXT: ands r0, r1 96; THUMB-NEXT: subs r1, r0, #1 97; THUMB-NEXT: sbcs r0, r1 98; THUMB-NEXT: bx lr 99; 100; THUMB2-LABEL: cmp_ne_zero_and_rsi: 101; THUMB2: @ %bb.0: 102; THUMB2-NEXT: ands.w r0, r0, r1, lsr #17 103; THUMB2-NEXT: it ne 104; THUMB2-NEXT: movne r0, #1 105; THUMB2-NEXT: bx lr 106 %sh = lshr i32 %b, 17 107 %and = and i32 %sh, %a 108 %res = icmp ne i32 %and, 0 109 ret i1 %res 110} 111 112define i1 @cmp_ne_zero_or_rr(i32 %a, i32 %b) { 113; ARM-LABEL: cmp_ne_zero_or_rr: 114; ARM: @ %bb.0: 115; ARM-NEXT: orrs r0, r0, r1 116; ARM-NEXT: movwne r0, #1 117; ARM-NEXT: bx lr 118; 119; THUMB-LABEL: cmp_ne_zero_or_rr: 120; THUMB: @ %bb.0: 121; THUMB-NEXT: orrs r0, r1 122; THUMB-NEXT: subs r1, r0, #1 123; THUMB-NEXT: sbcs r0, r1 124; THUMB-NEXT: bx lr 125; 126; THUMB2-LABEL: cmp_ne_zero_or_rr: 127; THUMB2: @ %bb.0: 128; THUMB2-NEXT: orrs r0, r1 129; THUMB2-NEXT: it ne 130; THUMB2-NEXT: movne r0, #1 131; THUMB2-NEXT: bx lr 132 %or = or i32 %a, %b 133 %res = icmp ne i32 %or, 0 134 ret i1 %res 135} 136 137define i1 @cmp_ne_zero_or_ri(i32 %a) { 138; ARM-LABEL: cmp_ne_zero_or_ri: 139; ARM: @ %bb.0: 140; ARM-NEXT: orrs r0, r0, #42 141; ARM-NEXT: movwne r0, #1 142; ARM-NEXT: bx lr 143; 144; THUMB-LABEL: cmp_ne_zero_or_ri: 145; THUMB: @ %bb.0: 146; THUMB-NEXT: movs r1, #42 147; THUMB-NEXT: orrs r0, r1 148; THUMB-NEXT: subs r1, r0, #1 149; THUMB-NEXT: sbcs r0, r1 150; THUMB-NEXT: bx lr 151; 152; THUMB2-LABEL: cmp_ne_zero_or_ri: 153; THUMB2: @ %bb.0: 154; THUMB2-NEXT: orrs r0, r0, #42 155; THUMB2-NEXT: it ne 156; THUMB2-NEXT: movne r0, #1 157; THUMB2-NEXT: bx lr 158 %or = or i32 %a, 42 159 %res = icmp ne i32 %or, 0 160 ret i1 %res 161} 162 163define i1 @cmp_ne_zero_or_rsr(i32 %a, i32 %b, i32 %c) { 164; ARM-LABEL: cmp_ne_zero_or_rsr: 165; ARM: @ %bb.0: 166; ARM-NEXT: orrs r0, r0, r1, lsl r2 167; ARM-NEXT: movwne r0, #1 168; ARM-NEXT: bx lr 169; 170; THUMB-LABEL: cmp_ne_zero_or_rsr: 171; THUMB: @ %bb.0: 172; THUMB-NEXT: lsls r1, r2 173; THUMB-NEXT: orrs r0, r1 174; THUMB-NEXT: subs r1, r0, #1 175; THUMB-NEXT: sbcs r0, r1 176; THUMB-NEXT: bx lr 177; 178; THUMB2-LABEL: cmp_ne_zero_or_rsr: 179; THUMB2: @ %bb.0: 180; THUMB2-NEXT: lsls r1, r2 181; THUMB2-NEXT: orrs r0, r1 182; THUMB2-NEXT: it ne 183; THUMB2-NEXT: movne r0, #1 184; THUMB2-NEXT: bx lr 185 %sh = shl i32 %b, %c 186 %or = or i32 %sh, %a 187 %res = icmp ne i32 %or, 0 188 ret i1 %res 189} 190 191define i1 @cmp_ne_zero_or_rsi(i32 %a, i32 %b) { 192; ARM-LABEL: cmp_ne_zero_or_rsi: 193; ARM: @ %bb.0: 194; ARM-NEXT: orrs r0, r0, r1, lsr #17 195; ARM-NEXT: movwne r0, #1 196; ARM-NEXT: bx lr 197; 198; THUMB-LABEL: cmp_ne_zero_or_rsi: 199; THUMB: @ %bb.0: 200; THUMB-NEXT: lsrs r1, r1, #17 201; THUMB-NEXT: orrs r0, r1 202; THUMB-NEXT: subs r1, r0, #1 203; THUMB-NEXT: sbcs r0, r1 204; THUMB-NEXT: bx lr 205; 206; THUMB2-LABEL: cmp_ne_zero_or_rsi: 207; THUMB2: @ %bb.0: 208; THUMB2-NEXT: orrs.w r0, r0, r1, lsr #17 209; THUMB2-NEXT: it ne 210; THUMB2-NEXT: movne r0, #1 211; THUMB2-NEXT: bx lr 212 %sh = lshr i32 %b, 17 213 %or = or i32 %sh, %a 214 %res = icmp ne i32 %or, 0 215 ret i1 %res 216} 217 218define i1 @cmp_ne_zero_xor_rr(i32 %a, i32 %b) { 219; ARM-LABEL: cmp_ne_zero_xor_rr: 220; ARM: @ %bb.0: 221; ARM-NEXT: eors r0, r0, r1 222; ARM-NEXT: movwne r0, #1 223; ARM-NEXT: bx lr 224; 225; THUMB-LABEL: cmp_ne_zero_xor_rr: 226; THUMB: @ %bb.0: 227; THUMB-NEXT: eors r0, r1 228; THUMB-NEXT: subs r1, r0, #1 229; THUMB-NEXT: sbcs r0, r1 230; THUMB-NEXT: bx lr 231; 232; THUMB2-LABEL: cmp_ne_zero_xor_rr: 233; THUMB2: @ %bb.0: 234; THUMB2-NEXT: eors r0, r1 235; THUMB2-NEXT: it ne 236; THUMB2-NEXT: movne r0, #1 237; THUMB2-NEXT: bx lr 238 %xor = xor i32 %a, %b 239 %res = icmp ne i32 %xor, 0 240 ret i1 %res 241} 242 243define i1 @cmp_ne_zero_xor_ri(i32 %a) { 244; ARM-LABEL: cmp_ne_zero_xor_ri: 245; ARM: @ %bb.0: 246; ARM-NEXT: subs r0, r0, #42 247; ARM-NEXT: movwne r0, #1 248; ARM-NEXT: bx lr 249; 250; THUMB-LABEL: cmp_ne_zero_xor_ri: 251; THUMB: @ %bb.0: 252; THUMB-NEXT: subs r0, #42 253; THUMB-NEXT: subs r1, r0, #1 254; THUMB-NEXT: sbcs r0, r1 255; THUMB-NEXT: bx lr 256; 257; THUMB2-LABEL: cmp_ne_zero_xor_ri: 258; THUMB2: @ %bb.0: 259; THUMB2-NEXT: subs r0, #42 260; THUMB2-NEXT: it ne 261; THUMB2-NEXT: movne r0, #1 262; THUMB2-NEXT: bx lr 263 %xor = xor i32 %a, 42 264 %res = icmp ne i32 %xor, 0 265 ret i1 %res 266} 267 268define i1 @cmp_ne_zero_xor_rsr(i32 %a, i32 %b, i32 %c) { 269; ARM-LABEL: cmp_ne_zero_xor_rsr: 270; ARM: @ %bb.0: 271; ARM-NEXT: eors r0, r0, r1, lsl r2 272; ARM-NEXT: movwne r0, #1 273; ARM-NEXT: bx lr 274; 275; THUMB-LABEL: cmp_ne_zero_xor_rsr: 276; THUMB: @ %bb.0: 277; THUMB-NEXT: lsls r1, r2 278; THUMB-NEXT: eors r0, r1 279; THUMB-NEXT: subs r1, r0, #1 280; THUMB-NEXT: sbcs r0, r1 281; THUMB-NEXT: bx lr 282; 283; THUMB2-LABEL: cmp_ne_zero_xor_rsr: 284; THUMB2: @ %bb.0: 285; THUMB2-NEXT: lsls r1, r2 286; THUMB2-NEXT: eors r0, r1 287; THUMB2-NEXT: it ne 288; THUMB2-NEXT: movne r0, #1 289; THUMB2-NEXT: bx lr 290 %sh = shl i32 %b, %c 291 %xor = xor i32 %sh, %a 292 %res = icmp ne i32 %xor, 0 293 ret i1 %res 294} 295 296define i1 @cmp_ne_zero_xor_rsi(i32 %a, i32 %b) { 297; ARM-LABEL: cmp_ne_zero_xor_rsi: 298; ARM: @ %bb.0: 299; ARM-NEXT: eors r0, r0, r1, lsr #17 300; ARM-NEXT: movwne r0, #1 301; ARM-NEXT: bx lr 302; 303; THUMB-LABEL: cmp_ne_zero_xor_rsi: 304; THUMB: @ %bb.0: 305; THUMB-NEXT: lsrs r1, r1, #17 306; THUMB-NEXT: eors r0, r1 307; THUMB-NEXT: subs r1, r0, #1 308; THUMB-NEXT: sbcs r0, r1 309; THUMB-NEXT: bx lr 310; 311; THUMB2-LABEL: cmp_ne_zero_xor_rsi: 312; THUMB2: @ %bb.0: 313; THUMB2-NEXT: eors.w r0, r0, r1, lsr #17 314; THUMB2-NEXT: it ne 315; THUMB2-NEXT: movne r0, #1 316; THUMB2-NEXT: bx lr 317 %sh = lshr i32 %b, 17 318 %xor = xor i32 %sh, %a 319 %res = icmp ne i32 %xor, 0 320 ret i1 %res 321} 322 323define i1 @cmp_ne_zero_and_not_rr(i32 %a, i32 %b) { 324; ARM-LABEL: cmp_ne_zero_and_not_rr: 325; ARM: @ %bb.0: 326; ARM-NEXT: bics r0, r0, r1 327; ARM-NEXT: movwne r0, #1 328; ARM-NEXT: bx lr 329; 330; THUMB-LABEL: cmp_ne_zero_and_not_rr: 331; THUMB: @ %bb.0: 332; THUMB-NEXT: bics r0, r1 333; THUMB-NEXT: subs r1, r0, #1 334; THUMB-NEXT: sbcs r0, r1 335; THUMB-NEXT: bx lr 336; 337; THUMB2-LABEL: cmp_ne_zero_and_not_rr: 338; THUMB2: @ %bb.0: 339; THUMB2-NEXT: bics r0, r1 340; THUMB2-NEXT: it ne 341; THUMB2-NEXT: movne r0, #1 342; THUMB2-NEXT: bx lr 343 %not = xor i32 %b, -1 344 %and = and i32 %a, %not 345 %res = icmp ne i32 %and, 0 346 ret i1 %res 347} 348 349define i1 @cmp_ne_zero_and_not_ri(i32 %a) { 350; ARM-LABEL: cmp_ne_zero_and_not_ri: 351; ARM: @ %bb.0: 352; ARM-NEXT: bics r0, r0, #42 353; ARM-NEXT: movwne r0, #1 354; ARM-NEXT: bx lr 355; 356; THUMB-LABEL: cmp_ne_zero_and_not_ri: 357; THUMB: @ %bb.0: 358; THUMB-NEXT: movs r1, #42 359; THUMB-NEXT: bics r0, r1 360; THUMB-NEXT: subs r1, r0, #1 361; THUMB-NEXT: sbcs r0, r1 362; THUMB-NEXT: bx lr 363; 364; THUMB2-LABEL: cmp_ne_zero_and_not_ri: 365; THUMB2: @ %bb.0: 366; THUMB2-NEXT: bics r0, r0, #42 367; THUMB2-NEXT: it ne 368; THUMB2-NEXT: movne r0, #1 369; THUMB2-NEXT: bx lr 370 %not = xor i32 42, -1 371 %and = and i32 %a, %not 372 %res = icmp ne i32 %and, 0 373 ret i1 %res 374} 375 376define i1 @cmp_ne_zero_and_not_rsr(i32 %a, i32 %b, i32 %c) { 377; ARM-LABEL: cmp_ne_zero_and_not_rsr: 378; ARM: @ %bb.0: 379; ARM-NEXT: bics r0, r0, r1, lsl r2 380; ARM-NEXT: movwne r0, #1 381; ARM-NEXT: bx lr 382; 383; THUMB-LABEL: cmp_ne_zero_and_not_rsr: 384; THUMB: @ %bb.0: 385; THUMB-NEXT: lsls r1, r2 386; THUMB-NEXT: bics r0, r1 387; THUMB-NEXT: subs r1, r0, #1 388; THUMB-NEXT: sbcs r0, r1 389; THUMB-NEXT: bx lr 390; 391; THUMB2-LABEL: cmp_ne_zero_and_not_rsr: 392; THUMB2: @ %bb.0: 393; THUMB2-NEXT: lsls r1, r2 394; THUMB2-NEXT: bics r0, r1 395; THUMB2-NEXT: it ne 396; THUMB2-NEXT: movne r0, #1 397; THUMB2-NEXT: bx lr 398 %sh = shl i32 %b, %c 399 %not = xor i32 %sh, -1 400 %and = and i32 %not, %a 401 %res = icmp ne i32 %and, 0 402 ret i1 %res 403} 404 405define i1 @cmp_ne_zero_and_not_rsi(i32 %a, i32 %b) { 406; ARM-LABEL: cmp_ne_zero_and_not_rsi: 407; ARM: @ %bb.0: 408; ARM-NEXT: bics r0, r0, r1, lsr #17 409; ARM-NEXT: movwne r0, #1 410; ARM-NEXT: bx lr 411; 412; THUMB-LABEL: cmp_ne_zero_and_not_rsi: 413; THUMB: @ %bb.0: 414; THUMB-NEXT: lsrs r1, r1, #17 415; THUMB-NEXT: bics r0, r1 416; THUMB-NEXT: subs r1, r0, #1 417; THUMB-NEXT: sbcs r0, r1 418; THUMB-NEXT: bx lr 419; 420; THUMB2-LABEL: cmp_ne_zero_and_not_rsi: 421; THUMB2: @ %bb.0: 422; THUMB2-NEXT: bics.w r0, r0, r1, lsr #17 423; THUMB2-NEXT: it ne 424; THUMB2-NEXT: movne r0, #1 425; THUMB2-NEXT: bx lr 426 %sh = lshr i32 %b, 17 427 %not = xor i32 %sh, -1 428 %and = and i32 %not, %a 429 %res = icmp ne i32 %and, 0 430 ret i1 %res 431} 432 433define i1 @cmp_ne_zero_shl_rr(i32 %a, i32 %b) { 434; ARM-LABEL: cmp_ne_zero_shl_rr: 435; ARM: @ %bb.0: 436; ARM-NEXT: lsls r0, r0, r1 437; ARM-NEXT: movwne r0, #1 438; ARM-NEXT: bx lr 439; 440; THUMB-LABEL: cmp_ne_zero_shl_rr: 441; THUMB: @ %bb.0: 442; THUMB-NEXT: lsls r0, r1 443; THUMB-NEXT: subs r1, r0, #1 444; THUMB-NEXT: sbcs r0, r1 445; THUMB-NEXT: bx lr 446; 447; THUMB2-LABEL: cmp_ne_zero_shl_rr: 448; THUMB2: @ %bb.0: 449; THUMB2-NEXT: lsls r0, r1 450; THUMB2-NEXT: it ne 451; THUMB2-NEXT: movne r0, #1 452; THUMB2-NEXT: bx lr 453 %sh = shl i32 %a, %b 454 %cmp = icmp ne i32 %sh, 0 455 ret i1 %cmp 456} 457 458define i1 @cmp_ne_zero_shl_ri(i32 %a) { 459; ARM-LABEL: cmp_ne_zero_shl_ri: 460; ARM: @ %bb.0: 461; ARM-NEXT: lsls r0, r0, #7 462; ARM-NEXT: movwne r0, #1 463; ARM-NEXT: bx lr 464; 465; THUMB-LABEL: cmp_ne_zero_shl_ri: 466; THUMB: @ %bb.0: 467; THUMB-NEXT: lsls r0, r0, #7 468; THUMB-NEXT: subs r1, r0, #1 469; THUMB-NEXT: sbcs r0, r1 470; THUMB-NEXT: bx lr 471; 472; THUMB2-LABEL: cmp_ne_zero_shl_ri: 473; THUMB2: @ %bb.0: 474; THUMB2-NEXT: lsls r0, r0, #7 475; THUMB2-NEXT: it ne 476; THUMB2-NEXT: movne r0, #1 477; THUMB2-NEXT: bx lr 478 %sh = shl i32 %a, 7 479 %cmp = icmp ne i32 %sh, 0 480 ret i1 %cmp 481} 482 483define i1 @cmp_ne_zero_lshr_rr(i32 %a, i32 %b) { 484; ARM-LABEL: cmp_ne_zero_lshr_rr: 485; ARM: @ %bb.0: 486; ARM-NEXT: lsrs r0, r0, r1 487; ARM-NEXT: movwne r0, #1 488; ARM-NEXT: bx lr 489; 490; THUMB-LABEL: cmp_ne_zero_lshr_rr: 491; THUMB: @ %bb.0: 492; THUMB-NEXT: lsrs r0, r1 493; THUMB-NEXT: subs r1, r0, #1 494; THUMB-NEXT: sbcs r0, r1 495; THUMB-NEXT: bx lr 496; 497; THUMB2-LABEL: cmp_ne_zero_lshr_rr: 498; THUMB2: @ %bb.0: 499; THUMB2-NEXT: lsrs r0, r1 500; THUMB2-NEXT: it ne 501; THUMB2-NEXT: movne r0, #1 502; THUMB2-NEXT: bx lr 503 %sh = lshr i32 %a, %b 504 %cmp = icmp ne i32 %sh, 0 505 ret i1 %cmp 506} 507 508define i1 @cmp_ne_zero_lshr_ri(i32 %a) { 509; ARM-LABEL: cmp_ne_zero_lshr_ri: 510; ARM: @ %bb.0: 511; ARM-NEXT: lsrs r0, r0, #7 512; ARM-NEXT: movwne r0, #1 513; ARM-NEXT: bx lr 514; 515; THUMB-LABEL: cmp_ne_zero_lshr_ri: 516; THUMB: @ %bb.0: 517; THUMB-NEXT: lsrs r0, r0, #7 518; THUMB-NEXT: subs r1, r0, #1 519; THUMB-NEXT: sbcs r0, r1 520; THUMB-NEXT: bx lr 521; 522; THUMB2-LABEL: cmp_ne_zero_lshr_ri: 523; THUMB2: @ %bb.0: 524; THUMB2-NEXT: lsrs r0, r0, #7 525; THUMB2-NEXT: it ne 526; THUMB2-NEXT: movne r0, #1 527; THUMB2-NEXT: bx lr 528 %sh = lshr i32 %a, 7 529 %cmp = icmp ne i32 %sh, 0 530 ret i1 %cmp 531} 532 533define i1 @cmp_ne_zero_ashr_rr(i32 %a, i32 %b) { 534; ARM-LABEL: cmp_ne_zero_ashr_rr: 535; ARM: @ %bb.0: 536; ARM-NEXT: asrs r0, r0, r1 537; ARM-NEXT: movwne r0, #1 538; ARM-NEXT: bx lr 539; 540; THUMB-LABEL: cmp_ne_zero_ashr_rr: 541; THUMB: @ %bb.0: 542; THUMB-NEXT: asrs r0, r1 543; THUMB-NEXT: subs r1, r0, #1 544; THUMB-NEXT: sbcs r0, r1 545; THUMB-NEXT: bx lr 546; 547; THUMB2-LABEL: cmp_ne_zero_ashr_rr: 548; THUMB2: @ %bb.0: 549; THUMB2-NEXT: asrs r0, r1 550; THUMB2-NEXT: cmp r0, #0 551; THUMB2-NEXT: it ne 552; THUMB2-NEXT: movne r0, #1 553; THUMB2-NEXT: bx lr 554 %sh = ashr i32 %a, %b 555 %cmp = icmp ne i32 %sh, 0 556 ret i1 %cmp 557} 558 559define i1 @cmp_ne_zero_ashr_ri(i32 %a) { 560; ARM-LABEL: cmp_ne_zero_ashr_ri: 561; ARM: @ %bb.0: 562; ARM-NEXT: asrs r0, r0, #7 563; ARM-NEXT: movwne r0, #1 564; ARM-NEXT: bx lr 565; 566; THUMB-LABEL: cmp_ne_zero_ashr_ri: 567; THUMB: @ %bb.0: 568; THUMB-NEXT: asrs r0, r0, #7 569; THUMB-NEXT: subs r1, r0, #1 570; THUMB-NEXT: sbcs r0, r1 571; THUMB-NEXT: bx lr 572; 573; THUMB2-LABEL: cmp_ne_zero_ashr_ri: 574; THUMB2: @ %bb.0: 575; THUMB2-NEXT: asrs r0, r0, #7 576; THUMB2-NEXT: cmp r0, #0 577; THUMB2-NEXT: it ne 578; THUMB2-NEXT: movne r0, #1 579; THUMB2-NEXT: bx lr 580 %sh = ashr i32 %a, 7 581 %cmp = icmp ne i32 %sh, 0 582 ret i1 %cmp 583} 584 585define i1 @cmp_eq_zero_and_rr(i32 %a, i32 %b) { 586; ARM-LABEL: cmp_eq_zero_and_rr: 587; ARM: @ %bb.0: 588; ARM-NEXT: and r0, r0, r1 589; ARM-NEXT: clz r0, r0 590; ARM-NEXT: lsr r0, r0, #5 591; ARM-NEXT: bx lr 592; 593; THUMB-LABEL: cmp_eq_zero_and_rr: 594; THUMB: @ %bb.0: 595; THUMB-NEXT: ands r0, r1 596; THUMB-NEXT: rsbs r1, r0, #0 597; THUMB-NEXT: adcs r0, r1 598; THUMB-NEXT: bx lr 599; 600; THUMB2-LABEL: cmp_eq_zero_and_rr: 601; THUMB2: @ %bb.0: 602; THUMB2-NEXT: ands r0, r1 603; THUMB2-NEXT: clz r0, r0 604; THUMB2-NEXT: lsrs r0, r0, #5 605; THUMB2-NEXT: bx lr 606 %and = and i32 %a, %b 607 %res = icmp eq i32 %and, 0 608 ret i1 %res 609} 610 611define i1 @cmp_eq_zero_and_ri(i32 %a) { 612; ARM-LABEL: cmp_eq_zero_and_ri: 613; ARM: @ %bb.0: 614; ARM-NEXT: and r0, r0, #42 615; ARM-NEXT: clz r0, r0 616; ARM-NEXT: lsr r0, r0, #5 617; ARM-NEXT: bx lr 618; 619; THUMB-LABEL: cmp_eq_zero_and_ri: 620; THUMB: @ %bb.0: 621; THUMB-NEXT: movs r1, #42 622; THUMB-NEXT: ands r0, r1 623; THUMB-NEXT: rsbs r1, r0, #0 624; THUMB-NEXT: adcs r0, r1 625; THUMB-NEXT: bx lr 626; 627; THUMB2-LABEL: cmp_eq_zero_and_ri: 628; THUMB2: @ %bb.0: 629; THUMB2-NEXT: and r0, r0, #42 630; THUMB2-NEXT: clz r0, r0 631; THUMB2-NEXT: lsrs r0, r0, #5 632; THUMB2-NEXT: bx lr 633 %and = and i32 %a, 42 634 %res = icmp eq i32 %and, 0 635 ret i1 %res 636} 637 638define i1 @cmp_eq_zero_and_rsr(i32 %a, i32 %b, i32 %c) { 639; ARM-LABEL: cmp_eq_zero_and_rsr: 640; ARM: @ %bb.0: 641; ARM-NEXT: and r0, r0, r1, lsl r2 642; ARM-NEXT: clz r0, r0 643; ARM-NEXT: lsr r0, r0, #5 644; ARM-NEXT: bx lr 645; 646; THUMB-LABEL: cmp_eq_zero_and_rsr: 647; THUMB: @ %bb.0: 648; THUMB-NEXT: lsls r1, r2 649; THUMB-NEXT: ands r0, r1 650; THUMB-NEXT: rsbs r1, r0, #0 651; THUMB-NEXT: adcs r0, r1 652; THUMB-NEXT: bx lr 653; 654; THUMB2-LABEL: cmp_eq_zero_and_rsr: 655; THUMB2: @ %bb.0: 656; THUMB2-NEXT: lsls r1, r2 657; THUMB2-NEXT: ands r0, r1 658; THUMB2-NEXT: clz r0, r0 659; THUMB2-NEXT: lsrs r0, r0, #5 660; THUMB2-NEXT: bx lr 661 %sh = shl i32 %b, %c 662 %and = and i32 %sh, %a 663 %res = icmp eq i32 %and, 0 664 ret i1 %res 665} 666 667define i1 @cmp_eq_zero_and_rsi(i32 %a, i32 %b) { 668; ARM-LABEL: cmp_eq_zero_and_rsi: 669; ARM: @ %bb.0: 670; ARM-NEXT: and r0, r0, r1, lsr #17 671; ARM-NEXT: clz r0, r0 672; ARM-NEXT: lsr r0, r0, #5 673; ARM-NEXT: bx lr 674; 675; THUMB-LABEL: cmp_eq_zero_and_rsi: 676; THUMB: @ %bb.0: 677; THUMB-NEXT: lsrs r1, r1, #17 678; THUMB-NEXT: ands r0, r1 679; THUMB-NEXT: rsbs r1, r0, #0 680; THUMB-NEXT: adcs r0, r1 681; THUMB-NEXT: bx lr 682; 683; THUMB2-LABEL: cmp_eq_zero_and_rsi: 684; THUMB2: @ %bb.0: 685; THUMB2-NEXT: and.w r0, r0, r1, lsr #17 686; THUMB2-NEXT: clz r0, r0 687; THUMB2-NEXT: lsrs r0, r0, #5 688; THUMB2-NEXT: bx lr 689 %sh = lshr i32 %b, 17 690 %and = and i32 %sh, %a 691 %res = icmp eq i32 %and, 0 692 ret i1 %res 693} 694 695define i1 @cmp_eq_zero_or_rr(i32 %a, i32 %b) { 696; ARM-LABEL: cmp_eq_zero_or_rr: 697; ARM: @ %bb.0: 698; ARM-NEXT: orr r0, r0, r1 699; ARM-NEXT: clz r0, r0 700; ARM-NEXT: lsr r0, r0, #5 701; ARM-NEXT: bx lr 702; 703; THUMB-LABEL: cmp_eq_zero_or_rr: 704; THUMB: @ %bb.0: 705; THUMB-NEXT: orrs r0, r1 706; THUMB-NEXT: rsbs r1, r0, #0 707; THUMB-NEXT: adcs r0, r1 708; THUMB-NEXT: bx lr 709; 710; THUMB2-LABEL: cmp_eq_zero_or_rr: 711; THUMB2: @ %bb.0: 712; THUMB2-NEXT: orrs r0, r1 713; THUMB2-NEXT: clz r0, r0 714; THUMB2-NEXT: lsrs r0, r0, #5 715; THUMB2-NEXT: bx lr 716 %or = or i32 %a, %b 717 %res = icmp eq i32 %or, 0 718 ret i1 %res 719} 720 721define i1 @cmp_eq_zero_or_ri(i32 %a) { 722; ARM-LABEL: cmp_eq_zero_or_ri: 723; ARM: @ %bb.0: 724; ARM-NEXT: mov r0, #0 725; ARM-NEXT: bx lr 726; 727; THUMB-LABEL: cmp_eq_zero_or_ri: 728; THUMB: @ %bb.0: 729; THUMB-NEXT: movs r1, #42 730; THUMB-NEXT: orrs r0, r1 731; THUMB-NEXT: rsbs r1, r0, #0 732; THUMB-NEXT: adcs r0, r1 733; THUMB-NEXT: bx lr 734; 735; THUMB2-LABEL: cmp_eq_zero_or_ri: 736; THUMB2: @ %bb.0: 737; THUMB2-NEXT: movs r0, #0 738; THUMB2-NEXT: bx lr 739 %or = or i32 %a, 42 740 %res = icmp eq i32 %or, 0 741 ret i1 %res 742} 743 744define i1 @cmp_eq_zero_or_rsr(i32 %a, i32 %b, i32 %c) { 745; ARM-LABEL: cmp_eq_zero_or_rsr: 746; ARM: @ %bb.0: 747; ARM-NEXT: orr r0, r0, r1, lsl r2 748; ARM-NEXT: clz r0, r0 749; ARM-NEXT: lsr r0, r0, #5 750; ARM-NEXT: bx lr 751; 752; THUMB-LABEL: cmp_eq_zero_or_rsr: 753; THUMB: @ %bb.0: 754; THUMB-NEXT: lsls r1, r2 755; THUMB-NEXT: orrs r0, r1 756; THUMB-NEXT: rsbs r1, r0, #0 757; THUMB-NEXT: adcs r0, r1 758; THUMB-NEXT: bx lr 759; 760; THUMB2-LABEL: cmp_eq_zero_or_rsr: 761; THUMB2: @ %bb.0: 762; THUMB2-NEXT: lsls r1, r2 763; THUMB2-NEXT: orrs r0, r1 764; THUMB2-NEXT: clz r0, r0 765; THUMB2-NEXT: lsrs r0, r0, #5 766; THUMB2-NEXT: bx lr 767 %sh = shl i32 %b, %c 768 %or = or i32 %sh, %a 769 %res = icmp eq i32 %or, 0 770 ret i1 %res 771} 772 773define i1 @cmp_eq_zero_or_rsi(i32 %a, i32 %b) { 774; ARM-LABEL: cmp_eq_zero_or_rsi: 775; ARM: @ %bb.0: 776; ARM-NEXT: orr r0, r0, r1, lsr #17 777; ARM-NEXT: clz r0, r0 778; ARM-NEXT: lsr r0, r0, #5 779; ARM-NEXT: bx lr 780; 781; THUMB-LABEL: cmp_eq_zero_or_rsi: 782; THUMB: @ %bb.0: 783; THUMB-NEXT: lsrs r1, r1, #17 784; THUMB-NEXT: orrs r0, r1 785; THUMB-NEXT: rsbs r1, r0, #0 786; THUMB-NEXT: adcs r0, r1 787; THUMB-NEXT: bx lr 788; 789; THUMB2-LABEL: cmp_eq_zero_or_rsi: 790; THUMB2: @ %bb.0: 791; THUMB2-NEXT: orr.w r0, r0, r1, lsr #17 792; THUMB2-NEXT: clz r0, r0 793; THUMB2-NEXT: lsrs r0, r0, #5 794; THUMB2-NEXT: bx lr 795 %sh = lshr i32 %b, 17 796 %or = or i32 %sh, %a 797 %res = icmp eq i32 %or, 0 798 ret i1 %res 799} 800 801define i1 @cmp_eq_zero_xor_rr(i32 %a, i32 %b) { 802; ARM-LABEL: cmp_eq_zero_xor_rr: 803; ARM: @ %bb.0: 804; ARM-NEXT: eor r0, r0, r1 805; ARM-NEXT: clz r0, r0 806; ARM-NEXT: lsr r0, r0, #5 807; ARM-NEXT: bx lr 808; 809; THUMB-LABEL: cmp_eq_zero_xor_rr: 810; THUMB: @ %bb.0: 811; THUMB-NEXT: eors r0, r1 812; THUMB-NEXT: rsbs r1, r0, #0 813; THUMB-NEXT: adcs r0, r1 814; THUMB-NEXT: bx lr 815; 816; THUMB2-LABEL: cmp_eq_zero_xor_rr: 817; THUMB2: @ %bb.0: 818; THUMB2-NEXT: eors r0, r1 819; THUMB2-NEXT: clz r0, r0 820; THUMB2-NEXT: lsrs r0, r0, #5 821; THUMB2-NEXT: bx lr 822 %xor = xor i32 %a, %b 823 %res = icmp eq i32 %xor, 0 824 ret i1 %res 825} 826 827define i1 @cmp_eq_zero_xor_ri(i32 %a) { 828; ARM-LABEL: cmp_eq_zero_xor_ri: 829; ARM: @ %bb.0: 830; ARM-NEXT: sub r0, r0, #42 831; ARM-NEXT: clz r0, r0 832; ARM-NEXT: lsr r0, r0, #5 833; ARM-NEXT: bx lr 834; 835; THUMB-LABEL: cmp_eq_zero_xor_ri: 836; THUMB: @ %bb.0: 837; THUMB-NEXT: subs r0, #42 838; THUMB-NEXT: rsbs r1, r0, #0 839; THUMB-NEXT: adcs r0, r1 840; THUMB-NEXT: bx lr 841; 842; THUMB2-LABEL: cmp_eq_zero_xor_ri: 843; THUMB2: @ %bb.0: 844; THUMB2-NEXT: subs r0, #42 845; THUMB2-NEXT: clz r0, r0 846; THUMB2-NEXT: lsrs r0, r0, #5 847; THUMB2-NEXT: bx lr 848 %xor = xor i32 %a, 42 849 %res = icmp eq i32 %xor, 0 850 ret i1 %res 851} 852 853define i1 @cmp_eq_zero_xor_rsr(i32 %a, i32 %b, i32 %c) { 854; ARM-LABEL: cmp_eq_zero_xor_rsr: 855; ARM: @ %bb.0: 856; ARM-NEXT: eor r0, r0, r1, lsl r2 857; ARM-NEXT: clz r0, r0 858; ARM-NEXT: lsr r0, r0, #5 859; ARM-NEXT: bx lr 860; 861; THUMB-LABEL: cmp_eq_zero_xor_rsr: 862; THUMB: @ %bb.0: 863; THUMB-NEXT: lsls r1, r2 864; THUMB-NEXT: eors r0, r1 865; THUMB-NEXT: rsbs r1, r0, #0 866; THUMB-NEXT: adcs r0, r1 867; THUMB-NEXT: bx lr 868; 869; THUMB2-LABEL: cmp_eq_zero_xor_rsr: 870; THUMB2: @ %bb.0: 871; THUMB2-NEXT: lsls r1, r2 872; THUMB2-NEXT: eors r0, r1 873; THUMB2-NEXT: clz r0, r0 874; THUMB2-NEXT: lsrs r0, r0, #5 875; THUMB2-NEXT: bx lr 876 %sh = shl i32 %b, %c 877 %xor = xor i32 %sh, %a 878 %res = icmp eq i32 %xor, 0 879 ret i1 %res 880} 881 882define i1 @cmp_eq_zero_xor_rsi(i32 %a, i32 %b) { 883; ARM-LABEL: cmp_eq_zero_xor_rsi: 884; ARM: @ %bb.0: 885; ARM-NEXT: eor r0, r0, r1, lsr #17 886; ARM-NEXT: clz r0, r0 887; ARM-NEXT: lsr r0, r0, #5 888; ARM-NEXT: bx lr 889; 890; THUMB-LABEL: cmp_eq_zero_xor_rsi: 891; THUMB: @ %bb.0: 892; THUMB-NEXT: lsrs r1, r1, #17 893; THUMB-NEXT: eors r0, r1 894; THUMB-NEXT: rsbs r1, r0, #0 895; THUMB-NEXT: adcs r0, r1 896; THUMB-NEXT: bx lr 897; 898; THUMB2-LABEL: cmp_eq_zero_xor_rsi: 899; THUMB2: @ %bb.0: 900; THUMB2-NEXT: eor.w r0, r0, r1, lsr #17 901; THUMB2-NEXT: clz r0, r0 902; THUMB2-NEXT: lsrs r0, r0, #5 903; THUMB2-NEXT: bx lr 904 %sh = lshr i32 %b, 17 905 %xor = xor i32 %sh, %a 906 %res = icmp eq i32 %xor, 0 907 ret i1 %res 908} 909 910define i1 @cmp_eq_zero_and_not_rr(i32 %a, i32 %b) { 911; ARM-LABEL: cmp_eq_zero_and_not_rr: 912; ARM: @ %bb.0: 913; ARM-NEXT: bic r0, r0, r1 914; ARM-NEXT: clz r0, r0 915; ARM-NEXT: lsr r0, r0, #5 916; ARM-NEXT: bx lr 917; 918; THUMB-LABEL: cmp_eq_zero_and_not_rr: 919; THUMB: @ %bb.0: 920; THUMB-NEXT: bics r0, r1 921; THUMB-NEXT: rsbs r1, r0, #0 922; THUMB-NEXT: adcs r0, r1 923; THUMB-NEXT: bx lr 924; 925; THUMB2-LABEL: cmp_eq_zero_and_not_rr: 926; THUMB2: @ %bb.0: 927; THUMB2-NEXT: bics r0, r1 928; THUMB2-NEXT: clz r0, r0 929; THUMB2-NEXT: lsrs r0, r0, #5 930; THUMB2-NEXT: bx lr 931 %not = xor i32 %b, -1 932 %and = and i32 %a, %not 933 %res = icmp eq i32 %and, 0 934 ret i1 %res 935} 936 937define i1 @cmp_eq_zero_and_not_ri(i32 %a) { 938; ARM-LABEL: cmp_eq_zero_and_not_ri: 939; ARM: @ %bb.0: 940; ARM-NEXT: bic r0, r0, #42 941; ARM-NEXT: clz r0, r0 942; ARM-NEXT: lsr r0, r0, #5 943; ARM-NEXT: bx lr 944; 945; THUMB-LABEL: cmp_eq_zero_and_not_ri: 946; THUMB: @ %bb.0: 947; THUMB-NEXT: movs r1, #42 948; THUMB-NEXT: bics r0, r1 949; THUMB-NEXT: rsbs r1, r0, #0 950; THUMB-NEXT: adcs r0, r1 951; THUMB-NEXT: bx lr 952; 953; THUMB2-LABEL: cmp_eq_zero_and_not_ri: 954; THUMB2: @ %bb.0: 955; THUMB2-NEXT: bic r0, r0, #42 956; THUMB2-NEXT: clz r0, r0 957; THUMB2-NEXT: lsrs r0, r0, #5 958; THUMB2-NEXT: bx lr 959 %not = xor i32 42, -1 960 %and = and i32 %a, %not 961 %res = icmp eq i32 %and, 0 962 ret i1 %res 963} 964 965define i1 @cmp_eq_zero_and_not_rsr(i32 %a, i32 %b, i32 %c) { 966; ARM-LABEL: cmp_eq_zero_and_not_rsr: 967; ARM: @ %bb.0: 968; ARM-NEXT: bic r0, r0, r1, lsl r2 969; ARM-NEXT: clz r0, r0 970; ARM-NEXT: lsr r0, r0, #5 971; ARM-NEXT: bx lr 972; 973; THUMB-LABEL: cmp_eq_zero_and_not_rsr: 974; THUMB: @ %bb.0: 975; THUMB-NEXT: lsls r1, r2 976; THUMB-NEXT: bics r0, r1 977; THUMB-NEXT: rsbs r1, r0, #0 978; THUMB-NEXT: adcs r0, r1 979; THUMB-NEXT: bx lr 980; 981; THUMB2-LABEL: cmp_eq_zero_and_not_rsr: 982; THUMB2: @ %bb.0: 983; THUMB2-NEXT: lsls r1, r2 984; THUMB2-NEXT: bics r0, r1 985; THUMB2-NEXT: clz r0, r0 986; THUMB2-NEXT: lsrs r0, r0, #5 987; THUMB2-NEXT: bx lr 988 %sh = shl i32 %b, %c 989 %not = xor i32 %sh, -1 990 %and = and i32 %not, %a 991 %res = icmp eq i32 %and, 0 992 ret i1 %res 993} 994 995define i1 @cmp_eq_zero_and_not_rsi(i32 %a, i32 %b) { 996; ARM-LABEL: cmp_eq_zero_and_not_rsi: 997; ARM: @ %bb.0: 998; ARM-NEXT: bic r0, r0, r1, lsr #17 999; ARM-NEXT: clz r0, r0 1000; ARM-NEXT: lsr r0, r0, #5 1001; ARM-NEXT: bx lr 1002; 1003; THUMB-LABEL: cmp_eq_zero_and_not_rsi: 1004; THUMB: @ %bb.0: 1005; THUMB-NEXT: lsrs r1, r1, #17 1006; THUMB-NEXT: bics r0, r1 1007; THUMB-NEXT: rsbs r1, r0, #0 1008; THUMB-NEXT: adcs r0, r1 1009; THUMB-NEXT: bx lr 1010; 1011; THUMB2-LABEL: cmp_eq_zero_and_not_rsi: 1012; THUMB2: @ %bb.0: 1013; THUMB2-NEXT: bic.w r0, r0, r1, lsr #17 1014; THUMB2-NEXT: clz r0, r0 1015; THUMB2-NEXT: lsrs r0, r0, #5 1016; THUMB2-NEXT: bx lr 1017 %sh = lshr i32 %b, 17 1018 %not = xor i32 %sh, -1 1019 %and = and i32 %not, %a 1020 %res = icmp eq i32 %and, 0 1021 ret i1 %res 1022} 1023 1024define i1 @cmp_eq_zero_shl_rr(i32 %a, i32 %b) { 1025; ARM-LABEL: cmp_eq_zero_shl_rr: 1026; ARM: @ %bb.0: 1027; ARM-NEXT: lsl r0, r0, r1 1028; ARM-NEXT: clz r0, r0 1029; ARM-NEXT: lsr r0, r0, #5 1030; ARM-NEXT: bx lr 1031; 1032; THUMB-LABEL: cmp_eq_zero_shl_rr: 1033; THUMB: @ %bb.0: 1034; THUMB-NEXT: lsls r0, r1 1035; THUMB-NEXT: rsbs r1, r0, #0 1036; THUMB-NEXT: adcs r0, r1 1037; THUMB-NEXT: bx lr 1038; 1039; THUMB2-LABEL: cmp_eq_zero_shl_rr: 1040; THUMB2: @ %bb.0: 1041; THUMB2-NEXT: lsls r0, r1 1042; THUMB2-NEXT: clz r0, r0 1043; THUMB2-NEXT: lsrs r0, r0, #5 1044; THUMB2-NEXT: bx lr 1045 %sh = shl i32 %a, %b 1046 %cmp = icmp eq i32 %sh, 0 1047 ret i1 %cmp 1048} 1049 1050define i1 @cmp_eq_zero_shl_ri(i32 %a) { 1051; ARM-LABEL: cmp_eq_zero_shl_ri: 1052; ARM: @ %bb.0: 1053; ARM-NEXT: lsl r0, r0, #7 1054; ARM-NEXT: clz r0, r0 1055; ARM-NEXT: lsr r0, r0, #5 1056; ARM-NEXT: bx lr 1057; 1058; THUMB-LABEL: cmp_eq_zero_shl_ri: 1059; THUMB: @ %bb.0: 1060; THUMB-NEXT: lsls r1, r0, #7 1061; THUMB-NEXT: rsbs r0, r1, #0 1062; THUMB-NEXT: adcs r0, r1 1063; THUMB-NEXT: bx lr 1064; 1065; THUMB2-LABEL: cmp_eq_zero_shl_ri: 1066; THUMB2: @ %bb.0: 1067; THUMB2-NEXT: lsls r0, r0, #7 1068; THUMB2-NEXT: clz r0, r0 1069; THUMB2-NEXT: lsrs r0, r0, #5 1070; THUMB2-NEXT: bx lr 1071 %sh = shl i32 %a, 7 1072 %cmp = icmp eq i32 %sh, 0 1073 ret i1 %cmp 1074} 1075 1076define i1 @cmp_eq_zero_lshr_rr(i32 %a, i32 %b) { 1077; ARM-LABEL: cmp_eq_zero_lshr_rr: 1078; ARM: @ %bb.0: 1079; ARM-NEXT: lsr r0, r0, r1 1080; ARM-NEXT: clz r0, r0 1081; ARM-NEXT: lsr r0, r0, #5 1082; ARM-NEXT: bx lr 1083; 1084; THUMB-LABEL: cmp_eq_zero_lshr_rr: 1085; THUMB: @ %bb.0: 1086; THUMB-NEXT: lsrs r0, r1 1087; THUMB-NEXT: rsbs r1, r0, #0 1088; THUMB-NEXT: adcs r0, r1 1089; THUMB-NEXT: bx lr 1090; 1091; THUMB2-LABEL: cmp_eq_zero_lshr_rr: 1092; THUMB2: @ %bb.0: 1093; THUMB2-NEXT: lsrs r0, r1 1094; THUMB2-NEXT: clz r0, r0 1095; THUMB2-NEXT: lsrs r0, r0, #5 1096; THUMB2-NEXT: bx lr 1097 %sh = lshr i32 %a, %b 1098 %cmp = icmp eq i32 %sh, 0 1099 ret i1 %cmp 1100} 1101 1102define i1 @cmp_eq_zero_lshr_ri(i32 %a) { 1103; ARM-LABEL: cmp_eq_zero_lshr_ri: 1104; ARM: @ %bb.0: 1105; ARM-NEXT: lsr r0, r0, #7 1106; ARM-NEXT: clz r0, r0 1107; ARM-NEXT: lsr r0, r0, #5 1108; ARM-NEXT: bx lr 1109; 1110; THUMB-LABEL: cmp_eq_zero_lshr_ri: 1111; THUMB: @ %bb.0: 1112; THUMB-NEXT: lsrs r1, r0, #7 1113; THUMB-NEXT: rsbs r0, r1, #0 1114; THUMB-NEXT: adcs r0, r1 1115; THUMB-NEXT: bx lr 1116; 1117; THUMB2-LABEL: cmp_eq_zero_lshr_ri: 1118; THUMB2: @ %bb.0: 1119; THUMB2-NEXT: lsrs r0, r0, #7 1120; THUMB2-NEXT: clz r0, r0 1121; THUMB2-NEXT: lsrs r0, r0, #5 1122; THUMB2-NEXT: bx lr 1123 %sh = lshr i32 %a, 7 1124 %cmp = icmp eq i32 %sh, 0 1125 ret i1 %cmp 1126} 1127 1128define i1 @cmp_eq_zero_ashr_rr(i32 %a, i32 %b) { 1129; ARM-LABEL: cmp_eq_zero_ashr_rr: 1130; ARM: @ %bb.0: 1131; ARM-NEXT: asr r0, r0, r1 1132; ARM-NEXT: clz r0, r0 1133; ARM-NEXT: lsr r0, r0, #5 1134; ARM-NEXT: bx lr 1135; 1136; THUMB-LABEL: cmp_eq_zero_ashr_rr: 1137; THUMB: @ %bb.0: 1138; THUMB-NEXT: asrs r0, r1 1139; THUMB-NEXT: rsbs r1, r0, #0 1140; THUMB-NEXT: adcs r0, r1 1141; THUMB-NEXT: bx lr 1142; 1143; THUMB2-LABEL: cmp_eq_zero_ashr_rr: 1144; THUMB2: @ %bb.0: 1145; THUMB2-NEXT: asrs r0, r1 1146; THUMB2-NEXT: clz r0, r0 1147; THUMB2-NEXT: lsrs r0, r0, #5 1148; THUMB2-NEXT: bx lr 1149 %sh = ashr i32 %a, %b 1150 %cmp = icmp eq i32 %sh, 0 1151 ret i1 %cmp 1152} 1153 1154define i1 @cmp_eq_zero_ashr_ri(i32 %a) { 1155; ARM-LABEL: cmp_eq_zero_ashr_ri: 1156; ARM: @ %bb.0: 1157; ARM-NEXT: asr r0, r0, #7 1158; ARM-NEXT: clz r0, r0 1159; ARM-NEXT: lsr r0, r0, #5 1160; ARM-NEXT: bx lr 1161; 1162; THUMB-LABEL: cmp_eq_zero_ashr_ri: 1163; THUMB: @ %bb.0: 1164; THUMB-NEXT: asrs r1, r0, #7 1165; THUMB-NEXT: rsbs r0, r1, #0 1166; THUMB-NEXT: adcs r0, r1 1167; THUMB-NEXT: bx lr 1168; 1169; THUMB2-LABEL: cmp_eq_zero_ashr_ri: 1170; THUMB2: @ %bb.0: 1171; THUMB2-NEXT: asrs r0, r0, #7 1172; THUMB2-NEXT: clz r0, r0 1173; THUMB2-NEXT: lsrs r0, r0, #5 1174; THUMB2-NEXT: bx lr 1175 %sh = ashr i32 %a, 7 1176 %cmp = icmp eq i32 %sh, 0 1177 ret i1 %cmp 1178} 1179 1180declare void @consume(i32 %0); 1181 1182define void @br_on_binop_eq_zero(i32 %a, i32 %b) { 1183; ARM-LABEL: br_on_binop_eq_zero: 1184; ARM: @ %bb.0: 1185; ARM-NEXT: orrs r1, r0, r1 1186; ARM-NEXT: bxne lr 1187; ARM-NEXT: .LBB44_1: @ %true_br 1188; ARM-NEXT: push {r11, lr} 1189; ARM-NEXT: bl consume 1190; ARM-NEXT: pop {r11, lr} 1191; ARM-NEXT: bx lr 1192; 1193; THUMB-LABEL: br_on_binop_eq_zero: 1194; THUMB: @ %bb.0: 1195; THUMB-NEXT: push {r7, lr} 1196; THUMB-NEXT: orrs r1, r0 1197; THUMB-NEXT: beq .LBB44_2 1198; THUMB-NEXT: @ %bb.1: @ %exit 1199; THUMB-NEXT: pop {r7, pc} 1200; THUMB-NEXT: .LBB44_2: @ %true_br 1201; THUMB-NEXT: bl consume 1202; THUMB-NEXT: pop {r7, pc} 1203; 1204; THUMB2-LABEL: br_on_binop_eq_zero: 1205; THUMB2: @ %bb.0: 1206; THUMB2-NEXT: orrs r1, r0 1207; THUMB2-NEXT: it ne 1208; THUMB2-NEXT: bxne lr 1209; THUMB2-NEXT: .LBB44_1: @ %true_br 1210; THUMB2-NEXT: push {r7, lr} 1211; THUMB2-NEXT: bl consume 1212; THUMB2-NEXT: pop.w {r7, lr} 1213; THUMB2-NEXT: bx lr 1214 %or = or i32 %a, %b 1215 %cmp = icmp eq i32 %or, 0 1216 br i1 %cmp, label %true_br, label %exit 1217true_br: 1218 call void @consume(i32 %a) 1219 br label %exit 1220exit: 1221 ret void 1222} 1223 1224define void @br_on_binop_ne_zero(i32 %a, i32 %b) { 1225; ARM-LABEL: br_on_binop_ne_zero: 1226; ARM: @ %bb.0: 1227; ARM-NEXT: orrs r1, r0, r1 1228; ARM-NEXT: bxeq lr 1229; ARM-NEXT: .LBB45_1: @ %true_br 1230; ARM-NEXT: push {r11, lr} 1231; ARM-NEXT: bl consume 1232; ARM-NEXT: pop {r11, lr} 1233; ARM-NEXT: bx lr 1234; 1235; THUMB-LABEL: br_on_binop_ne_zero: 1236; THUMB: @ %bb.0: 1237; THUMB-NEXT: push {r7, lr} 1238; THUMB-NEXT: orrs r1, r0 1239; THUMB-NEXT: beq .LBB45_2 1240; THUMB-NEXT: @ %bb.1: @ %true_br 1241; THUMB-NEXT: bl consume 1242; THUMB-NEXT: .LBB45_2: @ %exit 1243; THUMB-NEXT: pop {r7, pc} 1244; 1245; THUMB2-LABEL: br_on_binop_ne_zero: 1246; THUMB2: @ %bb.0: 1247; THUMB2-NEXT: orrs r1, r0 1248; THUMB2-NEXT: it eq 1249; THUMB2-NEXT: bxeq lr 1250; THUMB2-NEXT: .LBB45_1: @ %true_br 1251; THUMB2-NEXT: push {r7, lr} 1252; THUMB2-NEXT: bl consume 1253; THUMB2-NEXT: pop.w {r7, lr} 1254; THUMB2-NEXT: bx lr 1255 %or = or i32 %a, %b 1256 %cmp = icmp ne i32 %or, 0 1257 br i1 %cmp, label %true_br, label %exit 1258true_br: 1259 call void @consume(i32 %a) 1260 br label %exit 1261exit: 1262 ret void 1263} 1264 1265define void @br_on_binop_lt_zero(i32 %a, i32 %b) { 1266; ARM-LABEL: br_on_binop_lt_zero: 1267; ARM: @ %bb.0: 1268; ARM-NEXT: orr r1, r0, r1 1269; ARM-NEXT: cmp r1, #0 1270; ARM-NEXT: bxhs lr 1271; ARM-NEXT: .LBB46_1: @ %true_br 1272; ARM-NEXT: push {r11, lr} 1273; ARM-NEXT: bl consume 1274; ARM-NEXT: pop {r11, lr} 1275; ARM-NEXT: bx lr 1276; 1277; THUMB-LABEL: br_on_binop_lt_zero: 1278; THUMB: @ %bb.0: 1279; THUMB-NEXT: push {r7, lr} 1280; THUMB-NEXT: orrs r1, r0 1281; THUMB-NEXT: cmp r1, #0 1282; THUMB-NEXT: bhs .LBB46_2 1283; THUMB-NEXT: @ %bb.1: @ %true_br 1284; THUMB-NEXT: bl consume 1285; THUMB-NEXT: .LBB46_2: @ %exit 1286; THUMB-NEXT: pop {r7, pc} 1287; 1288; THUMB2-LABEL: br_on_binop_lt_zero: 1289; THUMB2: @ %bb.0: 1290; THUMB2-NEXT: orrs r1, r0 1291; THUMB2-NEXT: cmp r1, #0 1292; THUMB2-NEXT: it hs 1293; THUMB2-NEXT: bxhs lr 1294; THUMB2-NEXT: .LBB46_1: @ %true_br 1295; THUMB2-NEXT: push {r7, lr} 1296; THUMB2-NEXT: bl consume 1297; THUMB2-NEXT: pop.w {r7, lr} 1298; THUMB2-NEXT: bx lr 1299 %or = or i32 %a, %b 1300 %cmp = icmp ult i32 %or, 0 1301 br i1 %cmp, label %true_br, label %exit 1302true_br: 1303 call void @consume(i32 %a) 1304 br label %exit 1305exit: 1306 ret void 1307} 1308 1309define void @br_on_binop_eq_imm(i32 %a, i32 %b) { 1310; ARM-LABEL: br_on_binop_eq_imm: 1311; ARM: @ %bb.0: 1312; ARM-NEXT: orr r1, r0, r1 1313; ARM-NEXT: cmp r1, #42 1314; ARM-NEXT: bxne lr 1315; ARM-NEXT: .LBB47_1: @ %true_br 1316; ARM-NEXT: push {r11, lr} 1317; ARM-NEXT: bl consume 1318; ARM-NEXT: pop {r11, lr} 1319; ARM-NEXT: bx lr 1320; 1321; THUMB-LABEL: br_on_binop_eq_imm: 1322; THUMB: @ %bb.0: 1323; THUMB-NEXT: push {r7, lr} 1324; THUMB-NEXT: orrs r1, r0 1325; THUMB-NEXT: cmp r1, #42 1326; THUMB-NEXT: bne .LBB47_2 1327; THUMB-NEXT: @ %bb.1: @ %true_br 1328; THUMB-NEXT: bl consume 1329; THUMB-NEXT: .LBB47_2: @ %exit 1330; THUMB-NEXT: pop {r7, pc} 1331; 1332; THUMB2-LABEL: br_on_binop_eq_imm: 1333; THUMB2: @ %bb.0: 1334; THUMB2-NEXT: orrs r1, r0 1335; THUMB2-NEXT: cmp r1, #42 1336; THUMB2-NEXT: it ne 1337; THUMB2-NEXT: bxne lr 1338; THUMB2-NEXT: .LBB47_1: @ %true_br 1339; THUMB2-NEXT: push {r7, lr} 1340; THUMB2-NEXT: bl consume 1341; THUMB2-NEXT: pop.w {r7, lr} 1342; THUMB2-NEXT: bx lr 1343 %or = or i32 %a, %b 1344 %cmp = icmp eq i32 %or, 42 1345 br i1 %cmp, label %true_br, label %exit 1346true_br: 1347 call void @consume(i32 %a) 1348 br label %exit 1349exit: 1350 ret void 1351} 1352 1353define void @br_on_binop_ne_imm(i32 %a, i32 %b) { 1354; ARM-LABEL: br_on_binop_ne_imm: 1355; ARM: @ %bb.0: 1356; ARM-NEXT: orr r1, r0, r1 1357; ARM-NEXT: cmp r1, #42 1358; ARM-NEXT: bxeq lr 1359; ARM-NEXT: .LBB48_1: @ %true_br 1360; ARM-NEXT: push {r11, lr} 1361; ARM-NEXT: bl consume 1362; ARM-NEXT: pop {r11, lr} 1363; ARM-NEXT: bx lr 1364; 1365; THUMB-LABEL: br_on_binop_ne_imm: 1366; THUMB: @ %bb.0: 1367; THUMB-NEXT: push {r7, lr} 1368; THUMB-NEXT: orrs r1, r0 1369; THUMB-NEXT: cmp r1, #42 1370; THUMB-NEXT: beq .LBB48_2 1371; THUMB-NEXT: @ %bb.1: @ %true_br 1372; THUMB-NEXT: bl consume 1373; THUMB-NEXT: .LBB48_2: @ %exit 1374; THUMB-NEXT: pop {r7, pc} 1375; 1376; THUMB2-LABEL: br_on_binop_ne_imm: 1377; THUMB2: @ %bb.0: 1378; THUMB2-NEXT: orrs r1, r0 1379; THUMB2-NEXT: cmp r1, #42 1380; THUMB2-NEXT: it eq 1381; THUMB2-NEXT: bxeq lr 1382; THUMB2-NEXT: .LBB48_1: @ %true_br 1383; THUMB2-NEXT: push {r7, lr} 1384; THUMB2-NEXT: bl consume 1385; THUMB2-NEXT: pop.w {r7, lr} 1386; THUMB2-NEXT: bx lr 1387 %or = or i32 %a, %b 1388 %cmp = icmp ne i32 %or, 42 1389 br i1 %cmp, label %true_br, label %exit 1390true_br: 1391 call void @consume(i32 %a) 1392 br label %exit 1393exit: 1394 ret void 1395} 1396 1397define void @br_on_binop_eq_reg(i32 %a, i32 %b, i32 %c) { 1398; ARM-LABEL: br_on_binop_eq_reg: 1399; ARM: @ %bb.0: 1400; ARM-NEXT: eor r1, r0, r1 1401; ARM-NEXT: cmp r1, r2 1402; ARM-NEXT: bxne lr 1403; ARM-NEXT: .LBB49_1: @ %true_br 1404; ARM-NEXT: push {r11, lr} 1405; ARM-NEXT: bl consume 1406; ARM-NEXT: pop {r11, lr} 1407; ARM-NEXT: bx lr 1408; 1409; THUMB-LABEL: br_on_binop_eq_reg: 1410; THUMB: @ %bb.0: 1411; THUMB-NEXT: push {r7, lr} 1412; THUMB-NEXT: eors r1, r0 1413; THUMB-NEXT: cmp r1, r2 1414; THUMB-NEXT: bne .LBB49_2 1415; THUMB-NEXT: @ %bb.1: @ %true_br 1416; THUMB-NEXT: bl consume 1417; THUMB-NEXT: .LBB49_2: @ %exit 1418; THUMB-NEXT: pop {r7, pc} 1419; 1420; THUMB2-LABEL: br_on_binop_eq_reg: 1421; THUMB2: @ %bb.0: 1422; THUMB2-NEXT: eors r1, r0 1423; THUMB2-NEXT: cmp r1, r2 1424; THUMB2-NEXT: it ne 1425; THUMB2-NEXT: bxne lr 1426; THUMB2-NEXT: .LBB49_1: @ %true_br 1427; THUMB2-NEXT: push {r7, lr} 1428; THUMB2-NEXT: bl consume 1429; THUMB2-NEXT: pop.w {r7, lr} 1430; THUMB2-NEXT: bx lr 1431 %xor = xor i32 %a, %b 1432 %cmp = icmp eq i32 %xor, %c 1433 br i1 %cmp, label %true_br, label %exit 1434true_br: 1435 call void @consume(i32 %a) 1436 br label %exit 1437exit: 1438 ret void 1439} 1440 1441define void @br_on_binop_ne_reg(i32 %a, i32 %b, i32 %c) { 1442; ARM-LABEL: br_on_binop_ne_reg: 1443; ARM: @ %bb.0: 1444; ARM-NEXT: and r1, r0, r1 1445; ARM-NEXT: cmp r1, r2 1446; ARM-NEXT: bxeq lr 1447; ARM-NEXT: .LBB50_1: @ %true_br 1448; ARM-NEXT: push {r11, lr} 1449; ARM-NEXT: bl consume 1450; ARM-NEXT: pop {r11, lr} 1451; ARM-NEXT: bx lr 1452; 1453; THUMB-LABEL: br_on_binop_ne_reg: 1454; THUMB: @ %bb.0: 1455; THUMB-NEXT: push {r7, lr} 1456; THUMB-NEXT: ands r1, r0 1457; THUMB-NEXT: cmp r1, r2 1458; THUMB-NEXT: beq .LBB50_2 1459; THUMB-NEXT: @ %bb.1: @ %true_br 1460; THUMB-NEXT: bl consume 1461; THUMB-NEXT: .LBB50_2: @ %exit 1462; THUMB-NEXT: pop {r7, pc} 1463; 1464; THUMB2-LABEL: br_on_binop_ne_reg: 1465; THUMB2: @ %bb.0: 1466; THUMB2-NEXT: ands r1, r0 1467; THUMB2-NEXT: cmp r1, r2 1468; THUMB2-NEXT: it eq 1469; THUMB2-NEXT: bxeq lr 1470; THUMB2-NEXT: .LBB50_1: @ %true_br 1471; THUMB2-NEXT: push {r7, lr} 1472; THUMB2-NEXT: bl consume 1473; THUMB2-NEXT: pop.w {r7, lr} 1474; THUMB2-NEXT: bx lr 1475 %and = and i32 %a, %b 1476 %cmp = icmp ne i32 %and, %c 1477 br i1 %cmp, label %true_br, label %exit 1478true_br: 1479 call void @consume(i32 %a) 1480 br label %exit 1481exit: 1482 ret void 1483} 1484 1485define void @br_on_shift_eq_zero(i32 %a, i32 %b) { 1486; ARM-LABEL: br_on_shift_eq_zero: 1487; ARM: @ %bb.0: 1488; ARM-NEXT: lsls r1, r0, r1 1489; ARM-NEXT: bxne lr 1490; ARM-NEXT: .LBB51_1: @ %true_br 1491; ARM-NEXT: push {r11, lr} 1492; ARM-NEXT: bl consume 1493; ARM-NEXT: pop {r11, lr} 1494; ARM-NEXT: bx lr 1495; 1496; THUMB-LABEL: br_on_shift_eq_zero: 1497; THUMB: @ %bb.0: 1498; THUMB-NEXT: push {r7, lr} 1499; THUMB-NEXT: mov r2, r0 1500; THUMB-NEXT: lsls r2, r1 1501; THUMB-NEXT: beq .LBB51_2 1502; THUMB-NEXT: @ %bb.1: @ %exit 1503; THUMB-NEXT: pop {r7, pc} 1504; THUMB-NEXT: .LBB51_2: @ %true_br 1505; THUMB-NEXT: bl consume 1506; THUMB-NEXT: pop {r7, pc} 1507; 1508; THUMB2-LABEL: br_on_shift_eq_zero: 1509; THUMB2: @ %bb.0: 1510; THUMB2-NEXT: lsls.w r1, r0, r1 1511; THUMB2-NEXT: it ne 1512; THUMB2-NEXT: bxne lr 1513; THUMB2-NEXT: .LBB51_1: @ %true_br 1514; THUMB2-NEXT: push {r7, lr} 1515; THUMB2-NEXT: bl consume 1516; THUMB2-NEXT: pop.w {r7, lr} 1517; THUMB2-NEXT: bx lr 1518 %sh = shl i32 %a, %b 1519 %cmp = icmp eq i32 %sh, 0 1520 br i1 %cmp, label %true_br, label %exit 1521true_br: 1522 call void @consume(i32 %a) 1523 br label %exit 1524exit: 1525 ret void 1526} 1527 1528define void @br_on_shift_ne_zero(i32 %a, i32 %b) { 1529; ARM-LABEL: br_on_shift_ne_zero: 1530; ARM: @ %bb.0: 1531; ARM-NEXT: lsrs r1, r0, r1 1532; ARM-NEXT: bxeq lr 1533; ARM-NEXT: .LBB52_1: @ %true_br 1534; ARM-NEXT: push {r11, lr} 1535; ARM-NEXT: bl consume 1536; ARM-NEXT: pop {r11, lr} 1537; ARM-NEXT: bx lr 1538; 1539; THUMB-LABEL: br_on_shift_ne_zero: 1540; THUMB: @ %bb.0: 1541; THUMB-NEXT: push {r7, lr} 1542; THUMB-NEXT: mov r2, r0 1543; THUMB-NEXT: lsrs r2, r1 1544; THUMB-NEXT: beq .LBB52_2 1545; THUMB-NEXT: @ %bb.1: @ %true_br 1546; THUMB-NEXT: bl consume 1547; THUMB-NEXT: .LBB52_2: @ %exit 1548; THUMB-NEXT: pop {r7, pc} 1549; 1550; THUMB2-LABEL: br_on_shift_ne_zero: 1551; THUMB2: @ %bb.0: 1552; THUMB2-NEXT: lsrs.w r1, r0, r1 1553; THUMB2-NEXT: it eq 1554; THUMB2-NEXT: bxeq lr 1555; THUMB2-NEXT: .LBB52_1: @ %true_br 1556; THUMB2-NEXT: push {r7, lr} 1557; THUMB2-NEXT: bl consume 1558; THUMB2-NEXT: pop.w {r7, lr} 1559; THUMB2-NEXT: bx lr 1560 %sh = lshr i32 %a, %b 1561 %cmp = icmp ne i32 %sh, 0 1562 br i1 %cmp, label %true_br, label %exit 1563true_br: 1564 call void @consume(i32 %a) 1565 br label %exit 1566exit: 1567 ret void 1568} 1569 1570define void @br_on_shift_lt_zero(i32 %a, i32 %b) { 1571; ARM-LABEL: br_on_shift_lt_zero: 1572; ARM: @ %bb.0: 1573; ARM-NEXT: asr r1, r0, r1 1574; ARM-NEXT: cmp r1, #0 1575; ARM-NEXT: bxhs lr 1576; ARM-NEXT: .LBB53_1: @ %true_br 1577; ARM-NEXT: push {r11, lr} 1578; ARM-NEXT: bl consume 1579; ARM-NEXT: pop {r11, lr} 1580; ARM-NEXT: bx lr 1581; 1582; THUMB-LABEL: br_on_shift_lt_zero: 1583; THUMB: @ %bb.0: 1584; THUMB-NEXT: push {r7, lr} 1585; THUMB-NEXT: mov r2, r0 1586; THUMB-NEXT: asrs r2, r1 1587; THUMB-NEXT: cmp r2, #0 1588; THUMB-NEXT: bhs .LBB53_2 1589; THUMB-NEXT: @ %bb.1: @ %true_br 1590; THUMB-NEXT: bl consume 1591; THUMB-NEXT: .LBB53_2: @ %exit 1592; THUMB-NEXT: pop {r7, pc} 1593; 1594; THUMB2-LABEL: br_on_shift_lt_zero: 1595; THUMB2: @ %bb.0: 1596; THUMB2-NEXT: asr.w r1, r0, r1 1597; THUMB2-NEXT: cmp r1, #0 1598; THUMB2-NEXT: it hs 1599; THUMB2-NEXT: bxhs lr 1600; THUMB2-NEXT: .LBB53_1: @ %true_br 1601; THUMB2-NEXT: push {r7, lr} 1602; THUMB2-NEXT: bl consume 1603; THUMB2-NEXT: pop.w {r7, lr} 1604; THUMB2-NEXT: bx lr 1605 %sh = ashr i32 %a, %b 1606 %cmp = icmp ult i32 %sh, 0 1607 br i1 %cmp, label %true_br, label %exit 1608true_br: 1609 call void @consume(i32 %a) 1610 br label %exit 1611exit: 1612 ret void 1613} 1614 1615define void @br_on_shift_eq_imm(i32 %a, i32 %b) { 1616; ARM-LABEL: br_on_shift_eq_imm: 1617; ARM: @ %bb.0: 1618; ARM-NEXT: mov r2, #42 1619; ARM-NEXT: cmp r2, r0, lsl r1 1620; ARM-NEXT: bxne lr 1621; ARM-NEXT: .LBB54_1: @ %true_br 1622; ARM-NEXT: push {r11, lr} 1623; ARM-NEXT: bl consume 1624; ARM-NEXT: pop {r11, lr} 1625; ARM-NEXT: bx lr 1626; 1627; THUMB-LABEL: br_on_shift_eq_imm: 1628; THUMB: @ %bb.0: 1629; THUMB-NEXT: push {r7, lr} 1630; THUMB-NEXT: mov r2, r0 1631; THUMB-NEXT: lsls r2, r1 1632; THUMB-NEXT: cmp r2, #42 1633; THUMB-NEXT: bne .LBB54_2 1634; THUMB-NEXT: @ %bb.1: @ %true_br 1635; THUMB-NEXT: bl consume 1636; THUMB-NEXT: .LBB54_2: @ %exit 1637; THUMB-NEXT: pop {r7, pc} 1638; 1639; THUMB2-LABEL: br_on_shift_eq_imm: 1640; THUMB2: @ %bb.0: 1641; THUMB2-NEXT: lsl.w r1, r0, r1 1642; THUMB2-NEXT: cmp r1, #42 1643; THUMB2-NEXT: it ne 1644; THUMB2-NEXT: bxne lr 1645; THUMB2-NEXT: .LBB54_1: @ %true_br 1646; THUMB2-NEXT: push {r7, lr} 1647; THUMB2-NEXT: bl consume 1648; THUMB2-NEXT: pop.w {r7, lr} 1649; THUMB2-NEXT: bx lr 1650 %sh = shl i32 %a, %b 1651 %cmp = icmp eq i32 %sh, 42 1652 br i1 %cmp, label %true_br, label %exit 1653true_br: 1654 call void @consume(i32 %a) 1655 br label %exit 1656exit: 1657 ret void 1658} 1659 1660define void @br_on_shift_ne_imm(i32 %a, i32 %b) { 1661; ARM-LABEL: br_on_shift_ne_imm: 1662; ARM: @ %bb.0: 1663; ARM-NEXT: mov r2, #42 1664; ARM-NEXT: cmp r2, r0, lsr r1 1665; ARM-NEXT: bxeq lr 1666; ARM-NEXT: .LBB55_1: @ %true_br 1667; ARM-NEXT: push {r11, lr} 1668; ARM-NEXT: bl consume 1669; ARM-NEXT: pop {r11, lr} 1670; ARM-NEXT: bx lr 1671; 1672; THUMB-LABEL: br_on_shift_ne_imm: 1673; THUMB: @ %bb.0: 1674; THUMB-NEXT: push {r7, lr} 1675; THUMB-NEXT: mov r2, r0 1676; THUMB-NEXT: lsrs r2, r1 1677; THUMB-NEXT: cmp r2, #42 1678; THUMB-NEXT: beq .LBB55_2 1679; THUMB-NEXT: @ %bb.1: @ %true_br 1680; THUMB-NEXT: bl consume 1681; THUMB-NEXT: .LBB55_2: @ %exit 1682; THUMB-NEXT: pop {r7, pc} 1683; 1684; THUMB2-LABEL: br_on_shift_ne_imm: 1685; THUMB2: @ %bb.0: 1686; THUMB2-NEXT: lsr.w r1, r0, r1 1687; THUMB2-NEXT: cmp r1, #42 1688; THUMB2-NEXT: it eq 1689; THUMB2-NEXT: bxeq lr 1690; THUMB2-NEXT: .LBB55_1: @ %true_br 1691; THUMB2-NEXT: push {r7, lr} 1692; THUMB2-NEXT: bl consume 1693; THUMB2-NEXT: pop.w {r7, lr} 1694; THUMB2-NEXT: bx lr 1695 %sh = lshr i32 %a, %b 1696 %cmp = icmp ne i32 %sh, 42 1697 br i1 %cmp, label %true_br, label %exit 1698true_br: 1699 call void @consume(i32 %a) 1700 br label %exit 1701exit: 1702 ret void 1703} 1704 1705define void @br_on_shift_eq_reg(i32 %a, i32 %b, i32 %c) { 1706; ARM-LABEL: br_on_shift_eq_reg: 1707; ARM: @ %bb.0: 1708; ARM-NEXT: cmp r2, r0, asr r1 1709; ARM-NEXT: bxne lr 1710; ARM-NEXT: .LBB56_1: @ %true_br 1711; ARM-NEXT: push {r11, lr} 1712; ARM-NEXT: bl consume 1713; ARM-NEXT: pop {r11, lr} 1714; ARM-NEXT: bx lr 1715; 1716; THUMB-LABEL: br_on_shift_eq_reg: 1717; THUMB: @ %bb.0: 1718; THUMB-NEXT: push {r7, lr} 1719; THUMB-NEXT: mov r3, r0 1720; THUMB-NEXT: asrs r3, r1 1721; THUMB-NEXT: cmp r2, r3 1722; THUMB-NEXT: bne .LBB56_2 1723; THUMB-NEXT: @ %bb.1: @ %true_br 1724; THUMB-NEXT: bl consume 1725; THUMB-NEXT: .LBB56_2: @ %exit 1726; THUMB-NEXT: pop {r7, pc} 1727; 1728; THUMB2-LABEL: br_on_shift_eq_reg: 1729; THUMB2: @ %bb.0: 1730; THUMB2-NEXT: asr.w r1, r0, r1 1731; THUMB2-NEXT: cmp r2, r1 1732; THUMB2-NEXT: it ne 1733; THUMB2-NEXT: bxne lr 1734; THUMB2-NEXT: .LBB56_1: @ %true_br 1735; THUMB2-NEXT: push {r7, lr} 1736; THUMB2-NEXT: bl consume 1737; THUMB2-NEXT: pop.w {r7, lr} 1738; THUMB2-NEXT: bx lr 1739 %sh = ashr i32 %a, %b 1740 %cmp = icmp eq i32 %sh, %c 1741 br i1 %cmp, label %true_br, label %exit 1742true_br: 1743 call void @consume(i32 %a) 1744 br label %exit 1745exit: 1746 ret void 1747} 1748 1749define void @br_on_shift_ne_reg(i32 %a, i32 %b, i32 %c) { 1750; ARM-LABEL: br_on_shift_ne_reg: 1751; ARM: @ %bb.0: 1752; ARM-NEXT: cmp r2, r0, lsl r1 1753; ARM-NEXT: bxeq lr 1754; ARM-NEXT: .LBB57_1: @ %true_br 1755; ARM-NEXT: push {r11, lr} 1756; ARM-NEXT: bl consume 1757; ARM-NEXT: pop {r11, lr} 1758; ARM-NEXT: bx lr 1759; 1760; THUMB-LABEL: br_on_shift_ne_reg: 1761; THUMB: @ %bb.0: 1762; THUMB-NEXT: push {r7, lr} 1763; THUMB-NEXT: mov r3, r0 1764; THUMB-NEXT: lsls r3, r1 1765; THUMB-NEXT: cmp r2, r3 1766; THUMB-NEXT: beq .LBB57_2 1767; THUMB-NEXT: @ %bb.1: @ %true_br 1768; THUMB-NEXT: bl consume 1769; THUMB-NEXT: .LBB57_2: @ %exit 1770; THUMB-NEXT: pop {r7, pc} 1771; 1772; THUMB2-LABEL: br_on_shift_ne_reg: 1773; THUMB2: @ %bb.0: 1774; THUMB2-NEXT: lsl.w r1, r0, r1 1775; THUMB2-NEXT: cmp r2, r1 1776; THUMB2-NEXT: it eq 1777; THUMB2-NEXT: bxeq lr 1778; THUMB2-NEXT: .LBB57_1: @ %true_br 1779; THUMB2-NEXT: push {r7, lr} 1780; THUMB2-NEXT: bl consume 1781; THUMB2-NEXT: pop.w {r7, lr} 1782; THUMB2-NEXT: bx lr 1783 %sh = shl i32 %a, %b 1784 %cmp = icmp ne i32 %sh, %c 1785 br i1 %cmp, label %true_br, label %exit 1786true_br: 1787 call void @consume(i32 %a) 1788 br label %exit 1789exit: 1790 ret void 1791} 1792