brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.3 KiB · d9a34d7 Raw
238 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=i686-unknown -verify-machineinstrs < %s | FileCheck %s3; RUN: opt < %s -codegenprepare -S -mtriple=x86_64-unknown-unknown | FileCheck --check-prefix=CHECK-CGP %s4; RUN: opt < %s -codegenprepare -cgpp-huge-func=0 -S -mtriple=x86_64-unknown-unknown | FileCheck --check-prefix=CHECK-CGP %s5 6@A = global i32 zeroinitializer7@B = global i32 zeroinitializer8@C = global i32 zeroinitializer9 10; Test that 'and' is sunk into bb0.11define i32 @and_sink1(i32 %a, i1 %c) {12; CHECK-LABEL: and_sink1:13; CHECK:       # %bb.0:14; CHECK-NEXT:    testb $1, {{[0-9]+}}(%esp)15; CHECK-NEXT:    je .LBB0_316; CHECK-NEXT:  # %bb.1: # %bb017; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax18; CHECK-NEXT:    testb $4, %al19; CHECK-NEXT:    movl $0, A20; CHECK-NEXT:    jne .LBB0_321; CHECK-NEXT:  # %bb.2: # %bb122; CHECK-NEXT:    movl $1, %eax23; CHECK-NEXT:    retl24; CHECK-NEXT:  .LBB0_3: # %bb225; CHECK-NEXT:    xorl %eax, %eax26; CHECK-NEXT:    retl27 28; CHECK-CGP-LABEL: @and_sink1(29; CHECK-CGP-NOT: and i3230  %and = and i32 %a, 431  br i1 %c, label %bb0, label %bb232bb0:33; CHECK-CGP-LABEL: bb0:34; CHECK-CGP: and i3235; CHECK-CGP-NEXT: icmp eq i3236; CHECK-CGP-NEXT: store37; CHECK-CGP-NEXT: br38  %cmp = icmp eq i32 %and, 039  store i32 0, ptr @A40  br i1 %cmp, label %bb1, label %bb241bb1:42  ret i32 143bb2:44  ret i32 045}46 47; Test that both 'and' and cmp get sunk to bb1.48define i32 @and_sink2(i32 %a, i1 %c, i1 %c2) {49; CHECK-LABEL: and_sink2:50; CHECK:       # %bb.0:51; CHECK-NEXT:    movl $0, A52; CHECK-NEXT:    testb $1, {{[0-9]+}}(%esp)53; CHECK-NEXT:    je .LBB1_554; CHECK-NEXT:  # %bb.1: # %bb0.preheader55; CHECK-NEXT:    movzbl {{[0-9]+}}(%esp), %eax56; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx57; CHECK-NEXT:    .p2align 458; CHECK-NEXT:  .LBB1_2: # %bb059; CHECK-NEXT:    # =>This Inner Loop Header: Depth=160; CHECK-NEXT:    movl $0, B61; CHECK-NEXT:    testb $1, %al62; CHECK-NEXT:    je .LBB1_563; CHECK-NEXT:  # %bb.3: # %bb164; CHECK-NEXT:    # in Loop: Header=BB1_2 Depth=165; CHECK-NEXT:    testb $4, %cl66; CHECK-NEXT:    movl $0, C67; CHECK-NEXT:    jne .LBB1_268; CHECK-NEXT:  # %bb.4: # %bb269; CHECK-NEXT:    movl $1, %eax70; CHECK-NEXT:    retl71; CHECK-NEXT:  .LBB1_5: # %bb372; CHECK-NEXT:    xorl %eax, %eax73; CHECK-NEXT:    retl74 75; CHECK-CGP-LABEL: @and_sink2(76; CHECK-CGP-NOT: and i3277  %and = and i32 %a, 478  store i32 0, ptr @A79  br i1 %c, label %bb0, label %bb380bb0:81; CHECK-CGP-LABEL: bb0:82; CHECK-CGP-NOT: and i3283; CHECK-CGP-NOT: icmp84  %cmp = icmp eq i32 %and, 085  store i32 0, ptr @B86  br i1 %c2, label %bb1, label %bb387bb1:88; CHECK-CGP-LABEL: bb1:89; CHECK-CGP: and i3290; CHECK-CGP-NEXT: icmp eq i3291; CHECK-CGP-NEXT: store92; CHECK-CGP-NEXT: br93  store i32 0, ptr @C94  br i1 %cmp, label %bb2, label %bb095bb2:96  ret i32 197bb3:98  ret i32 099}100 101; Test that CodeGenPrepare doesn't get stuck in a loop sinking and hoisting a masked load.102define i32 @and_sink3(i1 %c, ptr %p) {103; CHECK-LABEL: and_sink3:104; CHECK:       # %bb.0:105; CHECK-NEXT:    testb $1, {{[0-9]+}}(%esp)106; CHECK-NEXT:    je .LBB2_3107; CHECK-NEXT:  # %bb.1: # %bb0108; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax109; CHECK-NEXT:    movzbl (%eax), %eax110; CHECK-NEXT:    testl %eax, %eax111; CHECK-NEXT:    movl $0, A112; CHECK-NEXT:    je .LBB2_2113; CHECK-NEXT:  .LBB2_3: # %bb2114; CHECK-NEXT:    xorl %eax, %eax115; CHECK-NEXT:    retl116; CHECK-NEXT:  .LBB2_2: # %bb1117; CHECK-NEXT:    movl $1, %eax118; CHECK-NEXT:    retl119 120; CHECK-CGP-LABEL: @and_sink3(121; CHECK-CGP: load i32122; CHECK-CGP-NEXT: and i32123  %load = load i32, ptr %p124  %and = and i32 %load, 255125  br i1 %c, label %bb0, label %bb2126bb0:127; CHECK-CGP-LABEL: bb0:128; CHECK-CGP-NOT: and i32129; CHECK-CGP: icmp eq i32130  %cmp = icmp eq i32 %and, 0131  store i32 0, ptr @A132  br i1 %cmp, label %bb1, label %bb2133bb1:134  ret i32 1135bb2:136  ret i32 0137}138 139; Test that CodeGenPrepare sinks/duplicates non-immediate 'and'.140define i32 @and_sink4(i32 %a, i32 %b, i1 %c) {141; CHECK-LABEL: and_sink4:142; CHECK:       # %bb.0:143; CHECK-NEXT:    testb $1, {{[0-9]+}}(%esp)144; CHECK-NEXT:    je .LBB3_4145; CHECK-NEXT:  # %bb.1: # %bb0146; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax147; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx148; CHECK-NEXT:    testl %eax, %ecx149; CHECK-NEXT:    movl $0, A150; CHECK-NEXT:    jne .LBB3_4151; CHECK-NEXT:  # %bb.2: # %bb1152; CHECK-NEXT:    leal (%ecx,%eax), %edx153; CHECK-NEXT:    testl %eax, %ecx154; CHECK-NEXT:    movl %edx, B155; CHECK-NEXT:    je .LBB3_3156; CHECK-NEXT:  .LBB3_4: # %bb3157; CHECK-NEXT:    xorl %eax, %eax158; CHECK-NEXT:    retl159; CHECK-NEXT:  .LBB3_3: # %bb2160; CHECK-NEXT:    movl $1, %eax161; CHECK-NEXT:    retl162 163; CHECK-CGP-LABEL: @and_sink4(164; CHECK-CGP-NOT: and i32165; CHECK-CGP-NOT: icmp166  %and = and i32 %a, %b167  %cmp = icmp eq i32 %and, 0168  br i1 %c, label %bb0, label %bb3169bb0:170; CHECK-CGP-LABEL: bb0:171; CHECK-CGP: and i32172; CHECK-CGP-NEXT: icmp eq i32173  store i32 0, ptr @A174  br i1 %cmp, label %bb1, label %bb3175bb1:176; CHECK-CGP-LABEL: bb1:177; CHECK-CGP: and i32178; CHECK-CGP-NEXT: icmp eq i32179  %add = add i32 %a, %b180  store i32 %add, ptr @B181  br i1 %cmp, label %bb2, label %bb3182bb2:183  ret i32 1184bb3:185  ret i32 0186}187 188 189; Test that CodeGenPrepare doesn't sink/duplicate non-immediate 'and'190; when it would increase register pressure.191define i32 @and_sink5(i32 %a, i32 %b, i32 %a2, i32 %b2, i1 %c) {192; CHECK-LABEL: and_sink5:193; CHECK:       # %bb.0:194; CHECK-NEXT:    testb $1, {{[0-9]+}}(%esp)195; CHECK-NEXT:    je .LBB4_4196; CHECK-NEXT:  # %bb.1: # %bb0197; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax198; CHECK-NEXT:    andl {{[0-9]+}}(%esp), %eax199; CHECK-NEXT:    movl $0, A200; CHECK-NEXT:    jne .LBB4_4201; CHECK-NEXT:  # %bb.2: # %bb1202; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx203; CHECK-NEXT:    addl {{[0-9]+}}(%esp), %ecx204; CHECK-NEXT:    testl %eax, %eax205; CHECK-NEXT:    movl %ecx, B206; CHECK-NEXT:    je .LBB4_3207; CHECK-NEXT:  .LBB4_4: # %bb3208; CHECK-NEXT:    xorl %eax, %eax209; CHECK-NEXT:    retl210; CHECK-NEXT:  .LBB4_3: # %bb2211; CHECK-NEXT:    movl $1, %eax212; CHECK-NEXT:    retl213 214; CHECK-CGP-LABEL: @and_sink5(215; CHECK-CGP: and i32216; CHECK-CGP-NOT: icmp217  %and = and i32 %a, %b218  %cmp = icmp eq i32 %and, 0219  br i1 %c, label %bb0, label %bb3220bb0:221; CHECK-CGP-LABEL: bb0:222; CHECK-CGP-NOT: and i32223; CHECK-CGP: icmp eq i32224  store i32 0, ptr @A225  br i1 %cmp, label %bb1, label %bb3226bb1:227; CHECK-CGP-LABEL: bb1:228; CHECK-CGP-NOT: and i32229; CHECK-CGP: icmp eq i32230  %add = add i32 %a2, %b2231  store i32 %add, ptr @B232  br i1 %cmp, label %bb2, label %bb3233bb2:234  ret i32 1235bb3:236  ret i32 0237}238