390 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -keep-loops="false" < %s -mtriple=thumbv7-apple-ios -mcpu=cortex-a8 | FileCheck %s3; RUN: llc -keep-loops="false" < %s -mtriple=thumbv8 | FileCheck -check-prefix=CHECK-V8 %s4; RUN: llc -keep-loops="false" < %s -mtriple=thumbv7 -arm-restrict-it | FileCheck -check-prefix=CHECK-RESTRICT-IT %s5 6define i32 @t1(i32 %a, i32 %b, ptr %retaddr) {7; CHECK-LABEL: t1:8; CHECK: @ %bb.0:9; CHECK-NEXT: ldr r3, LCPI0_010; CHECK-NEXT: cmp r0, #011; CHECK-NEXT: LPC0_0:12; CHECK-NEXT: add r3, pc13; CHECK-NEXT: str r3, [r2]14; CHECK-NEXT: mov.w r2, #115; CHECK-NEXT: it eq16; CHECK-NEXT: moveq.w r2, #-117; CHECK-NEXT: Ltmp0: @ Block address taken18; CHECK-NEXT: @ %bb.1: @ %common.ret19; CHECK-NEXT: adds r0, r1, r220; CHECK-NEXT: bx lr21; CHECK-NEXT: .p2align 222; CHECK-NEXT: @ %bb.2:23; CHECK-NEXT: .data_region24; CHECK-NEXT: LCPI0_0:25; CHECK-NEXT: .long Ltmp0-(LPC0_0+4)26; CHECK-NEXT: .end_data_region27;28; CHECK-V8-LABEL: t1:29; CHECK-V8: @ %bb.0:30; CHECK-V8-NEXT: ldr r3, .LCPI0_031; CHECK-V8-NEXT: cmp r0, #032; CHECK-V8-NEXT: str r3, [r2]33; CHECK-V8-NEXT: mov.w r2, #134; CHECK-V8-NEXT: it eq35; CHECK-V8-NEXT: moveq.w r2, #-136; CHECK-V8-NEXT: .Ltmp0: @ Block address taken37; CHECK-V8-NEXT: @ %bb.1: @ %common.ret38; CHECK-V8-NEXT: adds r0, r1, r239; CHECK-V8-NEXT: bx lr40; CHECK-V8-NEXT: .p2align 241; CHECK-V8-NEXT: @ %bb.2:42; CHECK-V8-NEXT: .LCPI0_0:43; CHECK-V8-NEXT: .long .Ltmp044;45; CHECK-RESTRICT-IT-LABEL: t1:46; CHECK-RESTRICT-IT: @ %bb.0:47; CHECK-RESTRICT-IT-NEXT: ldr r3, .LCPI0_048; CHECK-RESTRICT-IT-NEXT: str r3, [r2]49; CHECK-RESTRICT-IT-NEXT: movs r2, #150; CHECK-RESTRICT-IT-NEXT: cmp r0, #051; CHECK-RESTRICT-IT-NEXT: it eq52; CHECK-RESTRICT-IT-NEXT: moveq.w r2, #-153; CHECK-RESTRICT-IT-NEXT: .Ltmp0: @ Block address taken54; CHECK-RESTRICT-IT-NEXT: @ %bb.1: @ %common.ret55; CHECK-RESTRICT-IT-NEXT: adds r0, r1, r256; CHECK-RESTRICT-IT-NEXT: bx lr57; CHECK-RESTRICT-IT-NEXT: .p2align 258; CHECK-RESTRICT-IT-NEXT: @ %bb.2:59; CHECK-RESTRICT-IT-NEXT: .LCPI0_0:60; CHECK-RESTRICT-IT-NEXT: .long .Ltmp061 store ptr blockaddress(@t1, %cond_true), ptr %retaddr62 %tmp2 = icmp eq i32 %a, 063 br i1 %tmp2, label %cond_false, label %cond_true64 65cond_true:66 %tmp5 = add i32 %b, 167 ret i32 %tmp568 69cond_false:70 %tmp7 = add i32 %b, -171 ret i32 %tmp772}73 74define i32 @t2(i32 %a, i32 %b, i32 %c, i32 %d, ptr %retaddr) {75; CHECK-LABEL: t2:76; CHECK: @ %bb.0:77; CHECK-NEXT: ldr.w r9, [sp]78; CHECK-NEXT: add r0, r179; CHECK-NEXT: ldr.w r12, LCPI1_080; CHECK-NEXT: cmp r3, #381; CHECK-NEXT: LPC1_0:82; CHECK-NEXT: add r12, pc83; CHECK-NEXT: str.w r12, [r9]84; CHECK-NEXT: it gt85; CHECK-NEXT: bxgt lr86; CHECK-NEXT: LBB1_1:87; CHECK-NEXT: cmp r2, #1088; CHECK-NEXT: ble LBB1_389; CHECK-NEXT: Ltmp1: @ Block address taken90; CHECK-NEXT: @ %bb.2: @ %cond_true91; CHECK-NEXT: add r0, r292; CHECK-NEXT: subs r0, r0, r393; CHECK-NEXT: LBB1_3: @ %common.ret94; CHECK-NEXT: bx lr95; CHECK-NEXT: .p2align 296; CHECK-NEXT: @ %bb.4:97; CHECK-NEXT: .data_region98; CHECK-NEXT: LCPI1_0:99; CHECK-NEXT: .long Ltmp1-(LPC1_0+4)100; CHECK-NEXT: .end_data_region101;102; CHECK-V8-LABEL: t2:103; CHECK-V8: @ %bb.0:104; CHECK-V8-NEXT: push {r7, lr}105; CHECK-V8-NEXT: ldr.w r12, [sp, #8]106; CHECK-V8-NEXT: add r0, r1107; CHECK-V8-NEXT: ldr.w lr, .LCPI1_0108; CHECK-V8-NEXT: cmp r3, #3109; CHECK-V8-NEXT: str.w lr, [r12]110; CHECK-V8-NEXT: it gt111; CHECK-V8-NEXT: popgt {r7, pc}112; CHECK-V8-NEXT: .LBB1_1:113; CHECK-V8-NEXT: cmp r2, #10114; CHECK-V8-NEXT: ble .LBB1_3115; CHECK-V8-NEXT: .Ltmp1: @ Block address taken116; CHECK-V8-NEXT: @ %bb.2: @ %cond_true117; CHECK-V8-NEXT: add r0, r2118; CHECK-V8-NEXT: subs r0, r0, r3119; CHECK-V8-NEXT: .LBB1_3: @ %common.ret120; CHECK-V8-NEXT: pop {r7, pc}121; CHECK-V8-NEXT: .p2align 2122; CHECK-V8-NEXT: @ %bb.4:123; CHECK-V8-NEXT: .LCPI1_0:124; CHECK-V8-NEXT: .long .Ltmp1125;126; CHECK-RESTRICT-IT-LABEL: t2:127; CHECK-RESTRICT-IT: @ %bb.0:128; CHECK-RESTRICT-IT-NEXT: push {r7, lr}129; CHECK-RESTRICT-IT-NEXT: ldr.w r12, [sp, #8]130; CHECK-RESTRICT-IT-NEXT: add r0, r1131; CHECK-RESTRICT-IT-NEXT: ldr.w lr, .LCPI1_0132; CHECK-RESTRICT-IT-NEXT: cmp r3, #3133; CHECK-RESTRICT-IT-NEXT: str.w lr, [r12]134; CHECK-RESTRICT-IT-NEXT: bgt .LBB1_3135; CHECK-RESTRICT-IT-NEXT: @ %bb.1:136; CHECK-RESTRICT-IT-NEXT: cmp r2, #10137; CHECK-RESTRICT-IT-NEXT: ble .LBB1_3138; CHECK-RESTRICT-IT-NEXT: .Ltmp1: @ Block address taken139; CHECK-RESTRICT-IT-NEXT: @ %bb.2: @ %cond_true140; CHECK-RESTRICT-IT-NEXT: add r0, r2141; CHECK-RESTRICT-IT-NEXT: subs r0, r0, r3142; CHECK-RESTRICT-IT-NEXT: .LBB1_3: @ %common.ret143; CHECK-RESTRICT-IT-NEXT: pop {r7, pc}144; CHECK-RESTRICT-IT-NEXT: .p2align 2145; CHECK-RESTRICT-IT-NEXT: @ %bb.4:146; CHECK-RESTRICT-IT-NEXT: .LCPI1_0:147; CHECK-RESTRICT-IT-NEXT: .long .Ltmp1148 store ptr blockaddress(@t2, %cond_true), ptr %retaddr149 %tmp2 = icmp sgt i32 %c, 10150 %tmp5 = icmp slt i32 %d, 4151 %tmp8 = and i1 %tmp5, %tmp2152 %tmp13 = add i32 %b, %a153 br i1 %tmp8, label %cond_true, label %UnifiedReturnBlock154 155cond_true:156 %tmp15 = add i32 %tmp13, %c157 %tmp1821 = sub i32 %tmp15, %d158 ret i32 %tmp1821159 160UnifiedReturnBlock:161 ret i32 %tmp13162}163 164define hidden fastcc void @t3(ptr %retaddr, i1 %tst, ptr %p8) {165; CHECK-LABEL: t3:166; CHECK: @ %bb.0: @ %bb167; CHECK-NEXT: ldr r1, LCPI2_0168; CHECK-NEXT: LPC2_0:169; CHECK-NEXT: add r1, pc170; CHECK-NEXT: str r1, [r0]171; CHECK-NEXT: Ltmp2: @ Block address taken172; CHECK-NEXT: @ %bb.1: @ %common.ret173; CHECK-NEXT: bx lr174; CHECK-NEXT: .p2align 2175; CHECK-NEXT: @ %bb.2:176; CHECK-NEXT: .data_region177; CHECK-NEXT: LCPI2_0:178; CHECK-NEXT: .long Ltmp2-(LPC2_0+4)179; CHECK-NEXT: .end_data_region180;181; CHECK-V8-LABEL: t3:182; CHECK-V8: @ %bb.0: @ %bb183; CHECK-V8-NEXT: ldr r1, .LCPI2_0184; CHECK-V8-NEXT: str r1, [r0]185; CHECK-V8-NEXT: .Ltmp2: @ Block address taken186; CHECK-V8-NEXT: @ %bb.1: @ %common.ret187; CHECK-V8-NEXT: bx lr188; CHECK-V8-NEXT: .p2align 2189; CHECK-V8-NEXT: @ %bb.2:190; CHECK-V8-NEXT: .LCPI2_0:191; CHECK-V8-NEXT: .long .Ltmp2192;193; CHECK-RESTRICT-IT-LABEL: t3:194; CHECK-RESTRICT-IT: @ %bb.0: @ %bb195; CHECK-RESTRICT-IT-NEXT: ldr r1, .LCPI2_0196; CHECK-RESTRICT-IT-NEXT: str r1, [r0]197; CHECK-RESTRICT-IT-NEXT: .Ltmp2: @ Block address taken198; CHECK-RESTRICT-IT-NEXT: @ %bb.1: @ %common.ret199; CHECK-RESTRICT-IT-NEXT: bx lr200; CHECK-RESTRICT-IT-NEXT: .p2align 2201; CHECK-RESTRICT-IT-NEXT: @ %bb.2:202; CHECK-RESTRICT-IT-NEXT: .LCPI2_0:203; CHECK-RESTRICT-IT-NEXT: .long .Ltmp2204bb:205 store ptr blockaddress(@t3, %KBBlockZero_return_1), ptr %retaddr206 br i1 %tst, label %bb77, label %bb7.i207 208bb7.i: ; preds = %bb35209 br label %bb2.i210 211KBBlockZero_return_1: ; preds = %KBBlockZero.exit212 ret void213 214KBBlockZero_return_0: ; preds = %KBBlockZero.exit215 ret void216 217bb77: ; preds = %bb26, %bb12, %bb218 ret void219 220bb2.i: ; preds = %bb6.i350, %bb7.i221 br i1 %tst, label %bb6.i350, label %KBBlockZero.exit222 223bb6.i350: ; preds = %bb2.i224 br label %bb2.i225 226KBBlockZero.exit: ; preds = %bb2.i227 indirectbr ptr %p8, [label %KBBlockZero_return_1, label %KBBlockZero_return_0]228}229 230@foo = global ptr null231define i32 @t4(i32 %x, ptr %p_foo) {232; CHECK-LABEL: t4:233; CHECK: @ %bb.0: @ %entry234; CHECK-NEXT: push {r4, lr}235; CHECK-NEXT: mov r4, r0236; CHECK-NEXT: cmp r0, #59237; CHECK-NEXT: ittt gt238; CHECK-NEXT: mvngt r0, #119239; CHECK-NEXT: addgt r0, r4240; CHECK-NEXT: popgt {r4, pc}241; CHECK-NEXT: LBB3_1: @ %if.then242; CHECK-NEXT: blx r1243; CHECK-NEXT: mov.w r0, #-1244; CHECK-NEXT: add r0, r4245; CHECK-NEXT: pop {r4, pc}246;247; CHECK-V8-LABEL: t4:248; CHECK-V8: @ %bb.0: @ %entry249; CHECK-V8-NEXT: push {r4, lr}250; CHECK-V8-NEXT: mov r4, r0251; CHECK-V8-NEXT: cmp r0, #59252; CHECK-V8-NEXT: bgt .LBB3_2253; CHECK-V8-NEXT: @ %bb.1: @ %if.then254; CHECK-V8-NEXT: blx r1255; CHECK-V8-NEXT: mov.w r0, #-1256; CHECK-V8-NEXT: add r0, r4257; CHECK-V8-NEXT: pop {r4, pc}258; CHECK-V8-NEXT: .LBB3_2:259; CHECK-V8-NEXT: mvn r0, #119260; CHECK-V8-NEXT: add r0, r4261; CHECK-V8-NEXT: pop {r4, pc}262;263; CHECK-RESTRICT-IT-LABEL: t4:264; CHECK-RESTRICT-IT: @ %bb.0: @ %entry265; CHECK-RESTRICT-IT-NEXT: push {r4, lr}266; CHECK-RESTRICT-IT-NEXT: mov r4, r0267; CHECK-RESTRICT-IT-NEXT: cmp r0, #59268; CHECK-RESTRICT-IT-NEXT: bgt .LBB3_2269; CHECK-RESTRICT-IT-NEXT: @ %bb.1: @ %if.then270; CHECK-RESTRICT-IT-NEXT: blx r1271; CHECK-RESTRICT-IT-NEXT: mov.w r0, #-1272; CHECK-RESTRICT-IT-NEXT: add r0, r4273; CHECK-RESTRICT-IT-NEXT: pop {r4, pc}274; CHECK-RESTRICT-IT-NEXT: .LBB3_2:275; CHECK-RESTRICT-IT-NEXT: mvn r0, #119276; CHECK-RESTRICT-IT-NEXT: add r0, r4277; CHECK-RESTRICT-IT-NEXT: pop {r4, pc}278entry:279 %cmp = icmp slt i32 %x, 60280 br i1 %cmp, label %if.then, label %if.else281 282if.then: ; preds = %entry283 %tmp.2 = call i32 %p_foo()284 %sub = add nsw i32 %x, -1285 br label %return286 287if.else: ; preds = %entry288 %sub1 = add nsw i32 %x, -120289 br label %return290 291return: ; preds = %if.end5, %if.then4, %if.then292 %retval.0 = phi i32 [ %sub, %if.then ], [ %sub1, %if.else ]293 ret i32 %retval.0294}295 296; If-converter was checking for the wrong predicate subsumes pattern when doing297; nested predicates.298; E.g., Let A be a basic block that flows conditionally into B and B be a299; predicated block.300; B can be predicated with A.BrToBPredicate into A iff B.Predicate is less301; "permissive" than A.BrToBPredicate, i.e., iff A.BrToBPredicate subsumes302; B.Predicate.303 304define i32 @wrapDistance(i32 %tx, i32 %sx, i32 %w) {305; CHECK-LABEL: wrapDistance:306; CHECK: @ %bb.0: @ %entry307; CHECK-NEXT: cmp r1, #59308; CHECK-NEXT: itt le309; CHECK-NEXT: suble r0, r2, #1310; CHECK-NEXT: bxle lr311; CHECK-NEXT: LBB4_1: @ %if.else312; CHECK-NEXT: subs r2, #120313; CHECK-NEXT: cmp r2, r1314; CHECK-NEXT: bge LBB4_3315; CHECK-NEXT: @ %bb.2: @ %if.else316; CHECK-NEXT: cmp r0, #119317; CHECK-NEXT: itt le318; CHECK-NEXT: addle r0, r1, #1319; CHECK-NEXT: bxle lr320; CHECK-NEXT: LBB4_3: @ %if.end5321; CHECK-NEXT: subs r0, r1, r0322; CHECK-NEXT: bx lr323;324; CHECK-V8-LABEL: wrapDistance:325; CHECK-V8: @ %bb.0: @ %entry326; CHECK-V8-NEXT: cmp r1, #59327; CHECK-V8-NEXT: itt le328; CHECK-V8-NEXT: suble r0, r2, #1329; CHECK-V8-NEXT: bxle lr330; CHECK-V8-NEXT: .LBB4_1: @ %if.else331; CHECK-V8-NEXT: subs r2, #120332; CHECK-V8-NEXT: cmp r2, r1333; CHECK-V8-NEXT: bge .LBB4_3334; CHECK-V8-NEXT: @ %bb.2: @ %if.else335; CHECK-V8-NEXT: cmp r0, #119336; CHECK-V8-NEXT: itt le337; CHECK-V8-NEXT: addle r0, r1, #1338; CHECK-V8-NEXT: bxle lr339; CHECK-V8-NEXT: .LBB4_3: @ %if.end5340; CHECK-V8-NEXT: subs r0, r1, r0341; CHECK-V8-NEXT: bx lr342;343; CHECK-RESTRICT-IT-LABEL: wrapDistance:344; CHECK-RESTRICT-IT: @ %bb.0: @ %entry345; CHECK-RESTRICT-IT-NEXT: cmp r1, #59346; CHECK-RESTRICT-IT-NEXT: bgt .LBB4_2347; CHECK-RESTRICT-IT-NEXT: @ %bb.1: @ %if.then348; CHECK-RESTRICT-IT-NEXT: subs r0, r2, #1349; CHECK-RESTRICT-IT-NEXT: bx lr350; CHECK-RESTRICT-IT-NEXT: .LBB4_2: @ %if.else351; CHECK-RESTRICT-IT-NEXT: subs r2, #120352; CHECK-RESTRICT-IT-NEXT: cmp r2, r1353; CHECK-RESTRICT-IT-NEXT: bge .LBB4_5354; CHECK-RESTRICT-IT-NEXT: @ %bb.3: @ %if.else355; CHECK-RESTRICT-IT-NEXT: cmp r0, #119356; CHECK-RESTRICT-IT-NEXT: bgt .LBB4_5357; CHECK-RESTRICT-IT-NEXT: @ %bb.4: @ %if.then4358; CHECK-RESTRICT-IT-NEXT: adds r0, r1, #1359; CHECK-RESTRICT-IT-NEXT: bx lr360; CHECK-RESTRICT-IT-NEXT: .LBB4_5: @ %if.end5361; CHECK-RESTRICT-IT-NEXT: subs r0, r1, r0362; CHECK-RESTRICT-IT-NEXT: bx lr363entry:364 %cmp = icmp slt i32 %sx, 60365 br i1 %cmp, label %if.then, label %if.else366 367if.then: ; preds = %entry368 %sub = add nsw i32 %w, -1369 br label %return370 371if.else: ; preds = %entry372 %sub1 = add nsw i32 %w, -120373 %cmp2 = icmp slt i32 %sub1, %sx374 %cmp3 = icmp slt i32 %tx, 120375 %or.cond = and i1 %cmp2, %cmp3376 br i1 %or.cond, label %if.then4, label %if.end5377 378if.then4: ; preds = %if.else379 %add = add nsw i32 %sx, 1380 br label %return381 382if.end5: ; preds = %if.else383 %sub6 = sub nsw i32 %sx, %tx384 br label %return385 386return: ; preds = %if.end5, %if.then4, %if.then387 %retval.0 = phi i32 [ %sub, %if.then ], [ %add, %if.then4 ], [ %sub6, %if.end5 ]388 ret i32 %retval.0389}390