brintos

brintos / llvm-project-archived public Read only

0
0
Text · 11.7 KiB · 4124553 Raw
318 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown -verify-machineinstrs | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=i686-unknown -verify-machineinstrs | FileCheck %s --check-prefix=X864 5; This test is targeted at 64-bit mode. It used to crash due to the creation of an EXTRACT_SUBREG after the peephole pass had ran.6define void @f() nounwind {7; X64-LABEL: f:8; X64:       # %bb.0: # %BB9; X64-NEXT:    movzbl (%rax), %eax10; X64-NEXT:    cmpb $0, (%rax)11; X64-NEXT:    setne (%rax)12; X64-NEXT:    leaq -{{[0-9]+}}(%rsp), %rax13; X64-NEXT:    movq %rax, (%rax)14; X64-NEXT:    movb $0, (%rax)15; X64-NEXT:    retq16;17; X86-LABEL: f:18; X86:       # %bb.0: # %BB_udiv-special-cases19; X86-NEXT:    pushl %ebp20; X86-NEXT:    movl %esp, %ebp21; X86-NEXT:    pushl %ebx22; X86-NEXT:    pushl %edi23; X86-NEXT:    pushl %esi24; X86-NEXT:    andl $-16, %esp25; X86-NEXT:    subl $160, %esp26; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi27; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi28; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx29; X86-NEXT:    movzbl (%eax), %eax30; X86-NEXT:    movzbl (%eax), %ecx31; X86-NEXT:    movzbl %al, %eax32; X86-NEXT:    movb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Spill33; X86-NEXT:    divb %cl34; X86-NEXT:    movl %edi, %eax35; X86-NEXT:    shll $30, %eax36; X86-NEXT:    movl %eax, %ecx37; X86-NEXT:    sarl $30, %ecx38; X86-NEXT:    sarl $31, %eax39; X86-NEXT:    xorl %eax, %edi40; X86-NEXT:    xorl %eax, %edx41; X86-NEXT:    shrdl $1, %eax, %ecx42; X86-NEXT:    xorl %ecx, %esi43; X86-NEXT:    subl %ecx, %esi44; X86-NEXT:    sbbl %eax, %edx45; X86-NEXT:    sbbl %eax, %edi46; X86-NEXT:    movl %edi, %ecx47; X86-NEXT:    shldl $30, %edx, %ecx48; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill49; X86-NEXT:    shldl $30, %esi, %edx50; X86-NEXT:    testl %ecx, %ecx51; X86-NEXT:    jne .LBB0_152; X86-NEXT:  # %bb.2: # %BB_udiv-special-cases53; X86-NEXT:    bsrl %edx, %eax54; X86-NEXT:    xorl $31, %eax55; X86-NEXT:    orl $32, %eax56; X86-NEXT:    jmp .LBB0_357; X86-NEXT:  .LBB0_1:58; X86-NEXT:    bsrl %ecx, %eax59; X86-NEXT:    xorl $31, %eax60; X86-NEXT:  .LBB0_3: # %BB_udiv-special-cases61; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill62; X86-NEXT:    shll $30, %esi63; X86-NEXT:    jne .LBB0_464; X86-NEXT:  # %bb.5: # %BB_udiv-special-cases65; X86-NEXT:    movl $64, %esi66; X86-NEXT:    orl %ecx, %edx67; X86-NEXT:    je .LBB0_768; X86-NEXT:    jmp .LBB0_869; X86-NEXT:  .LBB0_4:70; X86-NEXT:    bsrl %esi, %esi71; X86-NEXT:    xorl $31, %esi72; X86-NEXT:    orl %ecx, %edx73; X86-NEXT:    jne .LBB0_874; X86-NEXT:  .LBB0_7: # %BB_udiv-special-cases75; X86-NEXT:    addl $64, %esi76; X86-NEXT:    movl %esi, %eax77; X86-NEXT:  .LBB0_8: # %BB_udiv-special-cases78; X86-NEXT:    leal {{[0-9]+}}(%esp), %esi79; X86-NEXT:    addl $-66, %eax80; X86-NEXT:    movl $0, %ebx81; X86-NEXT:    adcl $-1, %ebx82; X86-NEXT:    movl $0, %edx83; X86-NEXT:    adcl $3, %edx84; X86-NEXT:    movb $1, %cl85; X86-NEXT:    testb %cl, %cl86; X86-NEXT:    jne .LBB0_1487; X86-NEXT:  # %bb.9: # %BB_udiv-special-cases88; X86-NEXT:    andl $3, %edx89; X86-NEXT:    movl %eax, %ecx90; X86-NEXT:    xorl $65, %ecx91; X86-NEXT:    orl %edx, %ecx92; X86-NEXT:    orl %ebx, %ecx93; X86-NEXT:    je .LBB0_1494; X86-NEXT:  # %bb.10: # %udiv-bb195; X86-NEXT:    movl %eax, %ecx96; X86-NEXT:    addl $1, %ecx97; X86-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill98; X86-NEXT:    adcl $0, %ebx99; X86-NEXT:    adcl $0, %edx100; X86-NEXT:    andl $3, %edx101; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill102; X86-NEXT:    movb $65, %cl103; X86-NEXT:    subb %al, %cl104; X86-NEXT:    movl %ecx, %eax105; X86-NEXT:    shrb $3, %al106; X86-NEXT:    andb $12, %al107; X86-NEXT:    negb %al108; X86-NEXT:    movsbl %al, %esi109; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)110; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)111; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)112; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)113; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)114; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)115; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)116; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)117; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill118; X86-NEXT:    movl 112(%esp,%esi), %edi119; X86-NEXT:    movl 116(%esp,%esi), %eax120; X86-NEXT:    movl 120(%esp,%esi), %esi121; X86-NEXT:    shldl %cl, %eax, %esi122; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill123; X86-NEXT:    shldl %cl, %edi, %eax124; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill125; X86-NEXT:    shll %cl, %edi126; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill127; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload128; X86-NEXT:    orl %edx, %eax129; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill130; X86-NEXT:    orl %ebx, %eax131; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload132; X86-NEXT:    je .LBB0_13133; X86-NEXT:  # %bb.11: # %udiv-preheader134; X86-NEXT:    andl $3, %edi135; X86-NEXT:    andl $3, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill136; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)137; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)138; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)139; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)140; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)141; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)142; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)143; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)144; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload145; X86-NEXT:    movl %ecx, %eax146; X86-NEXT:    shrb $3, %al147; X86-NEXT:    andb $12, %al148; X86-NEXT:    movzbl %al, %eax149; X86-NEXT:    movl 72(%esp,%eax), %ebx150; X86-NEXT:    movl 64(%esp,%eax), %esi151; X86-NEXT:    movl 68(%esp,%eax), %edx152; X86-NEXT:    movl %edx, %eax153; X86-NEXT:    shrdl %cl, %ebx, %eax154; X86-NEXT:    movl %eax, %ebx155; X86-NEXT:    # kill: def $cl killed $cl killed $ecx156; X86-NEXT:    shrdl %cl, %edx, %esi157; X86-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill158; X86-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill159; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload160; X86-NEXT:    addl $-1, %eax161; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill162; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload163; X86-NEXT:    adcl $-1, %eax164; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill165; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill166; X86-NEXT:    adcl $3, %edi167; X86-NEXT:    andl $3, %edi168; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill169; X86-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill170; X86-NEXT:    xorl %ecx, %ecx171; X86-NEXT:    .p2align 4172; X86-NEXT:  .LBB0_12: # %udiv-do-while173; X86-NEXT:    # =>This Inner Loop Header: Depth=1174; X86-NEXT:    movl %ebx, %esi175; X86-NEXT:    shldl $1, %ebx, %ecx176; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload177; X86-NEXT:    shldl $1, %ebx, %esi178; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload179; X86-NEXT:    movl %edi, %edx180; X86-NEXT:    andl $2, %edx181; X86-NEXT:    shrl %edx182; X86-NEXT:    leal (%edx,%ebx,2), %ebx183; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload184; X86-NEXT:    shldl $1, %edx, %edi185; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload186; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload187; X86-NEXT:    shldl $1, %eax, %edx188; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload189; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill190; X86-NEXT:    addl %eax, %eax191; X86-NEXT:    orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload192; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill193; X86-NEXT:    andl $3, %edi194; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill195; X86-NEXT:    cmpl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload196; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload197; X86-NEXT:    sbbl %esi, %edx198; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload199; X86-NEXT:    sbbl %ecx, %edx200; X86-NEXT:    shll $30, %edx201; X86-NEXT:    movl %edx, %edi202; X86-NEXT:    sarl $30, %edi203; X86-NEXT:    sarl $31, %edx204; X86-NEXT:    shrdl $1, %edx, %edi205; X86-NEXT:    movl %edi, %eax206; X86-NEXT:    andl $1, %eax207; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill208; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload209; X86-NEXT:    movl %edx, %eax210; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload211; X86-NEXT:    andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload212; X86-NEXT:    subl %edi, %ebx213; X86-NEXT:    movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill214; X86-NEXT:    sbbl %edx, %esi215; X86-NEXT:    movl %esi, %ebx216; X86-NEXT:    sbbl %eax, %ecx217; X86-NEXT:    andl $3, %ecx218; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload219; X86-NEXT:    addl $-1, %eax220; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload221; X86-NEXT:    adcl $-1, %edx222; X86-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload223; X86-NEXT:    adcl $3, %edi224; X86-NEXT:    andl $3, %edi225; X86-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill226; X86-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill227; X86-NEXT:    orl %edi, %eax228; X86-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill229; X86-NEXT:    orl %edx, %eax230; X86-NEXT:    jne .LBB0_12231; X86-NEXT:  .LBB0_13: # %udiv-loop-exit232; X86-NEXT:    leal {{[0-9]+}}(%esp), %esi233; X86-NEXT:  .LBB0_14: # %udiv-end234; X86-NEXT:    cmpb $0, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Reload235; X86-NEXT:    setne (%eax)236; X86-NEXT:    movl %esi, (%eax)237; X86-NEXT:    movb $0, (%eax)238; X86-NEXT:    leal -12(%ebp), %esp239; X86-NEXT:    popl %esi240; X86-NEXT:    popl %edi241; X86-NEXT:    popl %ebx242; X86-NEXT:    popl %ebp243; X86-NEXT:    retl244BB:245  %A30 = alloca i66246  %L17 = load i66, ptr %A30247  %B20 = and i66 %L17, -1248  %G2 = getelementptr i66, ptr %A30, i1 true249  %L10 = load volatile i8, ptr undef250  %L11 = load volatile i8, ptr undef251  %B6 = udiv i8 %L10, %L11252  %C15 = icmp eq i8 %L11, 0253  %B8 = srem i66 0, %B20254  %C2 = icmp ule i66 %B8, %B20255  %B5 = or i8 0, %B6256  %C19 = icmp uge i1 false, %C2257  %C1 = icmp sle i8 undef, %B5258  %B37 = srem i1 %C1, %C2259  %C7 = icmp uge i1 false, %C15260  store i1 %C7, ptr undef261  %G6 = getelementptr i66, ptr %G2, i1 %B37262  store ptr %G6, ptr undef263  %B30 = srem i1 %C19, %C7264  store i1 %B30, ptr undef265  ret void266}267 268; Similar to above, but bitwidth adjusted to target 32-bit mode. This also shows that we didn't constrain the register class when extracting a subreg.269define void @g() nounwind {270; X64-LABEL: g:271; X64:       # %bb.0: # %BB272; X64-NEXT:    movzbl (%rax), %eax273; X64-NEXT:    cmpb $0, (%rax)274; X64-NEXT:    setne (%rax)275; X64-NEXT:    leaq -{{[0-9]+}}(%rsp), %rax276; X64-NEXT:    movq %rax, (%rax)277; X64-NEXT:    movb $0, (%rax)278; X64-NEXT:    retq279;280; X86-LABEL: g:281; X86:       # %bb.0: # %BB282; X86-NEXT:    pushl %ebp283; X86-NEXT:    movl %esp, %ebp284; X86-NEXT:    andl $-8, %esp285; X86-NEXT:    subl $8, %esp286; X86-NEXT:    movzbl (%eax), %eax287; X86-NEXT:    cmpb $0, (%eax)288; X86-NEXT:    setne (%eax)289; X86-NEXT:    leal -{{[0-9]+}}(%esp), %eax290; X86-NEXT:    movl %eax, (%eax)291; X86-NEXT:    movb $0, (%eax)292; X86-NEXT:    movl %ebp, %esp293; X86-NEXT:    popl %ebp294; X86-NEXT:    retl295BB:296  %A30 = alloca i34297  %L17 = load i34, ptr %A30298  %B20 = and i34 %L17, -1299  %G2 = getelementptr i34, ptr %A30, i1 true300  %L10 = load volatile i8, ptr undef301  %L11 = load volatile i8, ptr undef302  %B6 = udiv i8 %L10, %L11303  %C15 = icmp eq i8 %L11, 0304  %B8 = srem i34 0, %B20305  %C2 = icmp ule i34 %B8, %B20306  %B5 = or i8 0, %B6307  %C19 = icmp uge i1 false, %C2308  %C1 = icmp sle i8 undef, %B5309  %B37 = srem i1 %C1, %C2310  %C7 = icmp uge i1 false, %C15311  store i1 %C7, ptr undef312  %G6 = getelementptr i34, ptr %G2, i1 %B37313  store ptr %G6, ptr undef314  %B30 = srem i1 %C19, %C7315  store i1 %B30, ptr undef316  ret void317}318