brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.8 KiB · fb9139c Raw
415 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv7m-eabi  %s -o - | FileCheck %s --check-prefix V7M3; RUN: llc -mtriple=armv7a-eabi  %s -o -   | FileCheck %s --check-prefix V7A4; RUN: llc -mtriple=thumbv7a-eabi  %s -o -   | FileCheck %s --check-prefix V7A-T5; RUN: llc -mtriple=armv6m-eabi  %s -o -   | FileCheck %s --check-prefix V6M6 7target datalayout = "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64"8 9; Test sink of `and` instructions to fold in to `tst`, `lsls`, do cmov-bfi combine, etc.10define void @f(i32 %v, ptr noalias  %outp) {11; V7M-LABEL: f:12; V7M:       @ %bb.0: @ %entry13; V7M-NEXT:    movs r2, #014; V7M-NEXT:    str r2, [r1]15; V7M-NEXT:    lsls r2, r0, #3116; V7M-NEXT:    bne .LBB0_317; V7M-NEXT:  @ %bb.1: @ %if.then18; V7M-NEXT:    tst.w r0, #1419; V7M-NEXT:    beq .LBB0_620; V7M-NEXT:  @ %bb.2:21; V7M-NEXT:    lsls r2, r0, #3022; V7M-NEXT:    mov.w r3, #3302423; V7M-NEXT:    and.w r2, r3, r2, asr #3124; V7M-NEXT:    lsrs r0, r0, #225; V7M-NEXT:    bfi r2, r0, #7, #126; V7M-NEXT:    bfi r2, r0, #14, #127; V7M-NEXT:    b .LBB0_528; V7M-NEXT:  .LBB0_3: @ %if.else29; V7M-NEXT:    tst.w r0, #1430; V7M-NEXT:    it eq31; V7M-NEXT:    bxeq lr32; V7M-NEXT:  .LBB0_4:33; V7M-NEXT:    lsls r2, r0, #3034; V7M-NEXT:    mov.w r3, #825635; V7M-NEXT:    and.w r2, r3, r2, asr #3136; V7M-NEXT:    lsrs r0, r0, #237; V7M-NEXT:    bfi r2, r0, #5, #138; V7M-NEXT:    bfi r2, r0, #12, #139; V7M-NEXT:  .LBB0_5: @ %if.end40; V7M-NEXT:    str r2, [r1]41; V7M-NEXT:  .LBB0_6: @ %exit42; V7M-NEXT:    bx lr43;44; V7A-LABEL: f:45; V7A:       @ %bb.0: @ %entry46; V7A-NEXT:    mov r2, #047; V7A-NEXT:    tst r0, #148; V7A-NEXT:    str r2, [r1]49; V7A-NEXT:    bne .LBB0_350; V7A-NEXT:  @ %bb.1: @ %if.then51; V7A-NEXT:    tst r0, #1452; V7A-NEXT:    beq .LBB0_653; V7A-NEXT:  @ %bb.2:54; V7A-NEXT:    lsl r2, r0, #3055; V7A-NEXT:    mov r3, #3302456; V7A-NEXT:    and r2, r3, r2, asr #3157; V7A-NEXT:    lsr r0, r0, #258; V7A-NEXT:    bfi r2, r0, #7, #159; V7A-NEXT:    bfi r2, r0, #14, #160; V7A-NEXT:    b .LBB0_561; V7A-NEXT:  .LBB0_3: @ %if.else62; V7A-NEXT:    tst r0, #1463; V7A-NEXT:    bxeq lr64; V7A-NEXT:  .LBB0_4:65; V7A-NEXT:    lsl r2, r0, #3066; V7A-NEXT:    mov r3, #825667; V7A-NEXT:    and r2, r3, r2, asr #3168; V7A-NEXT:    lsr r0, r0, #269; V7A-NEXT:    bfi r2, r0, #5, #170; V7A-NEXT:    bfi r2, r0, #12, #171; V7A-NEXT:  .LBB0_5: @ %if.end72; V7A-NEXT:    str r2, [r1]73; V7A-NEXT:  .LBB0_6: @ %exit74; V7A-NEXT:    bx lr75;76; V7A-T-LABEL: f:77; V7A-T:       @ %bb.0: @ %entry78; V7A-T-NEXT:    movs r2, #079; V7A-T-NEXT:    str r2, [r1]80; V7A-T-NEXT:    lsls r2, r0, #3181; V7A-T-NEXT:    bne .LBB0_382; V7A-T-NEXT:  @ %bb.1: @ %if.then83; V7A-T-NEXT:    tst.w r0, #1484; V7A-T-NEXT:    beq .LBB0_685; V7A-T-NEXT:  @ %bb.2:86; V7A-T-NEXT:    lsls r2, r0, #3087; V7A-T-NEXT:    mov.w r3, #3302488; V7A-T-NEXT:    and.w r2, r3, r2, asr #3189; V7A-T-NEXT:    lsrs r0, r0, #290; V7A-T-NEXT:    bfi r2, r0, #7, #191; V7A-T-NEXT:    bfi r2, r0, #14, #192; V7A-T-NEXT:    b .LBB0_593; V7A-T-NEXT:  .LBB0_3: @ %if.else94; V7A-T-NEXT:    tst.w r0, #1495; V7A-T-NEXT:    it eq96; V7A-T-NEXT:    bxeq lr97; V7A-T-NEXT:  .LBB0_4:98; V7A-T-NEXT:    lsls r2, r0, #3099; V7A-T-NEXT:    mov.w r3, #8256100; V7A-T-NEXT:    and.w r2, r3, r2, asr #31101; V7A-T-NEXT:    lsrs r0, r0, #2102; V7A-T-NEXT:    bfi r2, r0, #5, #1103; V7A-T-NEXT:    bfi r2, r0, #12, #1104; V7A-T-NEXT:  .LBB0_5: @ %if.end105; V7A-T-NEXT:    str r2, [r1]106; V7A-T-NEXT:  .LBB0_6: @ %exit107; V7A-T-NEXT:    bx lr108;109; V6M-LABEL: f:110; V6M:       @ %bb.0: @ %entry111; V6M-NEXT:    .save {r4, lr}112; V6M-NEXT:    push {r4, lr}113; V6M-NEXT:    movs r2, #0114; V6M-NEXT:    str r2, [r1]115; V6M-NEXT:    movs r3, #14116; V6M-NEXT:    ands r3, r0117; V6M-NEXT:    movs r4, #4118; V6M-NEXT:    ands r4, r0119; V6M-NEXT:    movs r2, #2120; V6M-NEXT:    ands r2, r0121; V6M-NEXT:    lsls r0, r0, #31122; V6M-NEXT:    bne .LBB0_5123; V6M-NEXT:  @ %bb.1: @ %if.then124; V6M-NEXT:    movs r0, #129125; V6M-NEXT:    cmp r2, #0126; V6M-NEXT:    beq .LBB0_3127; V6M-NEXT:  @ %bb.2:128; V6M-NEXT:    lsls r2, r0, #8129; V6M-NEXT:  .LBB0_3: @ %if.then130; V6M-NEXT:    cmp r4, #0131; V6M-NEXT:    beq .LBB0_10132; V6M-NEXT:  @ %bb.4: @ %if.then133; V6M-NEXT:    lsls r0, r0, #7134; V6M-NEXT:    b .LBB0_9135; V6M-NEXT:  .LBB0_5: @ %if.else136; V6M-NEXT:    movs r0, #129137; V6M-NEXT:    cmp r2, #0138; V6M-NEXT:    beq .LBB0_7139; V6M-NEXT:  @ %bb.6:140; V6M-NEXT:    lsls r2, r0, #6141; V6M-NEXT:  .LBB0_7: @ %if.else142; V6M-NEXT:    cmp r4, #0143; V6M-NEXT:    beq .LBB0_10144; V6M-NEXT:  @ %bb.8: @ %if.else145; V6M-NEXT:    lsls r0, r0, #5146; V6M-NEXT:  .LBB0_9: @ %if.else147; V6M-NEXT:    adds r2, r2, r0148; V6M-NEXT:  .LBB0_10: @ %if.else149; V6M-NEXT:    cmp r3, #0150; V6M-NEXT:    beq .LBB0_12151; V6M-NEXT:  @ %bb.11: @ %if.end152; V6M-NEXT:    str r2, [r1]153; V6M-NEXT:  .LBB0_12: @ %exit154; V6M-NEXT:    pop {r4, pc}155entry:156  store i32 0, ptr %outp, align 4157  %and = and i32 %v, 1158  %cmp = icmp eq i32 %and, 0159  %and1 = and i32 %v, 2160  %tobool.not = icmp eq i32 %and1, 0161  %and2 = and i32 %v, 4162  %tobool1.not = icmp eq i32 %and2, 0163  %and3 = and i32 %v, 14164  %tobool2.not = icmp eq i32 %and3, 0165  br i1 %cmp, label %if.then, label %if.else166 167if.then:168  %select = select i1 %tobool.not, i32 0, i32 33024169  %or = or i32 %select, 16512170  %spec.select = select i1 %tobool1.not, i32 %select, i32 %or171  br i1 %tobool2.not, label %exit, label %if.end172 173if.else:174  %select1 = select i1 %tobool.not, i32 0, i32 8256175  %or1 = or i32 %select1, 4128176  %spec.select1 = select i1 %tobool1.not, i32 %select1, i32 %or1177  br i1 %tobool2.not, label %exit, label %if.end178 179if.end:180  %spec.select.sink = phi i32 [ %spec.select, %if.then ], [ %spec.select1, %if.else ]181  store i32 %spec.select.sink, ptr %outp, align 4182  br label %exit183 184exit:185  ret void186}187 188; Test with a mask that can be encoded with T32 instruction set, but not with A32.189define i32 @f0(i1 %c0, i32 %v, ptr %p) {190; V7M-LABEL: f0:191; V7M:       @ %bb.0: @ %E192; V7M-NEXT:    lsls r0, r0, #31193; V7M-NEXT:    beq .LBB1_2194; V7M-NEXT:  @ %bb.1: @ %A195; V7M-NEXT:    tst.w r1, #16843009196; V7M-NEXT:    itt eq197; V7M-NEXT:    moveq r0, #0198; V7M-NEXT:    bxeq lr199; V7M-NEXT:    b .LBB1_3200; V7M-NEXT:  .LBB1_2: @ %B201; V7M-NEXT:    movs r0, #1202; V7M-NEXT:    tst.w r1, #16843009203; V7M-NEXT:    str r0, [r2]204; V7M-NEXT:    itt ne205; V7M-NEXT:    movne r0, #0206; V7M-NEXT:    bxne lr207; V7M-NEXT:  .LBB1_3: @ %D208; V7M-NEXT:    movs r0, #1209; V7M-NEXT:    bx lr210;211; V7A-LABEL: f0:212; V7A:       @ %bb.0: @ %E213; V7A-NEXT:    movw r3, #257214; V7A-NEXT:    tst r0, #1215; V7A-NEXT:    movt r3, #257216; V7A-NEXT:    and r1, r1, r3217; V7A-NEXT:    beq .LBB1_3218; V7A-NEXT:  @ %bb.1: @ %A219; V7A-NEXT:    cmp r1, #0220; V7A-NEXT:    moveq r0, #0221; V7A-NEXT:    bxeq lr222; V7A-NEXT:  .LBB1_2: @ %D223; V7A-NEXT:    mov r0, #1224; V7A-NEXT:    bx lr225; V7A-NEXT:  .LBB1_3: @ %B226; V7A-NEXT:    mov r0, #1227; V7A-NEXT:    cmp r1, #0228; V7A-NEXT:    str r0, [r2]229; V7A-NEXT:    mov r0, #0230; V7A-NEXT:    moveq r0, #1231; V7A-NEXT:    bx lr232;233; V7A-T-LABEL: f0:234; V7A-T:       @ %bb.0: @ %E235; V7A-T-NEXT:    lsls r0, r0, #31236; V7A-T-NEXT:    beq .LBB1_2237; V7A-T-NEXT:  @ %bb.1: @ %A238; V7A-T-NEXT:    tst.w r1, #16843009239; V7A-T-NEXT:    itt eq240; V7A-T-NEXT:    moveq r0, #0241; V7A-T-NEXT:    bxeq lr242; V7A-T-NEXT:    b .LBB1_3243; V7A-T-NEXT:  .LBB1_2: @ %B244; V7A-T-NEXT:    movs r0, #1245; V7A-T-NEXT:    tst.w r1, #16843009246; V7A-T-NEXT:    str r0, [r2]247; V7A-T-NEXT:    itt ne248; V7A-T-NEXT:    movne r0, #0249; V7A-T-NEXT:    bxne lr250; V7A-T-NEXT:  .LBB1_3: @ %D251; V7A-T-NEXT:    movs r0, #1252; V7A-T-NEXT:    bx lr253;254; V6M-LABEL: f0:255; V6M:       @ %bb.0: @ %E256; V6M-NEXT:    ldr r3, .LCPI1_0257; V6M-NEXT:    ands r3, r1258; V6M-NEXT:    lsls r0, r0, #31259; V6M-NEXT:    beq .LBB1_3260; V6M-NEXT:  @ %bb.1: @ %A261; V6M-NEXT:    cmp r3, #0262; V6M-NEXT:    bne .LBB1_5263; V6M-NEXT:  @ %bb.2:264; V6M-NEXT:    movs r0, #0265; V6M-NEXT:    bx lr266; V6M-NEXT:  .LBB1_3: @ %B267; V6M-NEXT:    movs r0, #1268; V6M-NEXT:    str r0, [r2]269; V6M-NEXT:    cmp r3, #0270; V6M-NEXT:    beq .LBB1_5271; V6M-NEXT:  @ %bb.4:272; V6M-NEXT:    movs r0, #0273; V6M-NEXT:    bx lr274; V6M-NEXT:  .LBB1_5: @ %D275; V6M-NEXT:    movs r0, #1276; V6M-NEXT:    bx lr277; V6M-NEXT:    .p2align 2278; V6M-NEXT:  @ %bb.6:279; V6M-NEXT:  .LCPI1_0:280; V6M-NEXT:    .long 16843009 @ 0x1010101281E:282  %a = and i32 %v, 16843009283  br i1 %c0, label %A, label %B284 285A:286  %c1 = icmp eq i32 %a, 0287  br i1 %c1, label %C, label %D288 289B:290  %c2 = icmp eq i32 %a, 0291  store i32 1, ptr %p, align 4292  br i1 %c2, label %D, label %C293 294C:295  br label %X296 297D:298  br label %X299 300X:301  %x = phi i32 [0, %C], [1, %D]302  ret i32 %x303}304 305; Test with a mask that can be encoded both with T32 and A32 instruction sets.306define i32 @f1(i1 %c0, i32 %v, ptr %p) {307; V7M-LABEL: f1:308; V7M:       @ %bb.0: @ %E309; V7M-NEXT:    lsls r0, r0, #31310; V7M-NEXT:    beq .LBB2_2311; V7M-NEXT:  @ %bb.1: @ %A312; V7M-NEXT:    tst.w r1, #100663296313; V7M-NEXT:    itt eq314; V7M-NEXT:    moveq r0, #0315; V7M-NEXT:    bxeq lr316; V7M-NEXT:    b .LBB2_3317; V7M-NEXT:  .LBB2_2: @ %B318; V7M-NEXT:    movs r0, #1319; V7M-NEXT:    tst.w r1, #100663296320; V7M-NEXT:    str r0, [r2]321; V7M-NEXT:    itt ne322; V7M-NEXT:    movne r0, #0323; V7M-NEXT:    bxne lr324; V7M-NEXT:  .LBB2_3: @ %D325; V7M-NEXT:    movs r0, #1326; V7M-NEXT:    bx lr327;328; V7A-LABEL: f1:329; V7A:       @ %bb.0: @ %E330; V7A-NEXT:    tst r0, #1331; V7A-NEXT:    beq .LBB2_3332; V7A-NEXT:  @ %bb.1: @ %A333; V7A-NEXT:    tst r1, #100663296334; V7A-NEXT:    moveq r0, #0335; V7A-NEXT:    bxeq lr336; V7A-NEXT:  .LBB2_2: @ %D337; V7A-NEXT:    mov r0, #1338; V7A-NEXT:    bx lr339; V7A-NEXT:  .LBB2_3: @ %B340; V7A-NEXT:    mov r0, #1341; V7A-NEXT:    tst r1, #100663296342; V7A-NEXT:    str r0, [r2]343; V7A-NEXT:    mov r0, #0344; V7A-NEXT:    moveq r0, #1345; V7A-NEXT:    bx lr346;347; V7A-T-LABEL: f1:348; V7A-T:       @ %bb.0: @ %E349; V7A-T-NEXT:    lsls r0, r0, #31350; V7A-T-NEXT:    beq .LBB2_2351; V7A-T-NEXT:  @ %bb.1: @ %A352; V7A-T-NEXT:    tst.w r1, #100663296353; V7A-T-NEXT:    itt eq354; V7A-T-NEXT:    moveq r0, #0355; V7A-T-NEXT:    bxeq lr356; V7A-T-NEXT:    b .LBB2_3357; V7A-T-NEXT:  .LBB2_2: @ %B358; V7A-T-NEXT:    movs r0, #1359; V7A-T-NEXT:    tst.w r1, #100663296360; V7A-T-NEXT:    str r0, [r2]361; V7A-T-NEXT:    itt ne362; V7A-T-NEXT:    movne r0, #0363; V7A-T-NEXT:    bxne lr364; V7A-T-NEXT:  .LBB2_3: @ %D365; V7A-T-NEXT:    movs r0, #1366; V7A-T-NEXT:    bx lr367;368; V6M-LABEL: f1:369; V6M:       @ %bb.0: @ %E370; V6M-NEXT:    movs r3, #3371; V6M-NEXT:    lsls r3, r3, #25372; V6M-NEXT:    ands r3, r1373; V6M-NEXT:    lsls r0, r0, #31374; V6M-NEXT:    beq .LBB2_3375; V6M-NEXT:  @ %bb.1: @ %A376; V6M-NEXT:    cmp r3, #0377; V6M-NEXT:    bne .LBB2_5378; V6M-NEXT:  @ %bb.2:379; V6M-NEXT:    movs r0, #0380; V6M-NEXT:    bx lr381; V6M-NEXT:  .LBB2_3: @ %B382; V6M-NEXT:    movs r0, #1383; V6M-NEXT:    str r0, [r2]384; V6M-NEXT:    cmp r3, #0385; V6M-NEXT:    beq .LBB2_5386; V6M-NEXT:  @ %bb.4:387; V6M-NEXT:    movs r0, #0388; V6M-NEXT:    bx lr389; V6M-NEXT:  .LBB2_5: @ %D390; V6M-NEXT:    movs r0, #1391; V6M-NEXT:    bx lr392E:393  %a = and i32 %v, 100663296394  br i1 %c0, label %A, label %B395 396A:397  %c1 = icmp eq i32 %a, 0398  br i1 %c1, label %C, label %D399 400B:401  %c2 = icmp eq i32 %a, 0402  store i32 1, ptr %p, align 4403  br i1 %c2, label %D, label %C404 405C:406  br label %X407 408D:409  br label %X410 411X:412  %x = phi i32 [0, %C], [1, %D]413  ret i32 %x414}415