351 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=-cmov | FileCheck %s --check-prefix=I386-NOCMOV3; RUN: llc < %s -mtriple=i386-unknown-unknown -mattr=+cmov | FileCheck %s --check-prefix=I386-CMOV4; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=-cmov | FileCheck %s --check-prefix=I686-NOCMOV5; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+cmov | FileCheck %s --check-prefix=I686-CMOV6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=-cmov | FileCheck %s --check-prefix=X86_647; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+cmov | FileCheck %s --check-prefix=X86_648 9; Values don't come from regs. All good.10 11define i8 @t0(i32 %a1_wide_orig, i32 %a2_wide_orig, i32 %inc) nounwind {12; I386-NOCMOV-LABEL: t0:13; I386-NOCMOV: # %bb.0:14; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx15; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax16; I386-NOCMOV-NEXT: addl %ecx, %eax17; I386-NOCMOV-NEXT: addl {{[0-9]+}}(%esp), %ecx18; I386-NOCMOV-NEXT: cmpb %cl, %al19; I386-NOCMOV-NEXT: jg .LBB0_220; I386-NOCMOV-NEXT: # %bb.1:21; I386-NOCMOV-NEXT: movl %ecx, %eax22; I386-NOCMOV-NEXT: .LBB0_2:23; I386-NOCMOV-NEXT: # kill: def $al killed $al killed $eax24; I386-NOCMOV-NEXT: retl25;26; I386-CMOV-LABEL: t0:27; I386-CMOV: # %bb.0:28; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax29; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx30; I386-CMOV-NEXT: addl %eax, %ecx31; I386-CMOV-NEXT: addl {{[0-9]+}}(%esp), %eax32; I386-CMOV-NEXT: cmpb %al, %cl33; I386-CMOV-NEXT: cmovgl %ecx, %eax34; I386-CMOV-NEXT: # kill: def $al killed $al killed $eax35; I386-CMOV-NEXT: retl36;37; I686-NOCMOV-LABEL: t0:38; I686-NOCMOV: # %bb.0:39; I686-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx40; I686-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax41; I686-NOCMOV-NEXT: addl %ecx, %eax42; I686-NOCMOV-NEXT: addl {{[0-9]+}}(%esp), %ecx43; I686-NOCMOV-NEXT: cmpb %cl, %al44; I686-NOCMOV-NEXT: jg .LBB0_245; I686-NOCMOV-NEXT: # %bb.1:46; I686-NOCMOV-NEXT: movl %ecx, %eax47; I686-NOCMOV-NEXT: .LBB0_2:48; I686-NOCMOV-NEXT: # kill: def $al killed $al killed $eax49; I686-NOCMOV-NEXT: retl50;51; I686-CMOV-LABEL: t0:52; I686-CMOV: # %bb.0:53; I686-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax54; I686-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx55; I686-CMOV-NEXT: addl %eax, %ecx56; I686-CMOV-NEXT: addl {{[0-9]+}}(%esp), %eax57; I686-CMOV-NEXT: cmpb %al, %cl58; I686-CMOV-NEXT: cmovgl %ecx, %eax59; I686-CMOV-NEXT: # kill: def $al killed $al killed $eax60; I686-CMOV-NEXT: retl61;62; X86_64-LABEL: t0:63; X86_64: # %bb.0:64; X86_64-NEXT: # kill: def $edx killed $edx def $rdx65; X86_64-NEXT: # kill: def $esi killed $esi def $rsi66; X86_64-NEXT: # kill: def $edi killed $edi def $rdi67; X86_64-NEXT: leal (%rdi,%rdx), %ecx68; X86_64-NEXT: leal (%rsi,%rdx), %eax69; X86_64-NEXT: cmpb %al, %cl70; X86_64-NEXT: cmovgl %ecx, %eax71; X86_64-NEXT: # kill: def $al killed $al killed $eax72; X86_64-NEXT: retq73 %a1_wide = add i32 %a1_wide_orig, %inc74 %a2_wide = add i32 %a2_wide_orig, %inc75 %a1 = trunc i32 %a1_wide to i876 %a2 = trunc i32 %a2_wide to i877 %t1 = icmp sgt i8 %a1, %a278 %t2 = select i1 %t1, i8 %a1, i8 %a279 ret i8 %t280}81 82; Values don't come from regs, but there is only one truncation.83 84define i8 @neg_only_one_truncation(i32 %a1_wide_orig, i8 %a2_orig, i32 %inc) nounwind {85; I386-NOCMOV-LABEL: neg_only_one_truncation:86; I386-NOCMOV: # %bb.0:87; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx88; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax89; I386-NOCMOV-NEXT: addl %ecx, %eax90; I386-NOCMOV-NEXT: addb {{[0-9]+}}(%esp), %cl91; I386-NOCMOV-NEXT: cmpb %cl, %al92; I386-NOCMOV-NEXT: jg .LBB1_293; I386-NOCMOV-NEXT: # %bb.1:94; I386-NOCMOV-NEXT: movl %ecx, %eax95; I386-NOCMOV-NEXT: .LBB1_2:96; I386-NOCMOV-NEXT: # kill: def $al killed $al killed $eax97; I386-NOCMOV-NEXT: retl98;99; I386-CMOV-LABEL: neg_only_one_truncation:100; I386-CMOV: # %bb.0:101; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax102; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx103; I386-CMOV-NEXT: addl %eax, %ecx104; I386-CMOV-NEXT: addb {{[0-9]+}}(%esp), %al105; I386-CMOV-NEXT: cmpb %al, %cl106; I386-CMOV-NEXT: movzbl %al, %eax107; I386-CMOV-NEXT: cmovgl %ecx, %eax108; I386-CMOV-NEXT: # kill: def $al killed $al killed $eax109; I386-CMOV-NEXT: retl110;111; I686-NOCMOV-LABEL: neg_only_one_truncation:112; I686-NOCMOV: # %bb.0:113; I686-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx114; I686-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax115; I686-NOCMOV-NEXT: addl %ecx, %eax116; I686-NOCMOV-NEXT: addb {{[0-9]+}}(%esp), %cl117; I686-NOCMOV-NEXT: cmpb %cl, %al118; I686-NOCMOV-NEXT: jg .LBB1_2119; I686-NOCMOV-NEXT: # %bb.1:120; I686-NOCMOV-NEXT: movl %ecx, %eax121; I686-NOCMOV-NEXT: .LBB1_2:122; I686-NOCMOV-NEXT: # kill: def $al killed $al killed $eax123; I686-NOCMOV-NEXT: retl124;125; I686-CMOV-LABEL: neg_only_one_truncation:126; I686-CMOV: # %bb.0:127; I686-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax128; I686-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx129; I686-CMOV-NEXT: addl %eax, %ecx130; I686-CMOV-NEXT: addb {{[0-9]+}}(%esp), %al131; I686-CMOV-NEXT: cmpb %al, %cl132; I686-CMOV-NEXT: movzbl %al, %eax133; I686-CMOV-NEXT: cmovgl %ecx, %eax134; I686-CMOV-NEXT: # kill: def $al killed $al killed $eax135; I686-CMOV-NEXT: retl136;137; X86_64-LABEL: neg_only_one_truncation:138; X86_64: # %bb.0:139; X86_64-NEXT: # kill: def $edx killed $edx def $rdx140; X86_64-NEXT: # kill: def $edi killed $edi def $rdi141; X86_64-NEXT: leal (%rdi,%rdx), %ecx142; X86_64-NEXT: addb %sil, %dl143; X86_64-NEXT: cmpb %dl, %cl144; X86_64-NEXT: movzbl %dl, %eax145; X86_64-NEXT: cmovgl %ecx, %eax146; X86_64-NEXT: # kill: def $al killed $al killed $eax147; X86_64-NEXT: retq148 %a1_wide = add i32 %a1_wide_orig, %inc149 %inc_short = trunc i32 %inc to i8150 %a2 = add i8 %a2_orig, %inc_short151 %a1 = trunc i32 %a1_wide to i8152 %t1 = icmp sgt i8 %a1, %a2153 %t2 = select i1 %t1, i8 %a1, i8 %a2154 ret i8 %t2155}156 157; Values don't come from regs, but truncation from different types.158 159define i8 @neg_type_mismatch(i32 %a1_wide_orig, i16 %a2_wide_orig, i32 %inc) nounwind {160; I386-NOCMOV-LABEL: neg_type_mismatch:161; I386-NOCMOV: # %bb.0:162; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx163; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax164; I386-NOCMOV-NEXT: addl %ecx, %eax165; I386-NOCMOV-NEXT: addw {{[0-9]+}}(%esp), %cx166; I386-NOCMOV-NEXT: cmpb %cl, %al167; I386-NOCMOV-NEXT: jg .LBB2_2168; I386-NOCMOV-NEXT: # %bb.1:169; I386-NOCMOV-NEXT: movl %ecx, %eax170; I386-NOCMOV-NEXT: .LBB2_2:171; I386-NOCMOV-NEXT: # kill: def $al killed $al killed $eax172; I386-NOCMOV-NEXT: retl173;174; I386-CMOV-LABEL: neg_type_mismatch:175; I386-CMOV: # %bb.0:176; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax177; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx178; I386-CMOV-NEXT: addl %eax, %ecx179; I386-CMOV-NEXT: addw {{[0-9]+}}(%esp), %ax180; I386-CMOV-NEXT: cmpb %al, %cl181; I386-CMOV-NEXT: cmovgl %ecx, %eax182; I386-CMOV-NEXT: # kill: def $al killed $al killed $eax183; I386-CMOV-NEXT: retl184;185; I686-NOCMOV-LABEL: neg_type_mismatch:186; I686-NOCMOV: # %bb.0:187; I686-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx188; I686-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %eax189; I686-NOCMOV-NEXT: addl %ecx, %eax190; I686-NOCMOV-NEXT: addw {{[0-9]+}}(%esp), %cx191; I686-NOCMOV-NEXT: cmpb %cl, %al192; I686-NOCMOV-NEXT: jg .LBB2_2193; I686-NOCMOV-NEXT: # %bb.1:194; I686-NOCMOV-NEXT: movl %ecx, %eax195; I686-NOCMOV-NEXT: .LBB2_2:196; I686-NOCMOV-NEXT: # kill: def $al killed $al killed $eax197; I686-NOCMOV-NEXT: retl198;199; I686-CMOV-LABEL: neg_type_mismatch:200; I686-CMOV: # %bb.0:201; I686-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax202; I686-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx203; I686-CMOV-NEXT: addl %eax, %ecx204; I686-CMOV-NEXT: addw {{[0-9]+}}(%esp), %ax205; I686-CMOV-NEXT: cmpb %al, %cl206; I686-CMOV-NEXT: cmovgl %ecx, %eax207; I686-CMOV-NEXT: # kill: def $al killed $al killed $eax208; I686-CMOV-NEXT: retl209;210; X86_64-LABEL: neg_type_mismatch:211; X86_64: # %bb.0:212; X86_64-NEXT: # kill: def $edx killed $edx def $rdx213; X86_64-NEXT: # kill: def $esi killed $esi def $rsi214; X86_64-NEXT: # kill: def $edi killed $edi def $rdi215; X86_64-NEXT: leal (%rdi,%rdx), %ecx216; X86_64-NEXT: leal (%rsi,%rdx), %eax217; X86_64-NEXT: cmpb %al, %cl218; X86_64-NEXT: cmovgl %ecx, %eax219; X86_64-NEXT: # kill: def $al killed $al killed $eax220; X86_64-NEXT: retq221 %a1_wide = add i32 %a1_wide_orig, %inc222 %inc_short = trunc i32 %inc to i16223 %a2_wide = add i16 %a2_wide_orig, %inc_short224 %a1 = trunc i32 %a1_wide to i8225 %a2 = trunc i16 %a2_wide to i8226 %t1 = icmp sgt i8 %a1, %a2227 %t2 = select i1 %t1, i8 %a1, i8 %a2228 ret i8 %t2229}230 231; One value come from regs232 233define i8 @negative_CopyFromReg(i32 %a1_wide, i32 %a2_wide_orig, i32 %inc) nounwind {234; I386-NOCMOV-LABEL: negative_CopyFromReg:235; I386-NOCMOV: # %bb.0:236; I386-NOCMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax237; I386-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx238; I386-NOCMOV-NEXT: addl {{[0-9]+}}(%esp), %ecx239; I386-NOCMOV-NEXT: cmpb %cl, %al240; I386-NOCMOV-NEXT: jg .LBB3_2241; I386-NOCMOV-NEXT: # %bb.1:242; I386-NOCMOV-NEXT: movl %ecx, %eax243; I386-NOCMOV-NEXT: .LBB3_2:244; I386-NOCMOV-NEXT: retl245;246; I386-CMOV-LABEL: negative_CopyFromReg:247; I386-CMOV: # %bb.0:248; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx249; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax250; I386-CMOV-NEXT: addl {{[0-9]+}}(%esp), %eax251; I386-CMOV-NEXT: cmpb %al, %cl252; I386-CMOV-NEXT: cmovgl %ecx, %eax253; I386-CMOV-NEXT: # kill: def $al killed $al killed $eax254; I386-CMOV-NEXT: retl255;256; I686-NOCMOV-LABEL: negative_CopyFromReg:257; I686-NOCMOV: # %bb.0:258; I686-NOCMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax259; I686-NOCMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx260; I686-NOCMOV-NEXT: addl {{[0-9]+}}(%esp), %ecx261; I686-NOCMOV-NEXT: cmpb %cl, %al262; I686-NOCMOV-NEXT: jg .LBB3_2263; I686-NOCMOV-NEXT: # %bb.1:264; I686-NOCMOV-NEXT: movl %ecx, %eax265; I686-NOCMOV-NEXT: .LBB3_2:266; I686-NOCMOV-NEXT: retl267;268; I686-CMOV-LABEL: negative_CopyFromReg:269; I686-CMOV: # %bb.0:270; I686-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx271; I686-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax272; I686-CMOV-NEXT: addl {{[0-9]+}}(%esp), %eax273; I686-CMOV-NEXT: cmpb %al, %cl274; I686-CMOV-NEXT: cmovgl %ecx, %eax275; I686-CMOV-NEXT: # kill: def $al killed $al killed $eax276; I686-CMOV-NEXT: retl277;278; X86_64-LABEL: negative_CopyFromReg:279; X86_64: # %bb.0:280; X86_64-NEXT: # kill: def $edx killed $edx def $rdx281; X86_64-NEXT: # kill: def $esi killed $esi def $rsi282; X86_64-NEXT: leal (%rsi,%rdx), %eax283; X86_64-NEXT: cmpb %al, %dil284; X86_64-NEXT: cmovgl %edi, %eax285; X86_64-NEXT: # kill: def $al killed $al killed $eax286; X86_64-NEXT: retq287 %a2_wide = add i32 %a2_wide_orig, %inc288 %a1 = trunc i32 %a1_wide to i8289 %a2 = trunc i32 %a2_wide to i8290 %t1 = icmp sgt i8 %a1, %a2291 %t2 = select i1 %t1, i8 %a1, i8 %a2292 ret i8 %t2293}294 295; Both values come from regs296 297define i8 @negative_CopyFromRegs(i32 %a1_wide, i32 %a2_wide) nounwind {298; I386-NOCMOV-LABEL: negative_CopyFromRegs:299; I386-NOCMOV: # %bb.0:300; I386-NOCMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx301; I386-NOCMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax302; I386-NOCMOV-NEXT: cmpb %cl, %al303; I386-NOCMOV-NEXT: jg .LBB4_2304; I386-NOCMOV-NEXT: # %bb.1:305; I386-NOCMOV-NEXT: movl %ecx, %eax306; I386-NOCMOV-NEXT: .LBB4_2:307; I386-NOCMOV-NEXT: retl308;309; I386-CMOV-LABEL: negative_CopyFromRegs:310; I386-CMOV: # %bb.0:311; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax312; I386-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx313; I386-CMOV-NEXT: cmpb %al, %cl314; I386-CMOV-NEXT: cmovgl %ecx, %eax315; I386-CMOV-NEXT: # kill: def $al killed $al killed $eax316; I386-CMOV-NEXT: retl317;318; I686-NOCMOV-LABEL: negative_CopyFromRegs:319; I686-NOCMOV: # %bb.0:320; I686-NOCMOV-NEXT: movzbl {{[0-9]+}}(%esp), %ecx321; I686-NOCMOV-NEXT: movzbl {{[0-9]+}}(%esp), %eax322; I686-NOCMOV-NEXT: cmpb %cl, %al323; I686-NOCMOV-NEXT: jg .LBB4_2324; I686-NOCMOV-NEXT: # %bb.1:325; I686-NOCMOV-NEXT: movl %ecx, %eax326; I686-NOCMOV-NEXT: .LBB4_2:327; I686-NOCMOV-NEXT: retl328;329; I686-CMOV-LABEL: negative_CopyFromRegs:330; I686-CMOV: # %bb.0:331; I686-CMOV-NEXT: movl {{[0-9]+}}(%esp), %eax332; I686-CMOV-NEXT: movl {{[0-9]+}}(%esp), %ecx333; I686-CMOV-NEXT: cmpb %al, %cl334; I686-CMOV-NEXT: cmovgl %ecx, %eax335; I686-CMOV-NEXT: # kill: def $al killed $al killed $eax336; I686-CMOV-NEXT: retl337;338; X86_64-LABEL: negative_CopyFromRegs:339; X86_64: # %bb.0:340; X86_64-NEXT: movl %esi, %eax341; X86_64-NEXT: cmpb %al, %dil342; X86_64-NEXT: cmovgl %edi, %eax343; X86_64-NEXT: # kill: def $al killed $al killed $eax344; X86_64-NEXT: retq345 %a1 = trunc i32 %a1_wide to i8346 %a2 = trunc i32 %a2_wide to i8347 %t1 = icmp sgt i8 %a1, %a2348 %t2 = select i1 %t1, i8 %a1, i8 %a2349 ret i8 %t2350}351