brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.2 KiB · d2d1c4d Raw
363 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-linux | FileCheck %s --check-prefix=CMOV3; RUN: llc < %s -mtriple=i686-unknown-linux | FileCheck %s --check-prefix=NOCMOV4 5target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"6 7; Test 2xCMOV patterns exposed after legalization.8; One way to do that is with (select (fcmp une/oeq)), which gets9; legalized to setp/setne.10 11define dso_local i32 @test_select_fcmp_oeq_i32(float %a, float %b, i32 %c, i32 %d) nounwind {12; CMOV-LABEL: test_select_fcmp_oeq_i32:13; CMOV:       # %bb.0: # %entry14; CMOV-NEXT:    movl %edi, %eax15; CMOV-NEXT:    ucomiss %xmm1, %xmm016; CMOV-NEXT:    cmovnel %esi, %eax17; CMOV-NEXT:    cmovpl %esi, %eax18; CMOV-NEXT:    retq19;20; NOCMOV-LABEL: test_select_fcmp_oeq_i32:21; NOCMOV:       # %bb.0: # %entry22; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)23; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)24; NOCMOV-NEXT:    fucompp25; NOCMOV-NEXT:    fnstsw %ax26; NOCMOV-NEXT:    # kill: def $ah killed $ah killed $ax27; NOCMOV-NEXT:    sahf28; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %eax29; NOCMOV-NEXT:    jne .LBB0_330; NOCMOV-NEXT:  # %bb.1: # %entry31; NOCMOV-NEXT:    jp .LBB0_332; NOCMOV-NEXT:  # %bb.2: # %entry33; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %eax34; NOCMOV-NEXT:  .LBB0_3: # %entry35; NOCMOV-NEXT:    movl (%eax), %eax36; NOCMOV-NEXT:    retl37entry:38  %cmp = fcmp oeq float %a, %b39  %r = select i1 %cmp, i32 %c, i32 %d40  ret i32 %r41}42 43define i64 @test_select_fcmp_oeq_i64(float %a, float %b, i64 %c, i64 %d) nounwind {44; CMOV-LABEL: test_select_fcmp_oeq_i64:45; CMOV:       # %bb.0: # %entry46; CMOV-NEXT:    movq %rdi, %rax47; CMOV-NEXT:    ucomiss %xmm1, %xmm048; CMOV-NEXT:    cmovneq %rsi, %rax49; CMOV-NEXT:    cmovpq %rsi, %rax50; CMOV-NEXT:    retq51;52; NOCMOV-LABEL: test_select_fcmp_oeq_i64:53; NOCMOV:       # %bb.0: # %entry54; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)55; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)56; NOCMOV-NEXT:    fucompp57; NOCMOV-NEXT:    fnstsw %ax58; NOCMOV-NEXT:    # kill: def $ah killed $ah killed $ax59; NOCMOV-NEXT:    sahf60; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %ecx61; NOCMOV-NEXT:    jne .LBB1_362; NOCMOV-NEXT:  # %bb.1: # %entry63; NOCMOV-NEXT:    jp .LBB1_364; NOCMOV-NEXT:  # %bb.2: # %entry65; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %ecx66; NOCMOV-NEXT:  .LBB1_3: # %entry67; NOCMOV-NEXT:    movl (%ecx), %eax68; NOCMOV-NEXT:    movl 4(%ecx), %edx69; NOCMOV-NEXT:    retl70entry:71  %cmp = fcmp oeq float %a, %b72  %r = select i1 %cmp, i64 %c, i64 %d73  ret i64 %r74}75 76define i64 @test_select_fcmp_une_i64(float %a, float %b, i64 %c, i64 %d) nounwind {77; CMOV-LABEL: test_select_fcmp_une_i64:78; CMOV:       # %bb.0: # %entry79; CMOV-NEXT:    movq %rsi, %rax80; CMOV-NEXT:    ucomiss %xmm1, %xmm081; CMOV-NEXT:    cmovneq %rdi, %rax82; CMOV-NEXT:    cmovpq %rdi, %rax83; CMOV-NEXT:    retq84;85; NOCMOV-LABEL: test_select_fcmp_une_i64:86; NOCMOV:       # %bb.0: # %entry87; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)88; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)89; NOCMOV-NEXT:    fucompp90; NOCMOV-NEXT:    fnstsw %ax91; NOCMOV-NEXT:    # kill: def $ah killed $ah killed $ax92; NOCMOV-NEXT:    sahf93; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %ecx94; NOCMOV-NEXT:    jne .LBB2_395; NOCMOV-NEXT:  # %bb.1: # %entry96; NOCMOV-NEXT:    jp .LBB2_397; NOCMOV-NEXT:  # %bb.2: # %entry98; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %ecx99; NOCMOV-NEXT:  .LBB2_3: # %entry100; NOCMOV-NEXT:    movl (%ecx), %eax101; NOCMOV-NEXT:    movl 4(%ecx), %edx102; NOCMOV-NEXT:    retl103entry:104  %cmp = fcmp une float %a, %b105  %r = select i1 %cmp, i64 %c, i64 %d106  ret i64 %r107}108 109define dso_local double @test_select_fcmp_oeq_f64(float %a, float %b, double %c, double %d) nounwind {110; CMOV-LABEL: test_select_fcmp_oeq_f64:111; CMOV:       # %bb.0: # %entry112; CMOV-NEXT:    ucomiss %xmm1, %xmm0113; CMOV-NEXT:    jne .LBB3_3114; CMOV-NEXT:  # %bb.1: # %entry115; CMOV-NEXT:    jp .LBB3_3116; CMOV-NEXT:  # %bb.2: # %entry117; CMOV-NEXT:    movaps %xmm2, %xmm3118; CMOV-NEXT:  .LBB3_3: # %entry119; CMOV-NEXT:    movaps %xmm3, %xmm0120; CMOV-NEXT:    retq121;122; NOCMOV-LABEL: test_select_fcmp_oeq_f64:123; NOCMOV:       # %bb.0: # %entry124; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)125; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)126; NOCMOV-NEXT:    fucompp127; NOCMOV-NEXT:    fnstsw %ax128; NOCMOV-NEXT:    # kill: def $ah killed $ah killed $ax129; NOCMOV-NEXT:    sahf130; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %eax131; NOCMOV-NEXT:    jne .LBB3_3132; NOCMOV-NEXT:  # %bb.1: # %entry133; NOCMOV-NEXT:    jp .LBB3_3134; NOCMOV-NEXT:  # %bb.2: # %entry135; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %eax136; NOCMOV-NEXT:  .LBB3_3: # %entry137; NOCMOV-NEXT:    fldl (%eax)138; NOCMOV-NEXT:    retl139entry:140  %cmp = fcmp oeq float %a, %b141  %r = select i1 %cmp, double %c, double %d142  ret double %r143}144 145define <4 x i32> @test_select_fcmp_oeq_v4i32(float %a, float %b, <4 x i32> %c, <4 x i32> %d) nounwind {146; CMOV-LABEL: test_select_fcmp_oeq_v4i32:147; CMOV:       # %bb.0: # %entry148; CMOV-NEXT:    ucomiss %xmm1, %xmm0149; CMOV-NEXT:    jne .LBB4_3150; CMOV-NEXT:  # %bb.1: # %entry151; CMOV-NEXT:    jp .LBB4_3152; CMOV-NEXT:  # %bb.2: # %entry153; CMOV-NEXT:    movaps %xmm2, %xmm3154; CMOV-NEXT:  .LBB4_3: # %entry155; CMOV-NEXT:    movaps %xmm3, %xmm0156; CMOV-NEXT:    retq157;158; NOCMOV-LABEL: test_select_fcmp_oeq_v4i32:159; NOCMOV:       # %bb.0: # %entry160; NOCMOV-NEXT:    pushl %edi161; NOCMOV-NEXT:    pushl %esi162; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)163; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)164; NOCMOV-NEXT:    fucompp165; NOCMOV-NEXT:    fnstsw %ax166; NOCMOV-NEXT:    # kill: def $ah killed $ah killed $ax167; NOCMOV-NEXT:    sahf168; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %ecx169; NOCMOV-NEXT:    jne .LBB4_3170; NOCMOV-NEXT:  # %bb.1: # %entry171; NOCMOV-NEXT:    jp .LBB4_3172; NOCMOV-NEXT:  # %bb.2: # %entry173; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %ecx174; NOCMOV-NEXT:  .LBB4_3: # %entry175; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %edx176; NOCMOV-NEXT:    jne .LBB4_6177; NOCMOV-NEXT:  # %bb.4: # %entry178; NOCMOV-NEXT:    jp .LBB4_6179; NOCMOV-NEXT:  # %bb.5: # %entry180; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %edx181; NOCMOV-NEXT:  .LBB4_6: # %entry182; NOCMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax183; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %esi184; NOCMOV-NEXT:    jne .LBB4_9185; NOCMOV-NEXT:  # %bb.7: # %entry186; NOCMOV-NEXT:    jp .LBB4_9187; NOCMOV-NEXT:  # %bb.8: # %entry188; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %esi189; NOCMOV-NEXT:  .LBB4_9: # %entry190; NOCMOV-NEXT:    movl (%ecx), %ecx191; NOCMOV-NEXT:    movl (%edx), %edx192; NOCMOV-NEXT:    movl (%esi), %esi193; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %edi194; NOCMOV-NEXT:    jne .LBB4_12195; NOCMOV-NEXT:  # %bb.10: # %entry196; NOCMOV-NEXT:    jp .LBB4_12197; NOCMOV-NEXT:  # %bb.11: # %entry198; NOCMOV-NEXT:    leal {{[0-9]+}}(%esp), %edi199; NOCMOV-NEXT:  .LBB4_12: # %entry200; NOCMOV-NEXT:    movl (%edi), %edi201; NOCMOV-NEXT:    movl %edi, 12(%eax)202; NOCMOV-NEXT:    movl %esi, 8(%eax)203; NOCMOV-NEXT:    movl %edx, 4(%eax)204; NOCMOV-NEXT:    movl %ecx, (%eax)205; NOCMOV-NEXT:    popl %esi206; NOCMOV-NEXT:    popl %edi207; NOCMOV-NEXT:    retl $4208entry:209  %cmp = fcmp oeq float %a, %b210  %r = select i1 %cmp, <4 x i32> %c, <4 x i32> %d211  ret <4 x i32> %r212}213 214; Also make sure we catch the original code-sequence of interest:215 216define dso_local float @test_zext_fcmp_une(float %a, float %b) nounwind {217; CMOV-LABEL: test_zext_fcmp_une:218; CMOV:       # %bb.0: # %entry219; CMOV-NEXT:    cmpneqss %xmm1, %xmm0220; CMOV-NEXT:    movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]221; CMOV-NEXT:    andps %xmm1, %xmm0222; CMOV-NEXT:    retq223;224; NOCMOV-LABEL: test_zext_fcmp_une:225; NOCMOV:       # %bb.0: # %entry226; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)227; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)228; NOCMOV-NEXT:    fucompp229; NOCMOV-NEXT:    fnstsw %ax230; NOCMOV-NEXT:    # kill: def $ah killed $ah killed $ax231; NOCMOV-NEXT:    sahf232; NOCMOV-NEXT:    fld1233; NOCMOV-NEXT:    fldz234; NOCMOV-NEXT:    jne .LBB5_1235; NOCMOV-NEXT:  # %bb.2: # %entry236; NOCMOV-NEXT:    jp .LBB5_5237; NOCMOV-NEXT:  # %bb.3: # %entry238; NOCMOV-NEXT:    fstp %st(1)239; NOCMOV-NEXT:    jmp .LBB5_4240; NOCMOV-NEXT:  .LBB5_1:241; NOCMOV-NEXT:    fstp %st(0)242; NOCMOV-NEXT:  .LBB5_4: # %entry243; NOCMOV-NEXT:    fldz244; NOCMOV-NEXT:  .LBB5_5: # %entry245; NOCMOV-NEXT:    fstp %st(0)246; NOCMOV-NEXT:    retl247entry:248  %cmp = fcmp une float %a, %b249  %conv1 = zext i1 %cmp to i32250  %conv2 = sitofp i32 %conv1 to float251  ret float %conv2252}253 254define dso_local float @test_zext_fcmp_oeq(float %a, float %b) nounwind {255; CMOV-LABEL: test_zext_fcmp_oeq:256; CMOV:       # %bb.0: # %entry257; CMOV-NEXT:    cmpeqss %xmm1, %xmm0258; CMOV-NEXT:    movss {{.*#+}} xmm1 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]259; CMOV-NEXT:    andps %xmm1, %xmm0260; CMOV-NEXT:    retq261;262; NOCMOV-LABEL: test_zext_fcmp_oeq:263; NOCMOV:       # %bb.0: # %entry264; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)265; NOCMOV-NEXT:    flds {{[0-9]+}}(%esp)266; NOCMOV-NEXT:    fucompp267; NOCMOV-NEXT:    fnstsw %ax268; NOCMOV-NEXT:    # kill: def $ah killed $ah killed $ax269; NOCMOV-NEXT:    sahf270; NOCMOV-NEXT:    fldz271; NOCMOV-NEXT:    fld1272; NOCMOV-NEXT:    jne .LBB6_1273; NOCMOV-NEXT:  # %bb.2: # %entry274; NOCMOV-NEXT:    jp .LBB6_5275; NOCMOV-NEXT:  # %bb.3: # %entry276; NOCMOV-NEXT:    fstp %st(1)277; NOCMOV-NEXT:    jmp .LBB6_4278; NOCMOV-NEXT:  .LBB6_1:279; NOCMOV-NEXT:    fstp %st(0)280; NOCMOV-NEXT:  .LBB6_4: # %entry281; NOCMOV-NEXT:    fldz282; NOCMOV-NEXT:  .LBB6_5: # %entry283; NOCMOV-NEXT:    fstp %st(0)284; NOCMOV-NEXT:    retl285entry:286  %cmp = fcmp oeq float %a, %b287  %conv1 = zext i1 %cmp to i32288  %conv2 = sitofp i32 %conv1 to float289  ret float %conv2290}291 292attributes #0 = { nounwind }293 294@g8 = dso_local global i8 0295 296; The following test failed because llvm had a bug where a structure like:297;298; %12 = CMOV_GR8 %7, %11 ... (lt)299; %13 = CMOV_GR8 %12, %11 ... (gt)300;301; was lowered to:302;303; The first two cmovs got expanded to:304; %bb.0:305;   JCC_1 %bb.9, 12306; %bb.7:307;   JCC_1 %bb.9, 15308; %bb.8:309; %bb.9:310;   %12 = phi(%7, %bb.8, %11, %bb.0, %12, %bb.7)311;   %13 = COPY %12312; Which was invalid as %12 is not the same value as %13313 314define dso_local void @no_cascade_opt(i32 %v0, i32 %v1, i32 %v2, i32 %v3) nounwind {315; CMOV-LABEL: no_cascade_opt:316; CMOV:       # %bb.0: # %entry317; CMOV-NEXT:    cmpl %edx, %esi318; CMOV-NEXT:    movl $20, %eax319; CMOV-NEXT:    cmovll %eax, %ecx320; CMOV-NEXT:    cmovlel %ecx, %eax321; CMOV-NEXT:    testl %edi, %edi322; CMOV-NEXT:    cmovnel %ecx, %eax323; CMOV-NEXT:    movb %al, g8(%rip)324; CMOV-NEXT:    retq325;326; NOCMOV-LABEL: no_cascade_opt:327; NOCMOV:       # %bb.0: # %entry328; NOCMOV-NEXT:    movl {{[0-9]+}}(%esp), %eax329; NOCMOV-NEXT:    cmpl {{[0-9]+}}(%esp), %eax330; NOCMOV-NEXT:    movb $20, %al331; NOCMOV-NEXT:    movb $20, %cl332; NOCMOV-NEXT:    jge .LBB7_1333; NOCMOV-NEXT:  # %bb.2: # %entry334; NOCMOV-NEXT:    jle .LBB7_3335; NOCMOV-NEXT:  .LBB7_4: # %entry336; NOCMOV-NEXT:    cmpl $0, {{[0-9]+}}(%esp)337; NOCMOV-NEXT:    jne .LBB7_5338; NOCMOV-NEXT:  .LBB7_6: # %entry339; NOCMOV-NEXT:    movb %al, g8340; NOCMOV-NEXT:    retl341; NOCMOV-NEXT:  .LBB7_1: # %entry342; NOCMOV-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx343; NOCMOV-NEXT:    jg .LBB7_4344; NOCMOV-NEXT:  .LBB7_3: # %entry345; NOCMOV-NEXT:    movl %ecx, %eax346; NOCMOV-NEXT:    cmpl $0, {{[0-9]+}}(%esp)347; NOCMOV-NEXT:    je .LBB7_6348; NOCMOV-NEXT:  .LBB7_5: # %entry349; NOCMOV-NEXT:    movl %ecx, %eax350; NOCMOV-NEXT:    movb %al, g8351; NOCMOV-NEXT:    retl352entry:353  %c0 = icmp eq i32 %v0, 0354  %c1 = icmp slt i32 %v1, %v2355  %c2 = icmp sgt i32 %v1, %v2356  %trunc = trunc i32 %v3 to i8357  %sel0 = select i1 %c1, i8 20, i8 %trunc358  %sel1 = select i1 %c2, i8 20, i8 %sel0359  %sel2 = select i1 %c0, i8 %sel1, i8 %sel0360  store volatile i8 %sel2, ptr @g8361  ret void362}363