brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.5 KiB · 8f798fa Raw
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