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