900 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=arm-eabi | FileCheck %s --check-prefix=ARM3; RUN: llc < %s -mtriple=arm-eabi -mcpu=arm1156t2-s -mattr=+thumb2 | FileCheck %s --check-prefix=ARMT24; RUN: llc < %s -mtriple=thumb-eabi -mcpu=cortex-m0 | FileCheck %s --check-prefix=THUMB15; RUN: llc < %s -mtriple=thumb-eabi -mcpu=arm1156t2-s -mattr=+thumb2 | FileCheck %s --check-prefix=THUMB26; RUN: llc < %s -mtriple=thumbv8m.base-eabi | FileCheck %s --check-prefix=V8MBASE7 8define i32 @t1(i32 %c) nounwind readnone {9; ARM-LABEL: t1:10; ARM: @ %bb.0: @ %entry11; ARM-NEXT: mov r1, #10112; ARM-NEXT: cmp r0, #113; ARM-NEXT: orr r1, r1, #25614; ARM-NEXT: movgt r1, #12315; ARM-NEXT: mov r0, r116; ARM-NEXT: mov pc, lr17;18; ARMT2-LABEL: t1:19; ARMT2: @ %bb.0: @ %entry20; ARMT2-NEXT: movw r1, #35721; ARMT2-NEXT: cmp r0, #122; ARMT2-NEXT: movwgt r1, #12323; ARMT2-NEXT: mov r0, r124; ARMT2-NEXT: bx lr25;26; THUMB1-LABEL: t1:27; THUMB1: @ %bb.0: @ %entry28; THUMB1-NEXT: cmp r0, #129; THUMB1-NEXT: bgt .LBB0_230; THUMB1-NEXT: @ %bb.1: @ %entry31; THUMB1-NEXT: movs r0, #25532; THUMB1-NEXT: adds r0, #10233; THUMB1-NEXT: bx lr34; THUMB1-NEXT: .LBB0_2:35; THUMB1-NEXT: movs r0, #12336; THUMB1-NEXT: bx lr37;38; THUMB2-LABEL: t1:39; THUMB2: @ %bb.0: @ %entry40; THUMB2-NEXT: movw r1, #35741; THUMB2-NEXT: cmp r0, #142; THUMB2-NEXT: it gt43; THUMB2-NEXT: movgt r1, #12344; THUMB2-NEXT: mov r0, r145; THUMB2-NEXT: bx lr46;47; V8MBASE-LABEL: t1:48; V8MBASE: @ %bb.0: @ %entry49; V8MBASE-NEXT: cmp r0, #150; V8MBASE-NEXT: bgt .LBB0_251; V8MBASE-NEXT: @ %bb.1: @ %entry52; V8MBASE-NEXT: movw r0, #35753; V8MBASE-NEXT: bx lr54; V8MBASE-NEXT: .LBB0_2:55; V8MBASE-NEXT: movs r0, #12356; V8MBASE-NEXT: bx lr57entry:58 %0 = icmp sgt i32 %c, 159 %1 = select i1 %0, i32 123, i32 35760 ret i32 %161}62 63define i32 @t2(i32 %c) nounwind readnone {64; ARM-LABEL: t2:65; ARM: @ %bb.0: @ %entry66; ARM-NEXT: mov r1, #10167; ARM-NEXT: cmp r0, #168; ARM-NEXT: orr r1, r1, #25669; ARM-NEXT: movle r1, #12370; ARM-NEXT: mov r0, r171; ARM-NEXT: mov pc, lr72;73; ARMT2-LABEL: t2:74; ARMT2: @ %bb.0: @ %entry75; ARMT2-NEXT: mov r1, #12376; ARMT2-NEXT: cmp r0, #177; ARMT2-NEXT: movwgt r1, #35778; ARMT2-NEXT: mov r0, r179; ARMT2-NEXT: bx lr80;81; THUMB1-LABEL: t2:82; THUMB1: @ %bb.0: @ %entry83; THUMB1-NEXT: cmp r0, #184; THUMB1-NEXT: bgt .LBB1_285; THUMB1-NEXT: @ %bb.1: @ %entry86; THUMB1-NEXT: movs r0, #12387; THUMB1-NEXT: bx lr88; THUMB1-NEXT: .LBB1_2:89; THUMB1-NEXT: movs r0, #25590; THUMB1-NEXT: adds r0, #10291; THUMB1-NEXT: bx lr92;93; THUMB2-LABEL: t2:94; THUMB2: @ %bb.0: @ %entry95; THUMB2-NEXT: movs r1, #12396; THUMB2-NEXT: cmp r0, #197; THUMB2-NEXT: it gt98; THUMB2-NEXT: movwgt r1, #35799; THUMB2-NEXT: mov r0, r1100; THUMB2-NEXT: bx lr101;102; V8MBASE-LABEL: t2:103; V8MBASE: @ %bb.0: @ %entry104; V8MBASE-NEXT: mov r1, r0105; V8MBASE-NEXT: movw r0, #357106; V8MBASE-NEXT: cmp r1, #1107; V8MBASE-NEXT: bgt .LBB1_2108; V8MBASE-NEXT: @ %bb.1: @ %entry109; V8MBASE-NEXT: movs r0, #123110; V8MBASE-NEXT: .LBB1_2: @ %entry111; V8MBASE-NEXT: bx lr112entry:113 %0 = icmp sgt i32 %c, 1114 %1 = select i1 %0, i32 357, i32 123115 ret i32 %1116}117 118define i32 @t3(i32 %a) nounwind readnone {119; ARM-LABEL: t3:120; ARM: @ %bb.0: @ %entry121; ARM-NEXT: sub r0, r0, #160122; ARM-NEXT: rsbs r1, r0, #0123; ARM-NEXT: adc r0, r0, r1124; ARM-NEXT: mov pc, lr125;126; ARMT2-LABEL: t3:127; ARMT2: @ %bb.0: @ %entry128; ARMT2-NEXT: sub r0, r0, #160129; ARMT2-NEXT: clz r0, r0130; ARMT2-NEXT: lsr r0, r0, #5131; ARMT2-NEXT: bx lr132;133; THUMB1-LABEL: t3:134; THUMB1: @ %bb.0: @ %entry135; THUMB1-NEXT: subs r0, #160136; THUMB1-NEXT: rsbs r1, r0, #0137; THUMB1-NEXT: adcs r0, r1138; THUMB1-NEXT: bx lr139;140; THUMB2-LABEL: t3:141; THUMB2: @ %bb.0: @ %entry142; THUMB2-NEXT: subs r0, #160143; THUMB2-NEXT: clz r0, r0144; THUMB2-NEXT: lsrs r0, r0, #5145; THUMB2-NEXT: bx lr146;147; V8MBASE-LABEL: t3:148; V8MBASE: @ %bb.0: @ %entry149; V8MBASE-NEXT: subs r0, #160150; V8MBASE-NEXT: rsbs r1, r0, #0151; V8MBASE-NEXT: adcs r0, r1152; V8MBASE-NEXT: bx lr153entry:154 %0 = icmp eq i32 %a, 160155 %1 = zext i1 %0 to i32156 ret i32 %1157}158 159define i32 @t4(i32 %a, i32 %b, i32 %x) nounwind {160; ARM-LABEL: t4:161; ARM: @ %bb.0: @ %entry162; ARM-NEXT: mvn r3, #170163; ARM-NEXT: cmp r0, r1164; ARM-NEXT: sub r3, r3, #11141120165; ARM-NEXT: movge r3, r2166; ARM-NEXT: mov r0, r3167; ARM-NEXT: mov pc, lr168;169; ARMT2-LABEL: t4:170; ARMT2: @ %bb.0: @ %entry171; ARMT2-NEXT: cmp r0, r1172; ARMT2-NEXT: movwlt r2, #65365173; ARMT2-NEXT: movtlt r2, #65365174; ARMT2-NEXT: mov r0, r2175; ARMT2-NEXT: bx lr176;177; THUMB1-LABEL: t4:178; THUMB1: @ %bb.0: @ %entry179; THUMB1-NEXT: cmp r0, r1180; THUMB1-NEXT: bge .LBB3_2181; THUMB1-NEXT: @ %bb.1:182; THUMB1-NEXT: ldr r2, .LCPI3_0183; THUMB1-NEXT: .LBB3_2: @ %entry184; THUMB1-NEXT: mov r0, r2185; THUMB1-NEXT: bx lr186; THUMB1-NEXT: .p2align 2187; THUMB1-NEXT: @ %bb.3:188; THUMB1-NEXT: .LCPI3_0:189; THUMB1-NEXT: .long 4283826005 @ 0xff55ff55190;191; THUMB2-LABEL: t4:192; THUMB2: @ %bb.0: @ %entry193; THUMB2-NEXT: cmp r0, r1194; THUMB2-NEXT: it lt195; THUMB2-NEXT: mvnlt r2, #11141290196; THUMB2-NEXT: mov r0, r2197; THUMB2-NEXT: bx lr198;199; V8MBASE-LABEL: t4:200; V8MBASE: @ %bb.0: @ %entry201; V8MBASE-NEXT: cmp r0, r1202; V8MBASE-NEXT: bge .LBB3_2203; V8MBASE-NEXT: @ %bb.1:204; V8MBASE-NEXT: movw r2, #65365205; V8MBASE-NEXT: movt r2, #65365206; V8MBASE-NEXT: .LBB3_2: @ %entry207; V8MBASE-NEXT: mov r0, r2208; V8MBASE-NEXT: bx lr209entry:210 %0 = icmp slt i32 %a, %b211 %1 = select i1 %0, i32 4283826005, i32 %x212 ret i32 %1213}214 215; rdar://9758317216define i32 @t5(i32 %a) nounwind {217; ARM-LABEL: t5:218; ARM: @ %bb.0: @ %entry219; ARM-NEXT: sub r0, r0, #1220; ARM-NEXT: rsbs r1, r0, #0221; ARM-NEXT: adc r0, r0, r1222; ARM-NEXT: mov pc, lr223;224; ARMT2-LABEL: t5:225; ARMT2: @ %bb.0: @ %entry226; ARMT2-NEXT: sub r0, r0, #1227; ARMT2-NEXT: clz r0, r0228; ARMT2-NEXT: lsr r0, r0, #5229; ARMT2-NEXT: bx lr230;231; THUMB1-LABEL: t5:232; THUMB1: @ %bb.0: @ %entry233; THUMB1-NEXT: subs r1, r0, #1234; THUMB1-NEXT: rsbs r0, r1, #0235; THUMB1-NEXT: adcs r0, r1236; THUMB1-NEXT: bx lr237;238; THUMB2-LABEL: t5:239; THUMB2: @ %bb.0: @ %entry240; THUMB2-NEXT: subs r0, #1241; THUMB2-NEXT: clz r0, r0242; THUMB2-NEXT: lsrs r0, r0, #5243; THUMB2-NEXT: bx lr244;245; V8MBASE-LABEL: t5:246; V8MBASE: @ %bb.0: @ %entry247; V8MBASE-NEXT: subs r1, r0, #1248; V8MBASE-NEXT: rsbs r0, r1, #0249; V8MBASE-NEXT: adcs r0, r1250; V8MBASE-NEXT: bx lr251entry:252 %cmp = icmp eq i32 %a, 1253 %conv = zext i1 %cmp to i32254 ret i32 %conv255}256 257define i32 @t6(i32 %a) nounwind {258; ARM-LABEL: t6:259; ARM: @ %bb.0: @ %entry260; ARM-NEXT: cmp r0, #0261; ARM-NEXT: movne r0, #1262; ARM-NEXT: mov pc, lr263;264; ARMT2-LABEL: t6:265; ARMT2: @ %bb.0: @ %entry266; ARMT2-NEXT: cmp r0, #0267; ARMT2-NEXT: movwne r0, #1268; ARMT2-NEXT: bx lr269;270; THUMB1-LABEL: t6:271; THUMB1: @ %bb.0: @ %entry272; THUMB1-NEXT: subs r1, r0, #1273; THUMB1-NEXT: sbcs r0, r1274; THUMB1-NEXT: bx lr275;276; THUMB2-LABEL: t6:277; THUMB2: @ %bb.0: @ %entry278; THUMB2-NEXT: cmp r0, #0279; THUMB2-NEXT: it ne280; THUMB2-NEXT: movne r0, #1281; THUMB2-NEXT: bx lr282;283; V8MBASE-LABEL: t6:284; V8MBASE: @ %bb.0: @ %entry285; V8MBASE-NEXT: subs r1, r0, #1286; V8MBASE-NEXT: sbcs r0, r1287; V8MBASE-NEXT: bx lr288entry:289 %tobool = icmp ne i32 %a, 0290 %lnot.ext = zext i1 %tobool to i32291 ret i32 %lnot.ext292}293 294define i32 @t7(i32 %a, i32 %b) nounwind readnone {295; ARM-LABEL: t7:296; ARM: @ %bb.0: @ %entry297; ARM-NEXT: subs r0, r0, r1298; ARM-NEXT: movne r0, #4299; ARM-NEXT: mov pc, lr300;301; ARMT2-LABEL: t7:302; ARMT2: @ %bb.0: @ %entry303; ARMT2-NEXT: subs r0, r0, r1304; ARMT2-NEXT: movwne r0, #4305; ARMT2-NEXT: bx lr306;307; THUMB1-LABEL: t7:308; THUMB1: @ %bb.0: @ %entry309; THUMB1-NEXT: subs r0, r0, r1310; THUMB1-NEXT: subs r1, r0, #1311; THUMB1-NEXT: sbcs r0, r1312; THUMB1-NEXT: lsls r0, r0, #2313; THUMB1-NEXT: bx lr314;315; THUMB2-LABEL: t7:316; THUMB2: @ %bb.0: @ %entry317; THUMB2-NEXT: subs r0, r0, r1318; THUMB2-NEXT: it ne319; THUMB2-NEXT: movne r0, #4320; THUMB2-NEXT: bx lr321;322; V8MBASE-LABEL: t7:323; V8MBASE: @ %bb.0: @ %entry324; V8MBASE-NEXT: subs r0, r0, r1325; V8MBASE-NEXT: subs r1, r0, #1326; V8MBASE-NEXT: sbcs r0, r1327; V8MBASE-NEXT: lsls r0, r0, #2328; V8MBASE-NEXT: bx lr329entry:330 %0 = icmp ne i32 %a, %b331 %1 = select i1 %0, i32 4, i32 0332 ret i32 %1333}334 335; ARM scheduler emits icmp/zext before both calls, so isn't relevant336define void @t8(i32 %a) {337; ARM-LABEL: t8:338; ARM: @ %bb.0: @ %entry339; ARM-NEXT: .save {r4, lr}340; ARM-NEXT: push {r4, lr}341; ARM-NEXT: mov r1, r0342; ARM-NEXT: sub r0, r0, #5343; ARM-NEXT: rsbs r2, r0, #0344; ARM-NEXT: adc r4, r0, r2345; ARM-NEXT: mov r0, #9346; ARM-NEXT: bl t7347; ARM-NEXT: mov r1, r0348; ARM-NEXT: mov r0, r4349; ARM-NEXT: pop {r4, lr}350; ARM-NEXT: b t7351;352; ARMT2-LABEL: t8:353; ARMT2: @ %bb.0: @ %entry354; ARMT2-NEXT: .save {r4, lr}355; ARMT2-NEXT: push {r4, lr}356; ARMT2-NEXT: mov r4, r0357; ARMT2-NEXT: mov r0, #9358; ARMT2-NEXT: mov r1, r4359; ARMT2-NEXT: bl t7360; ARMT2-NEXT: mov r1, r0361; ARMT2-NEXT: sub r0, r4, #5362; ARMT2-NEXT: clz r0, r0363; ARMT2-NEXT: lsr r0, r0, #5364; ARMT2-NEXT: pop {r4, lr}365; ARMT2-NEXT: b t7366;367; THUMB1-LABEL: t8:368; THUMB1: @ %bb.0: @ %entry369; THUMB1-NEXT: .save {r4, lr}370; THUMB1-NEXT: push {r4, lr}371; THUMB1-NEXT: mov r4, r0372; THUMB1-NEXT: movs r0, #9373; THUMB1-NEXT: mov r1, r4374; THUMB1-NEXT: bl t7375; THUMB1-NEXT: mov r1, r0376; THUMB1-NEXT: subs r2, r4, #5377; THUMB1-NEXT: rsbs r0, r2, #0378; THUMB1-NEXT: adcs r0, r2379; THUMB1-NEXT: bl t7380; THUMB1-NEXT: pop {r4, pc}381;382; THUMB2-LABEL: t8:383; THUMB2: @ %bb.0: @ %entry384; THUMB2-NEXT: .save {r4, lr}385; THUMB2-NEXT: push {r4, lr}386; THUMB2-NEXT: mov r4, r0387; THUMB2-NEXT: movs r0, #9388; THUMB2-NEXT: mov r1, r4389; THUMB2-NEXT: bl t7390; THUMB2-NEXT: mov r1, r0391; THUMB2-NEXT: subs r0, r4, #5392; THUMB2-NEXT: clz r0, r0393; THUMB2-NEXT: lsrs r0, r0, #5394; THUMB2-NEXT: pop.w {r4, lr}395; THUMB2-NEXT: b t7396;397; V8MBASE-LABEL: t8:398; V8MBASE: @ %bb.0: @ %entry399; V8MBASE-NEXT: .save {r4, lr}400; V8MBASE-NEXT: push {r4, lr}401; V8MBASE-NEXT: mov r1, r0402; V8MBASE-NEXT: subs r0, r0, #5403; V8MBASE-NEXT: rsbs r4, r0, #0404; V8MBASE-NEXT: adcs r4, r0405; V8MBASE-NEXT: movs r0, #9406; V8MBASE-NEXT: bl t7407; V8MBASE-NEXT: mov r1, r0408; V8MBASE-NEXT: mov r0, r4409; V8MBASE-NEXT: pop {r4}410; V8MBASE-NEXT: pop {r2}411; V8MBASE-NEXT: mov lr, r2412; V8MBASE-NEXT: b t7413entry:414 %cmp = icmp eq i32 %a, 5415 %conv = zext i1 %cmp to i32416 %call = tail call i32 @t7(i32 9, i32 %a)417 tail call i32 @t7(i32 %conv, i32 %call)418 ret void419}420 421; ARM scheduler emits icmp/zext before both calls, so isn't relevant422define void @t9(ptr %a, i8 %b) {423; ARM-LABEL: t9:424; ARM: @ %bb.0: @ %entry425; ARM-NEXT: .save {r4, lr}426; ARM-NEXT: push {r4, lr}427; ARM-NEXT: ldrsb r4, [r0]428; ARM-NEXT: mov r0, #1429; ARM-NEXT: bl f430; ARM-NEXT: and r0, r4, #255431; ARM-NEXT: cmp r0, r0432; ARM-NEXT: bne .LBB8_3433; ARM-NEXT: @ %bb.1: @ %while.body.preheader434; ARM-NEXT: add r1, r4, #1435; ARM-NEXT: mov r2, r0436; ARM-NEXT: .LBB8_2: @ %while.body437; ARM-NEXT: @ =>This Inner Loop Header: Depth=1438; ARM-NEXT: add r2, r2, #1439; ARM-NEXT: add r1, r1, #1440; ARM-NEXT: and r3, r2, #255441; ARM-NEXT: cmp r3, r0442; ARM-NEXT: blt .LBB8_2443; ARM-NEXT: .LBB8_3: @ %while.end444; ARM-NEXT: pop {r4, lr}445; ARM-NEXT: mov pc, lr446;447; ARMT2-LABEL: t9:448; ARMT2: @ %bb.0: @ %entry449; ARMT2-NEXT: .save {r4, lr}450; ARMT2-NEXT: push {r4, lr}451; ARMT2-NEXT: ldrsb r4, [r0]452; ARMT2-NEXT: mov r0, #1453; ARMT2-NEXT: bl f454; ARMT2-NEXT: uxtb r0, r4455; ARMT2-NEXT: cmp r0, r0456; ARMT2-NEXT: popne {r4, pc}457; ARMT2-NEXT: .LBB8_1: @ %while.body.preheader458; ARMT2-NEXT: add r1, r4, #1459; ARMT2-NEXT: mov r2, r0460; ARMT2-NEXT: .LBB8_2: @ %while.body461; ARMT2-NEXT: @ =>This Inner Loop Header: Depth=1462; ARMT2-NEXT: add r2, r2, #1463; ARMT2-NEXT: add r1, r1, #1464; ARMT2-NEXT: uxtb r3, r2465; ARMT2-NEXT: cmp r3, r0466; ARMT2-NEXT: blt .LBB8_2467; ARMT2-NEXT: @ %bb.3: @ %while.end468; ARMT2-NEXT: pop {r4, pc}469;470; THUMB1-LABEL: t9:471; THUMB1: @ %bb.0: @ %entry472; THUMB1-NEXT: .save {r4, lr}473; THUMB1-NEXT: push {r4, lr}474; THUMB1-NEXT: movs r1, #0475; THUMB1-NEXT: ldrsb r4, [r0, r1]476; THUMB1-NEXT: movs r0, #1477; THUMB1-NEXT: bl f478; THUMB1-NEXT: uxtb r0, r4479; THUMB1-NEXT: cmp r0, r0480; THUMB1-NEXT: bne .LBB8_3481; THUMB1-NEXT: @ %bb.1: @ %while.body.preheader482; THUMB1-NEXT: adds r1, r4, #1483; THUMB1-NEXT: mov r2, r0484; THUMB1-NEXT: .LBB8_2: @ %while.body485; THUMB1-NEXT: @ =>This Inner Loop Header: Depth=1486; THUMB1-NEXT: adds r1, r1, #1487; THUMB1-NEXT: adds r2, r2, #1488; THUMB1-NEXT: uxtb r3, r2489; THUMB1-NEXT: cmp r3, r0490; THUMB1-NEXT: blt .LBB8_2491; THUMB1-NEXT: .LBB8_3: @ %while.end492; THUMB1-NEXT: pop {r4, pc}493;494; THUMB2-LABEL: t9:495; THUMB2: @ %bb.0: @ %entry496; THUMB2-NEXT: .save {r4, lr}497; THUMB2-NEXT: push {r4, lr}498; THUMB2-NEXT: ldrsb.w r4, [r0]499; THUMB2-NEXT: movs r0, #1500; THUMB2-NEXT: bl f501; THUMB2-NEXT: uxtb r0, r4502; THUMB2-NEXT: cmp r0, r0503; THUMB2-NEXT: it ne504; THUMB2-NEXT: popne {r4, pc}505; THUMB2-NEXT: .LBB8_1: @ %while.body.preheader506; THUMB2-NEXT: adds r1, r4, #1507; THUMB2-NEXT: mov r2, r0508; THUMB2-NEXT: .LBB8_2: @ %while.body509; THUMB2-NEXT: @ =>This Inner Loop Header: Depth=1510; THUMB2-NEXT: adds r2, #1511; THUMB2-NEXT: adds r1, #1512; THUMB2-NEXT: uxtb r3, r2513; THUMB2-NEXT: cmp r3, r0514; THUMB2-NEXT: blt .LBB8_2515; THUMB2-NEXT: @ %bb.3: @ %while.end516; THUMB2-NEXT: pop {r4, pc}517;518; V8MBASE-LABEL: t9:519; V8MBASE: @ %bb.0: @ %entry520; V8MBASE-NEXT: .save {r4, lr}521; V8MBASE-NEXT: push {r4, lr}522; V8MBASE-NEXT: movs r1, #0523; V8MBASE-NEXT: ldrsb r4, [r0, r1]524; V8MBASE-NEXT: movs r0, #1525; V8MBASE-NEXT: bl f526; V8MBASE-NEXT: uxtb r0, r4527; V8MBASE-NEXT: cmp r0, r0528; V8MBASE-NEXT: bne .LBB8_3529; V8MBASE-NEXT: @ %bb.1: @ %while.body.preheader530; V8MBASE-NEXT: adds r1, r4, #1531; V8MBASE-NEXT: mov r2, r0532; V8MBASE-NEXT: .LBB8_2: @ %while.body533; V8MBASE-NEXT: @ =>This Inner Loop Header: Depth=1534; V8MBASE-NEXT: adds r1, r1, #1535; V8MBASE-NEXT: adds r2, r2, #1536; V8MBASE-NEXT: uxtb r3, r2537; V8MBASE-NEXT: cmp r3, r0538; V8MBASE-NEXT: blt .LBB8_2539; V8MBASE-NEXT: .LBB8_3: @ %while.end540; V8MBASE-NEXT: pop {r4, pc}541entry:542 %0 = load i8, ptr %a543 %conv = sext i8 %0 to i32544 %conv119 = zext i8 %0 to i32545 %conv522 = and i32 %conv, 255546 %cmp723 = icmp eq i32 %conv522, %conv119547 tail call void @f(i1 zeroext %cmp723)548 br i1 %cmp723, label %while.body, label %while.end549 550while.body: ; preds = %entry, %while.body551 %ref.025 = phi i8 [ %inc9, %while.body ], [ %0, %entry ]552 %in.024 = phi i32 [ %inc, %while.body ], [ %conv, %entry ]553 %inc = add i32 %in.024, 1554 %inc9 = add i8 %ref.025, 1555 %conv1 = zext i8 %inc9 to i32556 %cmp = icmp slt i32 %conv1, %conv119557 %conv5 = and i32 %inc, 255558 br i1 %cmp, label %while.body, label %while.end559 560while.end:561 ret void562}563 564declare void @f(i1 zeroext)565 566define i1 @t10() {567; ARM-LABEL: t10:568; ARM: @ %bb.0: @ %entry569; ARM-NEXT: .save {r11, lr}570; ARM-NEXT: push {r11, lr}571; ARM-NEXT: .pad #8572; ARM-NEXT: sub sp, sp, #8573; ARM-NEXT: mvn r0, #2574; ARM-NEXT: mvn r1, #7575; ARM-NEXT: str r0, [sp, #4]576; ARM-NEXT: mvn r0, #7577; ARM-NEXT: str r0, [sp]578; ARM-NEXT: mvn r0, #2579; ARM-NEXT: bl __aeabi_idivmod580; ARM-NEXT: sub r0, r1, r0, lsl #3581; ARM-NEXT: add r0, r0, #3582; ARM-NEXT: rsbs r1, r0, #0583; ARM-NEXT: adc r0, r0, r1584; ARM-NEXT: add sp, sp, #8585; ARM-NEXT: pop {r11, lr}586; ARM-NEXT: mov pc, lr587;588; ARMT2-LABEL: t10:589; ARMT2: @ %bb.0: @ %entry590; ARMT2-NEXT: .save {r11, lr}591; ARMT2-NEXT: push {r11, lr}592; ARMT2-NEXT: .pad #8593; ARMT2-NEXT: sub sp, sp, #8594; ARMT2-NEXT: mvn r0, #2595; ARMT2-NEXT: str r0, [sp, #4]596; ARMT2-NEXT: mvn r0, #7597; ARMT2-NEXT: str r0, [sp]598; ARMT2-NEXT: mvn r0, #2599; ARMT2-NEXT: mvn r1, #7600; ARMT2-NEXT: bl __aeabi_idivmod601; ARMT2-NEXT: sub r0, r1, r0, lsl #3602; ARMT2-NEXT: add r0, r0, #3603; ARMT2-NEXT: clz r0, r0604; ARMT2-NEXT: lsr r0, r0, #5605; ARMT2-NEXT: add sp, sp, #8606; ARMT2-NEXT: pop {r11, pc}607;608; THUMB1-LABEL: t10:609; THUMB1: @ %bb.0: @ %entry610; THUMB1-NEXT: .save {r4, r5, r7, lr}611; THUMB1-NEXT: push {r4, r5, r7, lr}612; THUMB1-NEXT: .pad #8613; THUMB1-NEXT: sub sp, #8614; THUMB1-NEXT: movs r0, #7615; THUMB1-NEXT: mvns r4, r0616; THUMB1-NEXT: str r4, [sp]617; THUMB1-NEXT: adds r5, r4, #5618; THUMB1-NEXT: str r5, [sp, #4]619; THUMB1-NEXT: mov r0, r5620; THUMB1-NEXT: mov r1, r4621; THUMB1-NEXT: bl __aeabi_idivmod622; THUMB1-NEXT: muls r0, r4, r0623; THUMB1-NEXT: adds r0, r0, r1624; THUMB1-NEXT: subs r1, r0, r5625; THUMB1-NEXT: rsbs r0, r1, #0626; THUMB1-NEXT: adcs r0, r1627; THUMB1-NEXT: add sp, #8628; THUMB1-NEXT: pop {r4, r5, r7, pc}629;630; THUMB2-LABEL: t10:631; THUMB2: @ %bb.0: @ %entry632; THUMB2-NEXT: .save {r7, lr}633; THUMB2-NEXT: push {r7, lr}634; THUMB2-NEXT: .pad #8635; THUMB2-NEXT: sub sp, #8636; THUMB2-NEXT: mvn r0, #2637; THUMB2-NEXT: str r0, [sp, #4]638; THUMB2-NEXT: mvn r0, #7639; THUMB2-NEXT: str r0, [sp]640; THUMB2-NEXT: mvn r0, #2641; THUMB2-NEXT: mvn r1, #7642; THUMB2-NEXT: bl __aeabi_idivmod643; THUMB2-NEXT: sub.w r0, r1, r0, lsl #3644; THUMB2-NEXT: adds r0, #3645; THUMB2-NEXT: clz r0, r0646; THUMB2-NEXT: lsrs r0, r0, #5647; THUMB2-NEXT: add sp, #8648; THUMB2-NEXT: pop {r7, pc}649;650; V8MBASE-LABEL: t10:651; V8MBASE: @ %bb.0: @ %entry652; V8MBASE-NEXT: .pad #8653; V8MBASE-NEXT: sub sp, #8654; V8MBASE-NEXT: movs r0, #7655; V8MBASE-NEXT: mvns r1, r0656; V8MBASE-NEXT: str r1, [sp]657; V8MBASE-NEXT: adds r0, r1, #5658; V8MBASE-NEXT: str r0, [sp, #4]659; V8MBASE-NEXT: adds r1, #8660; V8MBASE-NEXT: rsbs r0, r1, #0661; V8MBASE-NEXT: adcs r0, r1662; V8MBASE-NEXT: add sp, #8663; V8MBASE-NEXT: bx lr664entry:665 %q = alloca i32666 %p = alloca i32667 store i32 -3, ptr %q668 store i32 -8, ptr %p669 %0 = load i32, ptr %q670 %1 = load i32, ptr %p671 %div = sdiv i32 %0, %1672 %mul = mul nsw i32 %div, %1673 %rem = srem i32 %0, %1674 %add = add nsw i32 %mul, %rem675 %cmp = icmp eq i32 %add, %0676 ret i1 %cmp677}678 679define i1 @t11() {680; ARM-LABEL: t11:681; ARM: @ %bb.0: @ %entry682; ARM-NEXT: .pad #4683; ARM-NEXT: sub sp, sp, #4684; ARM-NEXT: ldr r0, [sp]685; ARM-NEXT: mov r1, #40960686; ARM-NEXT: orr r1, r1, #-33554432687; ARM-NEXT: orr r0, r0, #40960688; ARM-NEXT: and r0, r0, r1689; ARM-NEXT: orr r0, r0, #3690; ARM-NEXT: str r0, [sp]691; ARM-NEXT: mov r0, #1692; ARM-NEXT: add sp, sp, #4693; ARM-NEXT: mov pc, lr694;695; ARMT2-LABEL: t11:696; ARMT2: @ %bb.0: @ %entry697; ARMT2-NEXT: .pad #4698; ARMT2-NEXT: sub sp, sp, #4699; ARMT2-NEXT: ldr r1, [sp]700; ARMT2-NEXT: mov r0, #33701; ARMT2-NEXT: movw r2, #39322702; ARMT2-NEXT: movt r2, #6553703; ARMT2-NEXT: bfi r1, r0, #0, #12704; ARMT2-NEXT: mov r0, #10705; ARMT2-NEXT: bfi r1, r0, #12, #13706; ARMT2-NEXT: mov r0, r1707; ARMT2-NEXT: bfc r0, #12, #20708; ARMT2-NEXT: umull r2, r3, r0, r2709; ARMT2-NEXT: add r2, r3, r3, lsl #2710; ARMT2-NEXT: sub r0, r0, r2, lsl #1711; ARMT2-NEXT: movw r2, #40960712; ARMT2-NEXT: movt r2, #65024713; ARMT2-NEXT: and r1, r1, r2714; ARMT2-NEXT: orr r0, r1, r0715; ARMT2-NEXT: str r0, [sp]716; ARMT2-NEXT: and r0, r0, #15717; ARMT2-NEXT: sub r0, r0, #3718; ARMT2-NEXT: clz r0, r0719; ARMT2-NEXT: lsr r0, r0, #5720; ARMT2-NEXT: add sp, sp, #4721; ARMT2-NEXT: bx lr722;723; THUMB1-LABEL: t11:724; THUMB1: @ %bb.0: @ %entry725; THUMB1-NEXT: .save {r4, r5, r7, lr}726; THUMB1-NEXT: push {r4, r5, r7, lr}727; THUMB1-NEXT: .pad #8728; THUMB1-NEXT: sub sp, #8729; THUMB1-NEXT: movs r4, #33730; THUMB1-NEXT: ldr r0, [sp, #4]731; THUMB1-NEXT: orrs r0, r4732; THUMB1-NEXT: ldr r1, .LCPI10_0733; THUMB1-NEXT: ands r1, r0734; THUMB1-NEXT: movs r0, #5735; THUMB1-NEXT: lsls r0, r0, #13736; THUMB1-NEXT: adds r5, r1, r0737; THUMB1-NEXT: movs r1, #10738; THUMB1-NEXT: mov r0, r4739; THUMB1-NEXT: bl __aeabi_uidivmod740; THUMB1-NEXT: bics r5, r4741; THUMB1-NEXT: orrs r5, r1742; THUMB1-NEXT: str r5, [sp, #4]743; THUMB1-NEXT: ldr r0, .LCPI10_1744; THUMB1-NEXT: ands r0, r5745; THUMB1-NEXT: subs r1, r0, #3746; THUMB1-NEXT: rsbs r0, r1, #0747; THUMB1-NEXT: adcs r0, r1748; THUMB1-NEXT: add sp, #8749; THUMB1-NEXT: pop {r4, r5, r7, pc}750; THUMB1-NEXT: .p2align 2751; THUMB1-NEXT: @ %bb.1:752; THUMB1-NEXT: .LCPI10_0:753; THUMB1-NEXT: .long 4261412897 @ 0xfe000021754; THUMB1-NEXT: .LCPI10_1:755; THUMB1-NEXT: .long 4095 @ 0xfff756;757; THUMB2-LABEL: t11:758; THUMB2: @ %bb.0: @ %entry759; THUMB2-NEXT: .pad #4760; THUMB2-NEXT: sub sp, #4761; THUMB2-NEXT: ldr r1, [sp]762; THUMB2-NEXT: movs r0, #33763; THUMB2-NEXT: movw r2, #39322764; THUMB2-NEXT: bfi r1, r0, #0, #12765; THUMB2-NEXT: movs r0, #10766; THUMB2-NEXT: bfi r1, r0, #12, #13767; THUMB2-NEXT: mov r0, r1768; THUMB2-NEXT: movt r2, #6553769; THUMB2-NEXT: bfc r0, #12, #20770; THUMB2-NEXT: umull r2, r3, r0, r2771; THUMB2-NEXT: add.w r2, r3, r3, lsl #2772; THUMB2-NEXT: sub.w r0, r0, r2, lsl #1773; THUMB2-NEXT: movw r2, #40960774; THUMB2-NEXT: movt r2, #65024775; THUMB2-NEXT: ands r1, r2776; THUMB2-NEXT: orrs r0, r1777; THUMB2-NEXT: str r0, [sp]778; THUMB2-NEXT: and r0, r0, #15779; THUMB2-NEXT: subs r0, #3780; THUMB2-NEXT: clz r0, r0781; THUMB2-NEXT: lsrs r0, r0, #5782; THUMB2-NEXT: add sp, #4783; THUMB2-NEXT: bx lr784;785; V8MBASE-LABEL: t11:786; V8MBASE: @ %bb.0: @ %entry787; V8MBASE-NEXT: .pad #4788; V8MBASE-NEXT: sub sp, #4789; V8MBASE-NEXT: movs r0, #127790; V8MBASE-NEXT: lsls r0, r0, #25791; V8MBASE-NEXT: ldr r1, [sp]792; V8MBASE-NEXT: ands r1, r0793; V8MBASE-NEXT: movw r0, #40963794; V8MBASE-NEXT: adds r0, r1, r0795; V8MBASE-NEXT: str r0, [sp]796; V8MBASE-NEXT: movs r1, #0797; V8MBASE-NEXT: rsbs r0, r1, #0798; V8MBASE-NEXT: adcs r0, r1799; V8MBASE-NEXT: add sp, #4800; V8MBASE-NEXT: bx lr801entry:802 %bit = alloca i32803 %load = load i32, ptr %bit804 %clear = and i32 %load, -4096805 %set = or i32 %clear, 33806 store i32 %set, ptr %bit807 %load1 = load i32, ptr %bit808 %clear2 = and i32 %load1, -33550337809 %set3 = or i32 %clear2, 40960810 %clear5 = and i32 %set3, 4095811 %rem = srem i32 %clear5, 10812 %clear9 = and i32 %set3, -4096813 %set10 = or i32 %clear9, %rem814 store i32 %set10, ptr %bit815 %clear12 = and i32 %set10, 4095816 %cmp = icmp eq i32 %clear12, 3817 ret i1 %cmp818}819 820define i32 @t12(i32 %a) nounwind {821; ARM-LABEL: t12:822; ARM: @ %bb.0: @ %entry823; ARM-NEXT: cmp r0, #0824; ARM-NEXT: movne r0, #2825; ARM-NEXT: mov pc, lr826;827; ARMT2-LABEL: t12:828; ARMT2: @ %bb.0: @ %entry829; ARMT2-NEXT: cmp r0, #0830; ARMT2-NEXT: movwne r0, #2831; ARMT2-NEXT: bx lr832;833; THUMB1-LABEL: t12:834; THUMB1: @ %bb.0: @ %entry835; THUMB1-NEXT: subs r1, r0, #1836; THUMB1-NEXT: sbcs r0, r1837; THUMB1-NEXT: lsls r0, r0, #1838; THUMB1-NEXT: bx lr839;840; THUMB2-LABEL: t12:841; THUMB2: @ %bb.0: @ %entry842; THUMB2-NEXT: cmp r0, #0843; THUMB2-NEXT: it ne844; THUMB2-NEXT: movne r0, #2845; THUMB2-NEXT: bx lr846;847; V8MBASE-LABEL: t12:848; V8MBASE: @ %bb.0: @ %entry849; V8MBASE-NEXT: subs r1, r0, #1850; V8MBASE-NEXT: sbcs r0, r1851; V8MBASE-NEXT: lsls r0, r0, #1852; V8MBASE-NEXT: bx lr853entry:854 %tobool = icmp ne i32 %a, 0855 %lnot.ext = select i1 %tobool, i32 2, i32 0856 ret i32 %lnot.ext857}858 859define i32 @t13(i32 %a) nounwind {860; ARM-LABEL: t13:861; ARM: @ %bb.0: @ %entry862; ARM-NEXT: cmp r0, #0863; ARM-NEXT: movne r0, #3864; ARM-NEXT: mov pc, lr865;866; ARMT2-LABEL: t13:867; ARMT2: @ %bb.0: @ %entry868; ARMT2-NEXT: cmp r0, #0869; ARMT2-NEXT: movwne r0, #3870; ARMT2-NEXT: bx lr871;872; THUMB1-LABEL: t13:873; THUMB1: @ %bb.0: @ %entry874; THUMB1-NEXT: cmp r0, #0875; THUMB1-NEXT: beq .LBB12_2876; THUMB1-NEXT: @ %bb.1:877; THUMB1-NEXT: movs r0, #3878; THUMB1-NEXT: .LBB12_2: @ %entry879; THUMB1-NEXT: bx lr880;881; THUMB2-LABEL: t13:882; THUMB2: @ %bb.0: @ %entry883; THUMB2-NEXT: cmp r0, #0884; THUMB2-NEXT: it ne885; THUMB2-NEXT: movne r0, #3886; THUMB2-NEXT: bx lr887;888; V8MBASE-LABEL: t13:889; V8MBASE: @ %bb.0: @ %entry890; V8MBASE-NEXT: cbz r0, .LBB12_2891; V8MBASE-NEXT: @ %bb.1:892; V8MBASE-NEXT: movs r0, #3893; V8MBASE-NEXT: .LBB12_2: @ %entry894; V8MBASE-NEXT: bx lr895entry:896 %tobool = icmp ne i32 %a, 0897 %lnot.ext = select i1 %tobool, i32 3, i32 0898 ret i32 %lnot.ext899}900