1792 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=armv7a < %s | FileCheck %s --check-prefix=ARM3; RUN: llc -mtriple=armv6m < %s | FileCheck %s --check-prefix=THUMB4; RUN: llc -mtriple=armv7m < %s | FileCheck %s --check-prefix=THUMB25 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, r110; ARM-NEXT: movwne r0, #111; ARM-NEXT: bx lr12;13; THUMB-LABEL: cmp_ne_zero_and_rr:14; THUMB: @ %bb.0:15; THUMB-NEXT: ands r0, r116; THUMB-NEXT: subs r1, r0, #117; THUMB-NEXT: sbcs r0, r118; THUMB-NEXT: bx lr19;20; THUMB2-LABEL: cmp_ne_zero_and_rr:21; THUMB2: @ %bb.0:22; THUMB2-NEXT: ands r0, r123; THUMB2-NEXT: it ne24; THUMB2-NEXT: movne r0, #125; THUMB2-NEXT: bx lr26 %and = and i32 %a, %b27 %res = icmp ne i32 %and, 028 ret i1 %res29}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, #4235; ARM-NEXT: movwne r0, #136; ARM-NEXT: bx lr37;38; THUMB-LABEL: cmp_ne_zero_and_ri:39; THUMB: @ %bb.0:40; THUMB-NEXT: movs r1, #4241; THUMB-NEXT: ands r0, r142; THUMB-NEXT: subs r1, r0, #143; THUMB-NEXT: sbcs r0, r144; THUMB-NEXT: bx lr45;46; THUMB2-LABEL: cmp_ne_zero_and_ri:47; THUMB2: @ %bb.0:48; THUMB2-NEXT: ands r0, r0, #4249; THUMB2-NEXT: it ne50; THUMB2-NEXT: movne r0, #151; THUMB2-NEXT: bx lr52 %and = and i32 %a, 4253 %res = icmp ne i32 %and, 054 ret i1 %res55}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 r261; ARM-NEXT: movwne r0, #162; ARM-NEXT: bx lr63;64; THUMB-LABEL: cmp_ne_zero_and_rsr:65; THUMB: @ %bb.0:66; THUMB-NEXT: lsls r1, r267; THUMB-NEXT: ands r0, r168; THUMB-NEXT: subs r1, r0, #169; THUMB-NEXT: sbcs r0, r170; THUMB-NEXT: bx lr71;72; THUMB2-LABEL: cmp_ne_zero_and_rsr:73; THUMB2: @ %bb.0:74; THUMB2-NEXT: lsls r1, r275; THUMB2-NEXT: ands r0, r176; THUMB2-NEXT: it ne77; THUMB2-NEXT: movne r0, #178; THUMB2-NEXT: bx lr79 %sh = shl i32 %b, %c80 %and = and i32 %sh, %a81 %res = icmp ne i32 %and, 082 ret i1 %res83}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 #1789; ARM-NEXT: movwne r0, #190; ARM-NEXT: bx lr91;92; THUMB-LABEL: cmp_ne_zero_and_rsi:93; THUMB: @ %bb.0:94; THUMB-NEXT: lsrs r1, r1, #1795; THUMB-NEXT: ands r0, r196; THUMB-NEXT: subs r1, r0, #197; THUMB-NEXT: sbcs r0, r198; THUMB-NEXT: bx lr99;100; THUMB2-LABEL: cmp_ne_zero_and_rsi:101; THUMB2: @ %bb.0:102; THUMB2-NEXT: ands.w r0, r0, r1, lsr #17103; THUMB2-NEXT: it ne104; THUMB2-NEXT: movne r0, #1105; THUMB2-NEXT: bx lr106 %sh = lshr i32 %b, 17107 %and = and i32 %sh, %a108 %res = icmp ne i32 %and, 0109 ret i1 %res110}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, r1116; ARM-NEXT: movwne r0, #1117; ARM-NEXT: bx lr118;119; THUMB-LABEL: cmp_ne_zero_or_rr:120; THUMB: @ %bb.0:121; THUMB-NEXT: orrs r0, r1122; THUMB-NEXT: subs r1, r0, #1123; THUMB-NEXT: sbcs r0, r1124; THUMB-NEXT: bx lr125;126; THUMB2-LABEL: cmp_ne_zero_or_rr:127; THUMB2: @ %bb.0:128; THUMB2-NEXT: orrs r0, r1129; THUMB2-NEXT: it ne130; THUMB2-NEXT: movne r0, #1131; THUMB2-NEXT: bx lr132 %or = or i32 %a, %b133 %res = icmp ne i32 %or, 0134 ret i1 %res135}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, #42141; ARM-NEXT: movwne r0, #1142; ARM-NEXT: bx lr143;144; THUMB-LABEL: cmp_ne_zero_or_ri:145; THUMB: @ %bb.0:146; THUMB-NEXT: movs r1, #42147; THUMB-NEXT: orrs r0, r1148; THUMB-NEXT: subs r1, r0, #1149; THUMB-NEXT: sbcs r0, r1150; THUMB-NEXT: bx lr151;152; THUMB2-LABEL: cmp_ne_zero_or_ri:153; THUMB2: @ %bb.0:154; THUMB2-NEXT: orrs r0, r0, #42155; THUMB2-NEXT: it ne156; THUMB2-NEXT: movne r0, #1157; THUMB2-NEXT: bx lr158 %or = or i32 %a, 42159 %res = icmp ne i32 %or, 0160 ret i1 %res161}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 r2167; ARM-NEXT: movwne r0, #1168; ARM-NEXT: bx lr169;170; THUMB-LABEL: cmp_ne_zero_or_rsr:171; THUMB: @ %bb.0:172; THUMB-NEXT: lsls r1, r2173; THUMB-NEXT: orrs r0, r1174; THUMB-NEXT: subs r1, r0, #1175; THUMB-NEXT: sbcs r0, r1176; THUMB-NEXT: bx lr177;178; THUMB2-LABEL: cmp_ne_zero_or_rsr:179; THUMB2: @ %bb.0:180; THUMB2-NEXT: lsls r1, r2181; THUMB2-NEXT: orrs r0, r1182; THUMB2-NEXT: it ne183; THUMB2-NEXT: movne r0, #1184; THUMB2-NEXT: bx lr185 %sh = shl i32 %b, %c186 %or = or i32 %sh, %a187 %res = icmp ne i32 %or, 0188 ret i1 %res189}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 #17195; ARM-NEXT: movwne r0, #1196; ARM-NEXT: bx lr197;198; THUMB-LABEL: cmp_ne_zero_or_rsi:199; THUMB: @ %bb.0:200; THUMB-NEXT: lsrs r1, r1, #17201; THUMB-NEXT: orrs r0, r1202; THUMB-NEXT: subs r1, r0, #1203; THUMB-NEXT: sbcs r0, r1204; THUMB-NEXT: bx lr205;206; THUMB2-LABEL: cmp_ne_zero_or_rsi:207; THUMB2: @ %bb.0:208; THUMB2-NEXT: orrs.w r0, r0, r1, lsr #17209; THUMB2-NEXT: it ne210; THUMB2-NEXT: movne r0, #1211; THUMB2-NEXT: bx lr212 %sh = lshr i32 %b, 17213 %or = or i32 %sh, %a214 %res = icmp ne i32 %or, 0215 ret i1 %res216}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, r1222; ARM-NEXT: movwne r0, #1223; ARM-NEXT: bx lr224;225; THUMB-LABEL: cmp_ne_zero_xor_rr:226; THUMB: @ %bb.0:227; THUMB-NEXT: eors r0, r1228; THUMB-NEXT: subs r1, r0, #1229; THUMB-NEXT: sbcs r0, r1230; THUMB-NEXT: bx lr231;232; THUMB2-LABEL: cmp_ne_zero_xor_rr:233; THUMB2: @ %bb.0:234; THUMB2-NEXT: eors r0, r1235; THUMB2-NEXT: it ne236; THUMB2-NEXT: movne r0, #1237; THUMB2-NEXT: bx lr238 %xor = xor i32 %a, %b239 %res = icmp ne i32 %xor, 0240 ret i1 %res241}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, #42247; ARM-NEXT: movwne r0, #1248; ARM-NEXT: bx lr249;250; THUMB-LABEL: cmp_ne_zero_xor_ri:251; THUMB: @ %bb.0:252; THUMB-NEXT: subs r0, #42253; THUMB-NEXT: subs r1, r0, #1254; THUMB-NEXT: sbcs r0, r1255; THUMB-NEXT: bx lr256;257; THUMB2-LABEL: cmp_ne_zero_xor_ri:258; THUMB2: @ %bb.0:259; THUMB2-NEXT: subs r0, #42260; THUMB2-NEXT: it ne261; THUMB2-NEXT: movne r0, #1262; THUMB2-NEXT: bx lr263 %xor = xor i32 %a, 42264 %res = icmp ne i32 %xor, 0265 ret i1 %res266}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 r2272; ARM-NEXT: movwne r0, #1273; ARM-NEXT: bx lr274;275; THUMB-LABEL: cmp_ne_zero_xor_rsr:276; THUMB: @ %bb.0:277; THUMB-NEXT: lsls r1, r2278; THUMB-NEXT: eors r0, r1279; THUMB-NEXT: subs r1, r0, #1280; THUMB-NEXT: sbcs r0, r1281; THUMB-NEXT: bx lr282;283; THUMB2-LABEL: cmp_ne_zero_xor_rsr:284; THUMB2: @ %bb.0:285; THUMB2-NEXT: lsls r1, r2286; THUMB2-NEXT: eors r0, r1287; THUMB2-NEXT: it ne288; THUMB2-NEXT: movne r0, #1289; THUMB2-NEXT: bx lr290 %sh = shl i32 %b, %c291 %xor = xor i32 %sh, %a292 %res = icmp ne i32 %xor, 0293 ret i1 %res294}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 #17300; ARM-NEXT: movwne r0, #1301; ARM-NEXT: bx lr302;303; THUMB-LABEL: cmp_ne_zero_xor_rsi:304; THUMB: @ %bb.0:305; THUMB-NEXT: lsrs r1, r1, #17306; THUMB-NEXT: eors r0, r1307; THUMB-NEXT: subs r1, r0, #1308; THUMB-NEXT: sbcs r0, r1309; THUMB-NEXT: bx lr310;311; THUMB2-LABEL: cmp_ne_zero_xor_rsi:312; THUMB2: @ %bb.0:313; THUMB2-NEXT: eors.w r0, r0, r1, lsr #17314; THUMB2-NEXT: it ne315; THUMB2-NEXT: movne r0, #1316; THUMB2-NEXT: bx lr317 %sh = lshr i32 %b, 17318 %xor = xor i32 %sh, %a319 %res = icmp ne i32 %xor, 0320 ret i1 %res321}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, r1327; ARM-NEXT: movwne r0, #1328; ARM-NEXT: bx lr329;330; THUMB-LABEL: cmp_ne_zero_and_not_rr:331; THUMB: @ %bb.0:332; THUMB-NEXT: bics r0, r1333; THUMB-NEXT: subs r1, r0, #1334; THUMB-NEXT: sbcs r0, r1335; THUMB-NEXT: bx lr336;337; THUMB2-LABEL: cmp_ne_zero_and_not_rr:338; THUMB2: @ %bb.0:339; THUMB2-NEXT: bics r0, r1340; THUMB2-NEXT: it ne341; THUMB2-NEXT: movne r0, #1342; THUMB2-NEXT: bx lr343 %not = xor i32 %b, -1344 %and = and i32 %a, %not345 %res = icmp ne i32 %and, 0346 ret i1 %res347}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, #42353; ARM-NEXT: movwne r0, #1354; ARM-NEXT: bx lr355;356; THUMB-LABEL: cmp_ne_zero_and_not_ri:357; THUMB: @ %bb.0:358; THUMB-NEXT: movs r1, #42359; THUMB-NEXT: bics r0, r1360; THUMB-NEXT: subs r1, r0, #1361; THUMB-NEXT: sbcs r0, r1362; THUMB-NEXT: bx lr363;364; THUMB2-LABEL: cmp_ne_zero_and_not_ri:365; THUMB2: @ %bb.0:366; THUMB2-NEXT: bics r0, r0, #42367; THUMB2-NEXT: it ne368; THUMB2-NEXT: movne r0, #1369; THUMB2-NEXT: bx lr370 %not = xor i32 42, -1371 %and = and i32 %a, %not372 %res = icmp ne i32 %and, 0373 ret i1 %res374}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 r2380; ARM-NEXT: movwne r0, #1381; ARM-NEXT: bx lr382;383; THUMB-LABEL: cmp_ne_zero_and_not_rsr:384; THUMB: @ %bb.0:385; THUMB-NEXT: lsls r1, r2386; THUMB-NEXT: bics r0, r1387; THUMB-NEXT: subs r1, r0, #1388; THUMB-NEXT: sbcs r0, r1389; THUMB-NEXT: bx lr390;391; THUMB2-LABEL: cmp_ne_zero_and_not_rsr:392; THUMB2: @ %bb.0:393; THUMB2-NEXT: lsls r1, r2394; THUMB2-NEXT: bics r0, r1395; THUMB2-NEXT: it ne396; THUMB2-NEXT: movne r0, #1397; THUMB2-NEXT: bx lr398 %sh = shl i32 %b, %c399 %not = xor i32 %sh, -1400 %and = and i32 %not, %a401 %res = icmp ne i32 %and, 0402 ret i1 %res403}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 #17409; ARM-NEXT: movwne r0, #1410; ARM-NEXT: bx lr411;412; THUMB-LABEL: cmp_ne_zero_and_not_rsi:413; THUMB: @ %bb.0:414; THUMB-NEXT: lsrs r1, r1, #17415; THUMB-NEXT: bics r0, r1416; THUMB-NEXT: subs r1, r0, #1417; THUMB-NEXT: sbcs r0, r1418; THUMB-NEXT: bx lr419;420; THUMB2-LABEL: cmp_ne_zero_and_not_rsi:421; THUMB2: @ %bb.0:422; THUMB2-NEXT: bics.w r0, r0, r1, lsr #17423; THUMB2-NEXT: it ne424; THUMB2-NEXT: movne r0, #1425; THUMB2-NEXT: bx lr426 %sh = lshr i32 %b, 17427 %not = xor i32 %sh, -1428 %and = and i32 %not, %a429 %res = icmp ne i32 %and, 0430 ret i1 %res431}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, r1437; ARM-NEXT: movwne r0, #1438; ARM-NEXT: bx lr439;440; THUMB-LABEL: cmp_ne_zero_shl_rr:441; THUMB: @ %bb.0:442; THUMB-NEXT: lsls r0, r1443; THUMB-NEXT: subs r1, r0, #1444; THUMB-NEXT: sbcs r0, r1445; THUMB-NEXT: bx lr446;447; THUMB2-LABEL: cmp_ne_zero_shl_rr:448; THUMB2: @ %bb.0:449; THUMB2-NEXT: lsls r0, r1450; THUMB2-NEXT: it ne451; THUMB2-NEXT: movne r0, #1452; THUMB2-NEXT: bx lr453 %sh = shl i32 %a, %b454 %cmp = icmp ne i32 %sh, 0455 ret i1 %cmp456}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, #7462; ARM-NEXT: movwne r0, #1463; ARM-NEXT: bx lr464;465; THUMB-LABEL: cmp_ne_zero_shl_ri:466; THUMB: @ %bb.0:467; THUMB-NEXT: lsls r0, r0, #7468; THUMB-NEXT: subs r1, r0, #1469; THUMB-NEXT: sbcs r0, r1470; THUMB-NEXT: bx lr471;472; THUMB2-LABEL: cmp_ne_zero_shl_ri:473; THUMB2: @ %bb.0:474; THUMB2-NEXT: lsls r0, r0, #7475; THUMB2-NEXT: it ne476; THUMB2-NEXT: movne r0, #1477; THUMB2-NEXT: bx lr478 %sh = shl i32 %a, 7479 %cmp = icmp ne i32 %sh, 0480 ret i1 %cmp481}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, r1487; ARM-NEXT: movwne r0, #1488; ARM-NEXT: bx lr489;490; THUMB-LABEL: cmp_ne_zero_lshr_rr:491; THUMB: @ %bb.0:492; THUMB-NEXT: lsrs r0, r1493; THUMB-NEXT: subs r1, r0, #1494; THUMB-NEXT: sbcs r0, r1495; THUMB-NEXT: bx lr496;497; THUMB2-LABEL: cmp_ne_zero_lshr_rr:498; THUMB2: @ %bb.0:499; THUMB2-NEXT: lsrs r0, r1500; THUMB2-NEXT: it ne501; THUMB2-NEXT: movne r0, #1502; THUMB2-NEXT: bx lr503 %sh = lshr i32 %a, %b504 %cmp = icmp ne i32 %sh, 0505 ret i1 %cmp506}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, #7512; ARM-NEXT: movwne r0, #1513; ARM-NEXT: bx lr514;515; THUMB-LABEL: cmp_ne_zero_lshr_ri:516; THUMB: @ %bb.0:517; THUMB-NEXT: lsrs r0, r0, #7518; THUMB-NEXT: subs r1, r0, #1519; THUMB-NEXT: sbcs r0, r1520; THUMB-NEXT: bx lr521;522; THUMB2-LABEL: cmp_ne_zero_lshr_ri:523; THUMB2: @ %bb.0:524; THUMB2-NEXT: lsrs r0, r0, #7525; THUMB2-NEXT: it ne526; THUMB2-NEXT: movne r0, #1527; THUMB2-NEXT: bx lr528 %sh = lshr i32 %a, 7529 %cmp = icmp ne i32 %sh, 0530 ret i1 %cmp531}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, r1537; ARM-NEXT: movwne r0, #1538; ARM-NEXT: bx lr539;540; THUMB-LABEL: cmp_ne_zero_ashr_rr:541; THUMB: @ %bb.0:542; THUMB-NEXT: asrs r0, r1543; THUMB-NEXT: subs r1, r0, #1544; THUMB-NEXT: sbcs r0, r1545; THUMB-NEXT: bx lr546;547; THUMB2-LABEL: cmp_ne_zero_ashr_rr:548; THUMB2: @ %bb.0:549; THUMB2-NEXT: asrs r0, r1550; THUMB2-NEXT: cmp r0, #0551; THUMB2-NEXT: it ne552; THUMB2-NEXT: movne r0, #1553; THUMB2-NEXT: bx lr554 %sh = ashr i32 %a, %b555 %cmp = icmp ne i32 %sh, 0556 ret i1 %cmp557}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, #7563; ARM-NEXT: movwne r0, #1564; ARM-NEXT: bx lr565;566; THUMB-LABEL: cmp_ne_zero_ashr_ri:567; THUMB: @ %bb.0:568; THUMB-NEXT: asrs r0, r0, #7569; THUMB-NEXT: subs r1, r0, #1570; THUMB-NEXT: sbcs r0, r1571; THUMB-NEXT: bx lr572;573; THUMB2-LABEL: cmp_ne_zero_ashr_ri:574; THUMB2: @ %bb.0:575; THUMB2-NEXT: asrs r0, r0, #7576; THUMB2-NEXT: cmp r0, #0577; THUMB2-NEXT: it ne578; THUMB2-NEXT: movne r0, #1579; THUMB2-NEXT: bx lr580 %sh = ashr i32 %a, 7581 %cmp = icmp ne i32 %sh, 0582 ret i1 %cmp583}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, r1589; ARM-NEXT: clz r0, r0590; ARM-NEXT: lsr r0, r0, #5591; ARM-NEXT: bx lr592;593; THUMB-LABEL: cmp_eq_zero_and_rr:594; THUMB: @ %bb.0:595; THUMB-NEXT: ands r0, r1596; THUMB-NEXT: rsbs r1, r0, #0597; THUMB-NEXT: adcs r0, r1598; THUMB-NEXT: bx lr599;600; THUMB2-LABEL: cmp_eq_zero_and_rr:601; THUMB2: @ %bb.0:602; THUMB2-NEXT: ands r0, r1603; THUMB2-NEXT: clz r0, r0604; THUMB2-NEXT: lsrs r0, r0, #5605; THUMB2-NEXT: bx lr606 %and = and i32 %a, %b607 %res = icmp eq i32 %and, 0608 ret i1 %res609}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, #42615; ARM-NEXT: clz r0, r0616; ARM-NEXT: lsr r0, r0, #5617; ARM-NEXT: bx lr618;619; THUMB-LABEL: cmp_eq_zero_and_ri:620; THUMB: @ %bb.0:621; THUMB-NEXT: movs r1, #42622; THUMB-NEXT: ands r0, r1623; THUMB-NEXT: rsbs r1, r0, #0624; THUMB-NEXT: adcs r0, r1625; THUMB-NEXT: bx lr626;627; THUMB2-LABEL: cmp_eq_zero_and_ri:628; THUMB2: @ %bb.0:629; THUMB2-NEXT: and r0, r0, #42630; THUMB2-NEXT: clz r0, r0631; THUMB2-NEXT: lsrs r0, r0, #5632; THUMB2-NEXT: bx lr633 %and = and i32 %a, 42634 %res = icmp eq i32 %and, 0635 ret i1 %res636}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 r2642; ARM-NEXT: clz r0, r0643; ARM-NEXT: lsr r0, r0, #5644; ARM-NEXT: bx lr645;646; THUMB-LABEL: cmp_eq_zero_and_rsr:647; THUMB: @ %bb.0:648; THUMB-NEXT: lsls r1, r2649; THUMB-NEXT: ands r0, r1650; THUMB-NEXT: rsbs r1, r0, #0651; THUMB-NEXT: adcs r0, r1652; THUMB-NEXT: bx lr653;654; THUMB2-LABEL: cmp_eq_zero_and_rsr:655; THUMB2: @ %bb.0:656; THUMB2-NEXT: lsls r1, r2657; THUMB2-NEXT: ands r0, r1658; THUMB2-NEXT: clz r0, r0659; THUMB2-NEXT: lsrs r0, r0, #5660; THUMB2-NEXT: bx lr661 %sh = shl i32 %b, %c662 %and = and i32 %sh, %a663 %res = icmp eq i32 %and, 0664 ret i1 %res665}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 #17671; ARM-NEXT: clz r0, r0672; ARM-NEXT: lsr r0, r0, #5673; ARM-NEXT: bx lr674;675; THUMB-LABEL: cmp_eq_zero_and_rsi:676; THUMB: @ %bb.0:677; THUMB-NEXT: lsrs r1, r1, #17678; THUMB-NEXT: ands r0, r1679; THUMB-NEXT: rsbs r1, r0, #0680; THUMB-NEXT: adcs r0, r1681; THUMB-NEXT: bx lr682;683; THUMB2-LABEL: cmp_eq_zero_and_rsi:684; THUMB2: @ %bb.0:685; THUMB2-NEXT: and.w r0, r0, r1, lsr #17686; THUMB2-NEXT: clz r0, r0687; THUMB2-NEXT: lsrs r0, r0, #5688; THUMB2-NEXT: bx lr689 %sh = lshr i32 %b, 17690 %and = and i32 %sh, %a691 %res = icmp eq i32 %and, 0692 ret i1 %res693}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, r1699; ARM-NEXT: clz r0, r0700; ARM-NEXT: lsr r0, r0, #5701; ARM-NEXT: bx lr702;703; THUMB-LABEL: cmp_eq_zero_or_rr:704; THUMB: @ %bb.0:705; THUMB-NEXT: orrs r0, r1706; THUMB-NEXT: rsbs r1, r0, #0707; THUMB-NEXT: adcs r0, r1708; THUMB-NEXT: bx lr709;710; THUMB2-LABEL: cmp_eq_zero_or_rr:711; THUMB2: @ %bb.0:712; THUMB2-NEXT: orrs r0, r1713; THUMB2-NEXT: clz r0, r0714; THUMB2-NEXT: lsrs r0, r0, #5715; THUMB2-NEXT: bx lr716 %or = or i32 %a, %b717 %res = icmp eq i32 %or, 0718 ret i1 %res719}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, #0725; ARM-NEXT: bx lr726;727; THUMB-LABEL: cmp_eq_zero_or_ri:728; THUMB: @ %bb.0:729; THUMB-NEXT: movs r1, #42730; THUMB-NEXT: orrs r0, r1731; THUMB-NEXT: rsbs r1, r0, #0732; THUMB-NEXT: adcs r0, r1733; THUMB-NEXT: bx lr734;735; THUMB2-LABEL: cmp_eq_zero_or_ri:736; THUMB2: @ %bb.0:737; THUMB2-NEXT: movs r0, #0738; THUMB2-NEXT: bx lr739 %or = or i32 %a, 42740 %res = icmp eq i32 %or, 0741 ret i1 %res742}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 r2748; ARM-NEXT: clz r0, r0749; ARM-NEXT: lsr r0, r0, #5750; ARM-NEXT: bx lr751;752; THUMB-LABEL: cmp_eq_zero_or_rsr:753; THUMB: @ %bb.0:754; THUMB-NEXT: lsls r1, r2755; THUMB-NEXT: orrs r0, r1756; THUMB-NEXT: rsbs r1, r0, #0757; THUMB-NEXT: adcs r0, r1758; THUMB-NEXT: bx lr759;760; THUMB2-LABEL: cmp_eq_zero_or_rsr:761; THUMB2: @ %bb.0:762; THUMB2-NEXT: lsls r1, r2763; THUMB2-NEXT: orrs r0, r1764; THUMB2-NEXT: clz r0, r0765; THUMB2-NEXT: lsrs r0, r0, #5766; THUMB2-NEXT: bx lr767 %sh = shl i32 %b, %c768 %or = or i32 %sh, %a769 %res = icmp eq i32 %or, 0770 ret i1 %res771}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 #17777; ARM-NEXT: clz r0, r0778; ARM-NEXT: lsr r0, r0, #5779; ARM-NEXT: bx lr780;781; THUMB-LABEL: cmp_eq_zero_or_rsi:782; THUMB: @ %bb.0:783; THUMB-NEXT: lsrs r1, r1, #17784; THUMB-NEXT: orrs r0, r1785; THUMB-NEXT: rsbs r1, r0, #0786; THUMB-NEXT: adcs r0, r1787; THUMB-NEXT: bx lr788;789; THUMB2-LABEL: cmp_eq_zero_or_rsi:790; THUMB2: @ %bb.0:791; THUMB2-NEXT: orr.w r0, r0, r1, lsr #17792; THUMB2-NEXT: clz r0, r0793; THUMB2-NEXT: lsrs r0, r0, #5794; THUMB2-NEXT: bx lr795 %sh = lshr i32 %b, 17796 %or = or i32 %sh, %a797 %res = icmp eq i32 %or, 0798 ret i1 %res799}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, r1805; ARM-NEXT: clz r0, r0806; ARM-NEXT: lsr r0, r0, #5807; ARM-NEXT: bx lr808;809; THUMB-LABEL: cmp_eq_zero_xor_rr:810; THUMB: @ %bb.0:811; THUMB-NEXT: eors r0, r1812; THUMB-NEXT: rsbs r1, r0, #0813; THUMB-NEXT: adcs r0, r1814; THUMB-NEXT: bx lr815;816; THUMB2-LABEL: cmp_eq_zero_xor_rr:817; THUMB2: @ %bb.0:818; THUMB2-NEXT: eors r0, r1819; THUMB2-NEXT: clz r0, r0820; THUMB2-NEXT: lsrs r0, r0, #5821; THUMB2-NEXT: bx lr822 %xor = xor i32 %a, %b823 %res = icmp eq i32 %xor, 0824 ret i1 %res825}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, #42831; ARM-NEXT: clz r0, r0832; ARM-NEXT: lsr r0, r0, #5833; ARM-NEXT: bx lr834;835; THUMB-LABEL: cmp_eq_zero_xor_ri:836; THUMB: @ %bb.0:837; THUMB-NEXT: subs r0, #42838; THUMB-NEXT: rsbs r1, r0, #0839; THUMB-NEXT: adcs r0, r1840; THUMB-NEXT: bx lr841;842; THUMB2-LABEL: cmp_eq_zero_xor_ri:843; THUMB2: @ %bb.0:844; THUMB2-NEXT: subs r0, #42845; THUMB2-NEXT: clz r0, r0846; THUMB2-NEXT: lsrs r0, r0, #5847; THUMB2-NEXT: bx lr848 %xor = xor i32 %a, 42849 %res = icmp eq i32 %xor, 0850 ret i1 %res851}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 r2857; ARM-NEXT: clz r0, r0858; ARM-NEXT: lsr r0, r0, #5859; ARM-NEXT: bx lr860;861; THUMB-LABEL: cmp_eq_zero_xor_rsr:862; THUMB: @ %bb.0:863; THUMB-NEXT: lsls r1, r2864; THUMB-NEXT: eors r0, r1865; THUMB-NEXT: rsbs r1, r0, #0866; THUMB-NEXT: adcs r0, r1867; THUMB-NEXT: bx lr868;869; THUMB2-LABEL: cmp_eq_zero_xor_rsr:870; THUMB2: @ %bb.0:871; THUMB2-NEXT: lsls r1, r2872; THUMB2-NEXT: eors r0, r1873; THUMB2-NEXT: clz r0, r0874; THUMB2-NEXT: lsrs r0, r0, #5875; THUMB2-NEXT: bx lr876 %sh = shl i32 %b, %c877 %xor = xor i32 %sh, %a878 %res = icmp eq i32 %xor, 0879 ret i1 %res880}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 #17886; ARM-NEXT: clz r0, r0887; ARM-NEXT: lsr r0, r0, #5888; ARM-NEXT: bx lr889;890; THUMB-LABEL: cmp_eq_zero_xor_rsi:891; THUMB: @ %bb.0:892; THUMB-NEXT: lsrs r1, r1, #17893; THUMB-NEXT: eors r0, r1894; THUMB-NEXT: rsbs r1, r0, #0895; THUMB-NEXT: adcs r0, r1896; THUMB-NEXT: bx lr897;898; THUMB2-LABEL: cmp_eq_zero_xor_rsi:899; THUMB2: @ %bb.0:900; THUMB2-NEXT: eor.w r0, r0, r1, lsr #17901; THUMB2-NEXT: clz r0, r0902; THUMB2-NEXT: lsrs r0, r0, #5903; THUMB2-NEXT: bx lr904 %sh = lshr i32 %b, 17905 %xor = xor i32 %sh, %a906 %res = icmp eq i32 %xor, 0907 ret i1 %res908}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, r1914; ARM-NEXT: clz r0, r0915; ARM-NEXT: lsr r0, r0, #5916; ARM-NEXT: bx lr917;918; THUMB-LABEL: cmp_eq_zero_and_not_rr:919; THUMB: @ %bb.0:920; THUMB-NEXT: bics r0, r1921; THUMB-NEXT: rsbs r1, r0, #0922; THUMB-NEXT: adcs r0, r1923; THUMB-NEXT: bx lr924;925; THUMB2-LABEL: cmp_eq_zero_and_not_rr:926; THUMB2: @ %bb.0:927; THUMB2-NEXT: bics r0, r1928; THUMB2-NEXT: clz r0, r0929; THUMB2-NEXT: lsrs r0, r0, #5930; THUMB2-NEXT: bx lr931 %not = xor i32 %b, -1932 %and = and i32 %a, %not933 %res = icmp eq i32 %and, 0934 ret i1 %res935}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, #42941; ARM-NEXT: clz r0, r0942; ARM-NEXT: lsr r0, r0, #5943; ARM-NEXT: bx lr944;945; THUMB-LABEL: cmp_eq_zero_and_not_ri:946; THUMB: @ %bb.0:947; THUMB-NEXT: movs r1, #42948; THUMB-NEXT: bics r0, r1949; THUMB-NEXT: rsbs r1, r0, #0950; THUMB-NEXT: adcs r0, r1951; THUMB-NEXT: bx lr952;953; THUMB2-LABEL: cmp_eq_zero_and_not_ri:954; THUMB2: @ %bb.0:955; THUMB2-NEXT: bic r0, r0, #42956; THUMB2-NEXT: clz r0, r0957; THUMB2-NEXT: lsrs r0, r0, #5958; THUMB2-NEXT: bx lr959 %not = xor i32 42, -1960 %and = and i32 %a, %not961 %res = icmp eq i32 %and, 0962 ret i1 %res963}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 r2969; ARM-NEXT: clz r0, r0970; ARM-NEXT: lsr r0, r0, #5971; ARM-NEXT: bx lr972;973; THUMB-LABEL: cmp_eq_zero_and_not_rsr:974; THUMB: @ %bb.0:975; THUMB-NEXT: lsls r1, r2976; THUMB-NEXT: bics r0, r1977; THUMB-NEXT: rsbs r1, r0, #0978; THUMB-NEXT: adcs r0, r1979; THUMB-NEXT: bx lr980;981; THUMB2-LABEL: cmp_eq_zero_and_not_rsr:982; THUMB2: @ %bb.0:983; THUMB2-NEXT: lsls r1, r2984; THUMB2-NEXT: bics r0, r1985; THUMB2-NEXT: clz r0, r0986; THUMB2-NEXT: lsrs r0, r0, #5987; THUMB2-NEXT: bx lr988 %sh = shl i32 %b, %c989 %not = xor i32 %sh, -1990 %and = and i32 %not, %a991 %res = icmp eq i32 %and, 0992 ret i1 %res993}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 #17999; ARM-NEXT: clz r0, r01000; ARM-NEXT: lsr r0, r0, #51001; ARM-NEXT: bx lr1002;1003; THUMB-LABEL: cmp_eq_zero_and_not_rsi:1004; THUMB: @ %bb.0:1005; THUMB-NEXT: lsrs r1, r1, #171006; THUMB-NEXT: bics r0, r11007; THUMB-NEXT: rsbs r1, r0, #01008; THUMB-NEXT: adcs r0, r11009; THUMB-NEXT: bx lr1010;1011; THUMB2-LABEL: cmp_eq_zero_and_not_rsi:1012; THUMB2: @ %bb.0:1013; THUMB2-NEXT: bic.w r0, r0, r1, lsr #171014; THUMB2-NEXT: clz r0, r01015; THUMB2-NEXT: lsrs r0, r0, #51016; THUMB2-NEXT: bx lr1017 %sh = lshr i32 %b, 171018 %not = xor i32 %sh, -11019 %and = and i32 %not, %a1020 %res = icmp eq i32 %and, 01021 ret i1 %res1022}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, r11028; ARM-NEXT: clz r0, r01029; ARM-NEXT: lsr r0, r0, #51030; ARM-NEXT: bx lr1031;1032; THUMB-LABEL: cmp_eq_zero_shl_rr:1033; THUMB: @ %bb.0:1034; THUMB-NEXT: lsls r0, r11035; THUMB-NEXT: rsbs r1, r0, #01036; THUMB-NEXT: adcs r0, r11037; THUMB-NEXT: bx lr1038;1039; THUMB2-LABEL: cmp_eq_zero_shl_rr:1040; THUMB2: @ %bb.0:1041; THUMB2-NEXT: lsls r0, r11042; THUMB2-NEXT: clz r0, r01043; THUMB2-NEXT: lsrs r0, r0, #51044; THUMB2-NEXT: bx lr1045 %sh = shl i32 %a, %b1046 %cmp = icmp eq i32 %sh, 01047 ret i1 %cmp1048}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, #71054; ARM-NEXT: clz r0, r01055; ARM-NEXT: lsr r0, r0, #51056; ARM-NEXT: bx lr1057;1058; THUMB-LABEL: cmp_eq_zero_shl_ri:1059; THUMB: @ %bb.0:1060; THUMB-NEXT: lsls r1, r0, #71061; THUMB-NEXT: rsbs r0, r1, #01062; THUMB-NEXT: adcs r0, r11063; THUMB-NEXT: bx lr1064;1065; THUMB2-LABEL: cmp_eq_zero_shl_ri:1066; THUMB2: @ %bb.0:1067; THUMB2-NEXT: lsls r0, r0, #71068; THUMB2-NEXT: clz r0, r01069; THUMB2-NEXT: lsrs r0, r0, #51070; THUMB2-NEXT: bx lr1071 %sh = shl i32 %a, 71072 %cmp = icmp eq i32 %sh, 01073 ret i1 %cmp1074}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, r11080; ARM-NEXT: clz r0, r01081; ARM-NEXT: lsr r0, r0, #51082; ARM-NEXT: bx lr1083;1084; THUMB-LABEL: cmp_eq_zero_lshr_rr:1085; THUMB: @ %bb.0:1086; THUMB-NEXT: lsrs r0, r11087; THUMB-NEXT: rsbs r1, r0, #01088; THUMB-NEXT: adcs r0, r11089; THUMB-NEXT: bx lr1090;1091; THUMB2-LABEL: cmp_eq_zero_lshr_rr:1092; THUMB2: @ %bb.0:1093; THUMB2-NEXT: lsrs r0, r11094; THUMB2-NEXT: clz r0, r01095; THUMB2-NEXT: lsrs r0, r0, #51096; THUMB2-NEXT: bx lr1097 %sh = lshr i32 %a, %b1098 %cmp = icmp eq i32 %sh, 01099 ret i1 %cmp1100}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, #71106; ARM-NEXT: clz r0, r01107; ARM-NEXT: lsr r0, r0, #51108; ARM-NEXT: bx lr1109;1110; THUMB-LABEL: cmp_eq_zero_lshr_ri:1111; THUMB: @ %bb.0:1112; THUMB-NEXT: lsrs r1, r0, #71113; THUMB-NEXT: rsbs r0, r1, #01114; THUMB-NEXT: adcs r0, r11115; THUMB-NEXT: bx lr1116;1117; THUMB2-LABEL: cmp_eq_zero_lshr_ri:1118; THUMB2: @ %bb.0:1119; THUMB2-NEXT: lsrs r0, r0, #71120; THUMB2-NEXT: clz r0, r01121; THUMB2-NEXT: lsrs r0, r0, #51122; THUMB2-NEXT: bx lr1123 %sh = lshr i32 %a, 71124 %cmp = icmp eq i32 %sh, 01125 ret i1 %cmp1126}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, r11132; ARM-NEXT: clz r0, r01133; ARM-NEXT: lsr r0, r0, #51134; ARM-NEXT: bx lr1135;1136; THUMB-LABEL: cmp_eq_zero_ashr_rr:1137; THUMB: @ %bb.0:1138; THUMB-NEXT: asrs r0, r11139; THUMB-NEXT: rsbs r1, r0, #01140; THUMB-NEXT: adcs r0, r11141; THUMB-NEXT: bx lr1142;1143; THUMB2-LABEL: cmp_eq_zero_ashr_rr:1144; THUMB2: @ %bb.0:1145; THUMB2-NEXT: asrs r0, r11146; THUMB2-NEXT: clz r0, r01147; THUMB2-NEXT: lsrs r0, r0, #51148; THUMB2-NEXT: bx lr1149 %sh = ashr i32 %a, %b1150 %cmp = icmp eq i32 %sh, 01151 ret i1 %cmp1152}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, #71158; ARM-NEXT: clz r0, r01159; ARM-NEXT: lsr r0, r0, #51160; ARM-NEXT: bx lr1161;1162; THUMB-LABEL: cmp_eq_zero_ashr_ri:1163; THUMB: @ %bb.0:1164; THUMB-NEXT: asrs r1, r0, #71165; THUMB-NEXT: rsbs r0, r1, #01166; THUMB-NEXT: adcs r0, r11167; THUMB-NEXT: bx lr1168;1169; THUMB2-LABEL: cmp_eq_zero_ashr_ri:1170; THUMB2: @ %bb.0:1171; THUMB2-NEXT: asrs r0, r0, #71172; THUMB2-NEXT: clz r0, r01173; THUMB2-NEXT: lsrs r0, r0, #51174; THUMB2-NEXT: bx lr1175 %sh = ashr i32 %a, 71176 %cmp = icmp eq i32 %sh, 01177 ret i1 %cmp1178}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, r11186; ARM-NEXT: bxne lr1187; ARM-NEXT: .LBB44_1: @ %true_br1188; ARM-NEXT: push {r11, lr}1189; ARM-NEXT: bl consume1190; ARM-NEXT: pop {r11, lr}1191; ARM-NEXT: bx lr1192;1193; THUMB-LABEL: br_on_binop_eq_zero:1194; THUMB: @ %bb.0:1195; THUMB-NEXT: push {r7, lr}1196; THUMB-NEXT: orrs r1, r01197; THUMB-NEXT: beq .LBB44_21198; THUMB-NEXT: @ %bb.1: @ %exit1199; THUMB-NEXT: pop {r7, pc}1200; THUMB-NEXT: .LBB44_2: @ %true_br1201; THUMB-NEXT: bl consume1202; THUMB-NEXT: pop {r7, pc}1203;1204; THUMB2-LABEL: br_on_binop_eq_zero:1205; THUMB2: @ %bb.0:1206; THUMB2-NEXT: orrs r1, r01207; THUMB2-NEXT: it ne1208; THUMB2-NEXT: bxne lr1209; THUMB2-NEXT: .LBB44_1: @ %true_br1210; THUMB2-NEXT: push {r7, lr}1211; THUMB2-NEXT: bl consume1212; THUMB2-NEXT: pop.w {r7, lr}1213; THUMB2-NEXT: bx lr1214 %or = or i32 %a, %b1215 %cmp = icmp eq i32 %or, 01216 br i1 %cmp, label %true_br, label %exit1217true_br:1218 call void @consume(i32 %a)1219 br label %exit1220exit:1221 ret void1222}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, r11228; ARM-NEXT: bxeq lr1229; ARM-NEXT: .LBB45_1: @ %true_br1230; ARM-NEXT: push {r11, lr}1231; ARM-NEXT: bl consume1232; ARM-NEXT: pop {r11, lr}1233; ARM-NEXT: bx lr1234;1235; THUMB-LABEL: br_on_binop_ne_zero:1236; THUMB: @ %bb.0:1237; THUMB-NEXT: push {r7, lr}1238; THUMB-NEXT: orrs r1, r01239; THUMB-NEXT: beq .LBB45_21240; THUMB-NEXT: @ %bb.1: @ %true_br1241; THUMB-NEXT: bl consume1242; THUMB-NEXT: .LBB45_2: @ %exit1243; THUMB-NEXT: pop {r7, pc}1244;1245; THUMB2-LABEL: br_on_binop_ne_zero:1246; THUMB2: @ %bb.0:1247; THUMB2-NEXT: orrs r1, r01248; THUMB2-NEXT: it eq1249; THUMB2-NEXT: bxeq lr1250; THUMB2-NEXT: .LBB45_1: @ %true_br1251; THUMB2-NEXT: push {r7, lr}1252; THUMB2-NEXT: bl consume1253; THUMB2-NEXT: pop.w {r7, lr}1254; THUMB2-NEXT: bx lr1255 %or = or i32 %a, %b1256 %cmp = icmp ne i32 %or, 01257 br i1 %cmp, label %true_br, label %exit1258true_br:1259 call void @consume(i32 %a)1260 br label %exit1261exit:1262 ret void1263}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, r11269; ARM-NEXT: cmp r1, #01270; ARM-NEXT: bxhs lr1271; ARM-NEXT: .LBB46_1: @ %true_br1272; ARM-NEXT: push {r11, lr}1273; ARM-NEXT: bl consume1274; ARM-NEXT: pop {r11, lr}1275; ARM-NEXT: bx lr1276;1277; THUMB-LABEL: br_on_binop_lt_zero:1278; THUMB: @ %bb.0:1279; THUMB-NEXT: push {r7, lr}1280; THUMB-NEXT: orrs r1, r01281; THUMB-NEXT: cmp r1, #01282; THUMB-NEXT: bhs .LBB46_21283; THUMB-NEXT: @ %bb.1: @ %true_br1284; THUMB-NEXT: bl consume1285; THUMB-NEXT: .LBB46_2: @ %exit1286; THUMB-NEXT: pop {r7, pc}1287;1288; THUMB2-LABEL: br_on_binop_lt_zero:1289; THUMB2: @ %bb.0:1290; THUMB2-NEXT: orrs r1, r01291; THUMB2-NEXT: cmp r1, #01292; THUMB2-NEXT: it hs1293; THUMB2-NEXT: bxhs lr1294; THUMB2-NEXT: .LBB46_1: @ %true_br1295; THUMB2-NEXT: push {r7, lr}1296; THUMB2-NEXT: bl consume1297; THUMB2-NEXT: pop.w {r7, lr}1298; THUMB2-NEXT: bx lr1299 %or = or i32 %a, %b1300 %cmp = icmp ult i32 %or, 01301 br i1 %cmp, label %true_br, label %exit1302true_br:1303 call void @consume(i32 %a)1304 br label %exit1305exit:1306 ret void1307}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, r11313; ARM-NEXT: cmp r1, #421314; ARM-NEXT: bxne lr1315; ARM-NEXT: .LBB47_1: @ %true_br1316; ARM-NEXT: push {r11, lr}1317; ARM-NEXT: bl consume1318; ARM-NEXT: pop {r11, lr}1319; ARM-NEXT: bx lr1320;1321; THUMB-LABEL: br_on_binop_eq_imm:1322; THUMB: @ %bb.0:1323; THUMB-NEXT: push {r7, lr}1324; THUMB-NEXT: orrs r1, r01325; THUMB-NEXT: cmp r1, #421326; THUMB-NEXT: bne .LBB47_21327; THUMB-NEXT: @ %bb.1: @ %true_br1328; THUMB-NEXT: bl consume1329; THUMB-NEXT: .LBB47_2: @ %exit1330; THUMB-NEXT: pop {r7, pc}1331;1332; THUMB2-LABEL: br_on_binop_eq_imm:1333; THUMB2: @ %bb.0:1334; THUMB2-NEXT: orrs r1, r01335; THUMB2-NEXT: cmp r1, #421336; THUMB2-NEXT: it ne1337; THUMB2-NEXT: bxne lr1338; THUMB2-NEXT: .LBB47_1: @ %true_br1339; THUMB2-NEXT: push {r7, lr}1340; THUMB2-NEXT: bl consume1341; THUMB2-NEXT: pop.w {r7, lr}1342; THUMB2-NEXT: bx lr1343 %or = or i32 %a, %b1344 %cmp = icmp eq i32 %or, 421345 br i1 %cmp, label %true_br, label %exit1346true_br:1347 call void @consume(i32 %a)1348 br label %exit1349exit:1350 ret void1351}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, r11357; ARM-NEXT: cmp r1, #421358; ARM-NEXT: bxeq lr1359; ARM-NEXT: .LBB48_1: @ %true_br1360; ARM-NEXT: push {r11, lr}1361; ARM-NEXT: bl consume1362; ARM-NEXT: pop {r11, lr}1363; ARM-NEXT: bx lr1364;1365; THUMB-LABEL: br_on_binop_ne_imm:1366; THUMB: @ %bb.0:1367; THUMB-NEXT: push {r7, lr}1368; THUMB-NEXT: orrs r1, r01369; THUMB-NEXT: cmp r1, #421370; THUMB-NEXT: beq .LBB48_21371; THUMB-NEXT: @ %bb.1: @ %true_br1372; THUMB-NEXT: bl consume1373; THUMB-NEXT: .LBB48_2: @ %exit1374; THUMB-NEXT: pop {r7, pc}1375;1376; THUMB2-LABEL: br_on_binop_ne_imm:1377; THUMB2: @ %bb.0:1378; THUMB2-NEXT: orrs r1, r01379; THUMB2-NEXT: cmp r1, #421380; THUMB2-NEXT: it eq1381; THUMB2-NEXT: bxeq lr1382; THUMB2-NEXT: .LBB48_1: @ %true_br1383; THUMB2-NEXT: push {r7, lr}1384; THUMB2-NEXT: bl consume1385; THUMB2-NEXT: pop.w {r7, lr}1386; THUMB2-NEXT: bx lr1387 %or = or i32 %a, %b1388 %cmp = icmp ne i32 %or, 421389 br i1 %cmp, label %true_br, label %exit1390true_br:1391 call void @consume(i32 %a)1392 br label %exit1393exit:1394 ret void1395}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, r11401; ARM-NEXT: cmp r1, r21402; ARM-NEXT: bxne lr1403; ARM-NEXT: .LBB49_1: @ %true_br1404; ARM-NEXT: push {r11, lr}1405; ARM-NEXT: bl consume1406; ARM-NEXT: pop {r11, lr}1407; ARM-NEXT: bx lr1408;1409; THUMB-LABEL: br_on_binop_eq_reg:1410; THUMB: @ %bb.0:1411; THUMB-NEXT: push {r7, lr}1412; THUMB-NEXT: eors r1, r01413; THUMB-NEXT: cmp r1, r21414; THUMB-NEXT: bne .LBB49_21415; THUMB-NEXT: @ %bb.1: @ %true_br1416; THUMB-NEXT: bl consume1417; THUMB-NEXT: .LBB49_2: @ %exit1418; THUMB-NEXT: pop {r7, pc}1419;1420; THUMB2-LABEL: br_on_binop_eq_reg:1421; THUMB2: @ %bb.0:1422; THUMB2-NEXT: eors r1, r01423; THUMB2-NEXT: cmp r1, r21424; THUMB2-NEXT: it ne1425; THUMB2-NEXT: bxne lr1426; THUMB2-NEXT: .LBB49_1: @ %true_br1427; THUMB2-NEXT: push {r7, lr}1428; THUMB2-NEXT: bl consume1429; THUMB2-NEXT: pop.w {r7, lr}1430; THUMB2-NEXT: bx lr1431 %xor = xor i32 %a, %b1432 %cmp = icmp eq i32 %xor, %c1433 br i1 %cmp, label %true_br, label %exit1434true_br:1435 call void @consume(i32 %a)1436 br label %exit1437exit:1438 ret void1439}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, r11445; ARM-NEXT: cmp r1, r21446; ARM-NEXT: bxeq lr1447; ARM-NEXT: .LBB50_1: @ %true_br1448; ARM-NEXT: push {r11, lr}1449; ARM-NEXT: bl consume1450; ARM-NEXT: pop {r11, lr}1451; ARM-NEXT: bx lr1452;1453; THUMB-LABEL: br_on_binop_ne_reg:1454; THUMB: @ %bb.0:1455; THUMB-NEXT: push {r7, lr}1456; THUMB-NEXT: ands r1, r01457; THUMB-NEXT: cmp r1, r21458; THUMB-NEXT: beq .LBB50_21459; THUMB-NEXT: @ %bb.1: @ %true_br1460; THUMB-NEXT: bl consume1461; THUMB-NEXT: .LBB50_2: @ %exit1462; THUMB-NEXT: pop {r7, pc}1463;1464; THUMB2-LABEL: br_on_binop_ne_reg:1465; THUMB2: @ %bb.0:1466; THUMB2-NEXT: ands r1, r01467; THUMB2-NEXT: cmp r1, r21468; THUMB2-NEXT: it eq1469; THUMB2-NEXT: bxeq lr1470; THUMB2-NEXT: .LBB50_1: @ %true_br1471; THUMB2-NEXT: push {r7, lr}1472; THUMB2-NEXT: bl consume1473; THUMB2-NEXT: pop.w {r7, lr}1474; THUMB2-NEXT: bx lr1475 %and = and i32 %a, %b1476 %cmp = icmp ne i32 %and, %c1477 br i1 %cmp, label %true_br, label %exit1478true_br:1479 call void @consume(i32 %a)1480 br label %exit1481exit:1482 ret void1483}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, r11489; ARM-NEXT: bxne lr1490; ARM-NEXT: .LBB51_1: @ %true_br1491; ARM-NEXT: push {r11, lr}1492; ARM-NEXT: bl consume1493; ARM-NEXT: pop {r11, lr}1494; ARM-NEXT: bx lr1495;1496; THUMB-LABEL: br_on_shift_eq_zero:1497; THUMB: @ %bb.0:1498; THUMB-NEXT: push {r7, lr}1499; THUMB-NEXT: mov r2, r01500; THUMB-NEXT: lsls r2, r11501; THUMB-NEXT: beq .LBB51_21502; THUMB-NEXT: @ %bb.1: @ %exit1503; THUMB-NEXT: pop {r7, pc}1504; THUMB-NEXT: .LBB51_2: @ %true_br1505; THUMB-NEXT: bl consume1506; 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, r11511; THUMB2-NEXT: it ne1512; THUMB2-NEXT: bxne lr1513; THUMB2-NEXT: .LBB51_1: @ %true_br1514; THUMB2-NEXT: push {r7, lr}1515; THUMB2-NEXT: bl consume1516; THUMB2-NEXT: pop.w {r7, lr}1517; THUMB2-NEXT: bx lr1518 %sh = shl i32 %a, %b1519 %cmp = icmp eq i32 %sh, 01520 br i1 %cmp, label %true_br, label %exit1521true_br:1522 call void @consume(i32 %a)1523 br label %exit1524exit:1525 ret void1526}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, r11532; ARM-NEXT: bxeq lr1533; ARM-NEXT: .LBB52_1: @ %true_br1534; ARM-NEXT: push {r11, lr}1535; ARM-NEXT: bl consume1536; ARM-NEXT: pop {r11, lr}1537; ARM-NEXT: bx lr1538;1539; THUMB-LABEL: br_on_shift_ne_zero:1540; THUMB: @ %bb.0:1541; THUMB-NEXT: push {r7, lr}1542; THUMB-NEXT: mov r2, r01543; THUMB-NEXT: lsrs r2, r11544; THUMB-NEXT: beq .LBB52_21545; THUMB-NEXT: @ %bb.1: @ %true_br1546; THUMB-NEXT: bl consume1547; THUMB-NEXT: .LBB52_2: @ %exit1548; 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, r11553; THUMB2-NEXT: it eq1554; THUMB2-NEXT: bxeq lr1555; THUMB2-NEXT: .LBB52_1: @ %true_br1556; THUMB2-NEXT: push {r7, lr}1557; THUMB2-NEXT: bl consume1558; THUMB2-NEXT: pop.w {r7, lr}1559; THUMB2-NEXT: bx lr1560 %sh = lshr i32 %a, %b1561 %cmp = icmp ne i32 %sh, 01562 br i1 %cmp, label %true_br, label %exit1563true_br:1564 call void @consume(i32 %a)1565 br label %exit1566exit:1567 ret void1568}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, r11574; ARM-NEXT: cmp r1, #01575; ARM-NEXT: bxhs lr1576; ARM-NEXT: .LBB53_1: @ %true_br1577; ARM-NEXT: push {r11, lr}1578; ARM-NEXT: bl consume1579; ARM-NEXT: pop {r11, lr}1580; ARM-NEXT: bx lr1581;1582; THUMB-LABEL: br_on_shift_lt_zero:1583; THUMB: @ %bb.0:1584; THUMB-NEXT: push {r7, lr}1585; THUMB-NEXT: mov r2, r01586; THUMB-NEXT: asrs r2, r11587; THUMB-NEXT: cmp r2, #01588; THUMB-NEXT: bhs .LBB53_21589; THUMB-NEXT: @ %bb.1: @ %true_br1590; THUMB-NEXT: bl consume1591; THUMB-NEXT: .LBB53_2: @ %exit1592; 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, r11597; THUMB2-NEXT: cmp r1, #01598; THUMB2-NEXT: it hs1599; THUMB2-NEXT: bxhs lr1600; THUMB2-NEXT: .LBB53_1: @ %true_br1601; THUMB2-NEXT: push {r7, lr}1602; THUMB2-NEXT: bl consume1603; THUMB2-NEXT: pop.w {r7, lr}1604; THUMB2-NEXT: bx lr1605 %sh = ashr i32 %a, %b1606 %cmp = icmp ult i32 %sh, 01607 br i1 %cmp, label %true_br, label %exit1608true_br:1609 call void @consume(i32 %a)1610 br label %exit1611exit:1612 ret void1613}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, #421619; ARM-NEXT: cmp r2, r0, lsl r11620; ARM-NEXT: bxne lr1621; ARM-NEXT: .LBB54_1: @ %true_br1622; ARM-NEXT: push {r11, lr}1623; ARM-NEXT: bl consume1624; ARM-NEXT: pop {r11, lr}1625; ARM-NEXT: bx lr1626;1627; THUMB-LABEL: br_on_shift_eq_imm:1628; THUMB: @ %bb.0:1629; THUMB-NEXT: push {r7, lr}1630; THUMB-NEXT: mov r2, r01631; THUMB-NEXT: lsls r2, r11632; THUMB-NEXT: cmp r2, #421633; THUMB-NEXT: bne .LBB54_21634; THUMB-NEXT: @ %bb.1: @ %true_br1635; THUMB-NEXT: bl consume1636; THUMB-NEXT: .LBB54_2: @ %exit1637; 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, r11642; THUMB2-NEXT: cmp r1, #421643; THUMB2-NEXT: it ne1644; THUMB2-NEXT: bxne lr1645; THUMB2-NEXT: .LBB54_1: @ %true_br1646; THUMB2-NEXT: push {r7, lr}1647; THUMB2-NEXT: bl consume1648; THUMB2-NEXT: pop.w {r7, lr}1649; THUMB2-NEXT: bx lr1650 %sh = shl i32 %a, %b1651 %cmp = icmp eq i32 %sh, 421652 br i1 %cmp, label %true_br, label %exit1653true_br:1654 call void @consume(i32 %a)1655 br label %exit1656exit:1657 ret void1658}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, #421664; ARM-NEXT: cmp r2, r0, lsr r11665; ARM-NEXT: bxeq lr1666; ARM-NEXT: .LBB55_1: @ %true_br1667; ARM-NEXT: push {r11, lr}1668; ARM-NEXT: bl consume1669; ARM-NEXT: pop {r11, lr}1670; ARM-NEXT: bx lr1671;1672; THUMB-LABEL: br_on_shift_ne_imm:1673; THUMB: @ %bb.0:1674; THUMB-NEXT: push {r7, lr}1675; THUMB-NEXT: mov r2, r01676; THUMB-NEXT: lsrs r2, r11677; THUMB-NEXT: cmp r2, #421678; THUMB-NEXT: beq .LBB55_21679; THUMB-NEXT: @ %bb.1: @ %true_br1680; THUMB-NEXT: bl consume1681; THUMB-NEXT: .LBB55_2: @ %exit1682; 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, r11687; THUMB2-NEXT: cmp r1, #421688; THUMB2-NEXT: it eq1689; THUMB2-NEXT: bxeq lr1690; THUMB2-NEXT: .LBB55_1: @ %true_br1691; THUMB2-NEXT: push {r7, lr}1692; THUMB2-NEXT: bl consume1693; THUMB2-NEXT: pop.w {r7, lr}1694; THUMB2-NEXT: bx lr1695 %sh = lshr i32 %a, %b1696 %cmp = icmp ne i32 %sh, 421697 br i1 %cmp, label %true_br, label %exit1698true_br:1699 call void @consume(i32 %a)1700 br label %exit1701exit:1702 ret void1703}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 r11709; ARM-NEXT: bxne lr1710; ARM-NEXT: .LBB56_1: @ %true_br1711; ARM-NEXT: push {r11, lr}1712; ARM-NEXT: bl consume1713; ARM-NEXT: pop {r11, lr}1714; ARM-NEXT: bx lr1715;1716; THUMB-LABEL: br_on_shift_eq_reg:1717; THUMB: @ %bb.0:1718; THUMB-NEXT: push {r7, lr}1719; THUMB-NEXT: mov r3, r01720; THUMB-NEXT: asrs r3, r11721; THUMB-NEXT: cmp r2, r31722; THUMB-NEXT: bne .LBB56_21723; THUMB-NEXT: @ %bb.1: @ %true_br1724; THUMB-NEXT: bl consume1725; THUMB-NEXT: .LBB56_2: @ %exit1726; 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, r11731; THUMB2-NEXT: cmp r2, r11732; THUMB2-NEXT: it ne1733; THUMB2-NEXT: bxne lr1734; THUMB2-NEXT: .LBB56_1: @ %true_br1735; THUMB2-NEXT: push {r7, lr}1736; THUMB2-NEXT: bl consume1737; THUMB2-NEXT: pop.w {r7, lr}1738; THUMB2-NEXT: bx lr1739 %sh = ashr i32 %a, %b1740 %cmp = icmp eq i32 %sh, %c1741 br i1 %cmp, label %true_br, label %exit1742true_br:1743 call void @consume(i32 %a)1744 br label %exit1745exit:1746 ret void1747}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 r11753; ARM-NEXT: bxeq lr1754; ARM-NEXT: .LBB57_1: @ %true_br1755; ARM-NEXT: push {r11, lr}1756; ARM-NEXT: bl consume1757; ARM-NEXT: pop {r11, lr}1758; ARM-NEXT: bx lr1759;1760; THUMB-LABEL: br_on_shift_ne_reg:1761; THUMB: @ %bb.0:1762; THUMB-NEXT: push {r7, lr}1763; THUMB-NEXT: mov r3, r01764; THUMB-NEXT: lsls r3, r11765; THUMB-NEXT: cmp r2, r31766; THUMB-NEXT: beq .LBB57_21767; THUMB-NEXT: @ %bb.1: @ %true_br1768; THUMB-NEXT: bl consume1769; THUMB-NEXT: .LBB57_2: @ %exit1770; 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, r11775; THUMB2-NEXT: cmp r2, r11776; THUMB2-NEXT: it eq1777; THUMB2-NEXT: bxeq lr1778; THUMB2-NEXT: .LBB57_1: @ %true_br1779; THUMB2-NEXT: push {r7, lr}1780; THUMB2-NEXT: bl consume1781; THUMB2-NEXT: pop.w {r7, lr}1782; THUMB2-NEXT: bx lr1783 %sh = shl i32 %a, %b1784 %cmp = icmp ne i32 %sh, %c1785 br i1 %cmp, label %true_br, label %exit1786true_br:1787 call void @consume(i32 %a)1788 br label %exit1789exit:1790 ret void1791}1792