547 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=x86_64-pc-linux-gnux32 | FileCheck %s --check-prefix=X644; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s --check-prefix=X865; At least one of the test cases in here crashed when linearizing the DAG.6; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -pre-RA-sched=linearize | FileCheck %s --check-prefix=X647 8define i32 @mul4_32(i32 %A) {9; X64-LABEL: mul4_32:10; X64: # %bb.0:11; X64-NEXT: # kill: def $edi killed $edi def $rdi12; X64-NEXT: leal (,%rdi,4), %eax13; X64-NEXT: retq14;15; X86-LABEL: mul4_32:16; X86: # %bb.0:17; X86-NEXT: movl {{[0-9]+}}(%esp), %eax18; X86-NEXT: shll $2, %eax19; X86-NEXT: retl20 %mul = mul i32 %A, 421 ret i32 %mul22}23 24define i64 @mul4_64(i64 %A) {25; X64-LABEL: mul4_64:26; X64: # %bb.0:27; X64-NEXT: leaq (,%rdi,4), %rax28; X64-NEXT: retq29;30; X86-LABEL: mul4_64:31; X86: # %bb.0:32; X86-NEXT: movl {{[0-9]+}}(%esp), %eax33; X86-NEXT: movl {{[0-9]+}}(%esp), %edx34; X86-NEXT: shldl $2, %eax, %edx35; X86-NEXT: shll $2, %eax36; X86-NEXT: retl37 %mul = mul i64 %A, 438 ret i64 %mul39}40 41define i32 @mul4096_32(i32 %A) {42; X64-LABEL: mul4096_32:43; X64: # %bb.0:44; X64-NEXT: movl %edi, %eax45; X64-NEXT: shll $12, %eax46; X64-NEXT: retq47;48; X86-LABEL: mul4096_32:49; X86: # %bb.0:50; X86-NEXT: movl {{[0-9]+}}(%esp), %eax51; X86-NEXT: shll $12, %eax52; X86-NEXT: retl53 %mul = mul i32 %A, 409654 ret i32 %mul55}56 57define i64 @mul4096_64(i64 %A) {58; X64-LABEL: mul4096_64:59; X64: # %bb.0:60; X64-NEXT: movq %rdi, %rax61; X64-NEXT: shlq $12, %rax62; X64-NEXT: retq63;64; X86-LABEL: mul4096_64:65; X86: # %bb.0:66; X86-NEXT: movl {{[0-9]+}}(%esp), %eax67; X86-NEXT: movl {{[0-9]+}}(%esp), %edx68; X86-NEXT: shldl $12, %eax, %edx69; X86-NEXT: shll $12, %eax70; X86-NEXT: retl71 %mul = mul i64 %A, 409672 ret i64 %mul73}74 75define i32 @mulmin4096_32(i32 %A) {76; X64-LABEL: mulmin4096_32:77; X64: # %bb.0:78; X64-NEXT: movl %edi, %eax79; X64-NEXT: shll $12, %eax80; X64-NEXT: negl %eax81; X64-NEXT: retq82;83; X86-LABEL: mulmin4096_32:84; X86: # %bb.0:85; X86-NEXT: movl {{[0-9]+}}(%esp), %eax86; X86-NEXT: shll $12, %eax87; X86-NEXT: negl %eax88; X86-NEXT: retl89 %mul = mul i32 %A, -409690 ret i32 %mul91}92 93define i64 @mulmin4096_64(i64 %A) {94; X64-LABEL: mulmin4096_64:95; X64: # %bb.0:96; X64-NEXT: movq %rdi, %rax97; X64-NEXT: shlq $12, %rax98; X64-NEXT: negq %rax99; X64-NEXT: retq100;101; X86-LABEL: mulmin4096_64:102; X86: # %bb.0:103; X86-NEXT: movl {{[0-9]+}}(%esp), %eax104; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx105; X86-NEXT: shldl $12, %eax, %ecx106; X86-NEXT: shll $12, %eax107; X86-NEXT: xorl %edx, %edx108; X86-NEXT: negl %eax109; X86-NEXT: sbbl %ecx, %edx110; X86-NEXT: retl111 %mul = mul i64 %A, -4096112 ret i64 %mul113}114 115define i32 @mul3_32(i32 %A) {116; X64-LABEL: mul3_32:117; X64: # %bb.0:118; X64-NEXT: # kill: def $edi killed $edi def $rdi119; X64-NEXT: leal (%rdi,%rdi,2), %eax120; X64-NEXT: retq121;122; X86-LABEL: mul3_32:123; X86: # %bb.0:124; X86-NEXT: movl {{[0-9]+}}(%esp), %eax125; X86-NEXT: leal (%eax,%eax,2), %eax126; X86-NEXT: retl127; But why?!128 %mul = mul i32 %A, 3129 ret i32 %mul130}131 132define i64 @mul3_64(i64 %A) {133; X64-LABEL: mul3_64:134; X64: # %bb.0:135; X64-NEXT: leaq (%rdi,%rdi,2), %rax136; X64-NEXT: retq137;138; X86-LABEL: mul3_64:139; X86: # %bb.0:140; X86-NEXT: movl {{[0-9]+}}(%esp), %eax141; X86-NEXT: leal (%eax,%eax,2), %ecx142; X86-NEXT: movl $3, %eax143; X86-NEXT: mull {{[0-9]+}}(%esp)144; X86-NEXT: addl %ecx, %edx145; X86-NEXT: retl146 %mul = mul i64 %A, 3147 ret i64 %mul148}149 150define i32 @mul40_32(i32 %A) {151; X64-LABEL: mul40_32:152; X64: # %bb.0:153; X64-NEXT: # kill: def $edi killed $edi def $rdi154; X64-NEXT: shll $3, %edi155; X64-NEXT: leal (%rdi,%rdi,4), %eax156; X64-NEXT: retq157;158; X86-LABEL: mul40_32:159; X86: # %bb.0:160; X86-NEXT: movl {{[0-9]+}}(%esp), %eax161; X86-NEXT: shll $3, %eax162; X86-NEXT: leal (%eax,%eax,4), %eax163; X86-NEXT: retl164 %mul = mul i32 %A, 40165 ret i32 %mul166}167 168define i64 @mul40_64(i64 %A) {169; X64-LABEL: mul40_64:170; X64: # %bb.0:171; X64-NEXT: shlq $3, %rdi172; X64-NEXT: leaq (%rdi,%rdi,4), %rax173; X64-NEXT: retq174;175; X86-LABEL: mul40_64:176; X86: # %bb.0:177; X86-NEXT: movl {{[0-9]+}}(%esp), %eax178; X86-NEXT: leal (%eax,%eax,4), %ecx179; X86-NEXT: movl $40, %eax180; X86-NEXT: mull {{[0-9]+}}(%esp)181; X86-NEXT: leal (%edx,%ecx,8), %edx182; X86-NEXT: retl183 %mul = mul i64 %A, 40184 ret i64 %mul185}186 187define i32 @mul4_32_minsize(i32 %A) minsize {188; X64-LABEL: mul4_32_minsize:189; X64: # %bb.0:190; X64-NEXT: # kill: def $edi killed $edi def $rdi191; X64-NEXT: leal (,%rdi,4), %eax192; X64-NEXT: retq193;194; X86-LABEL: mul4_32_minsize:195; X86: # %bb.0:196; X86-NEXT: movl {{[0-9]+}}(%esp), %eax197; X86-NEXT: shll $2, %eax198; X86-NEXT: retl199 %mul = mul i32 %A, 4200 ret i32 %mul201}202 203define i32 @mul40_32_minsize(i32 %A) minsize {204; X64-LABEL: mul40_32_minsize:205; X64: # %bb.0:206; X64-NEXT: imull $40, %edi, %eax207; X64-NEXT: retq208;209; X86-LABEL: mul40_32_minsize:210; X86: # %bb.0:211; X86-NEXT: imull $40, {{[0-9]+}}(%esp), %eax212; X86-NEXT: retl213 %mul = mul i32 %A, 40214 ret i32 %mul215}216 217define i32 @mul33_32(i32 %A) {218; X64-LABEL: mul33_32:219; X64: # %bb.0:220; X64-NEXT: movl %edi, %eax221; X64-NEXT: shll $5, %eax222; X64-NEXT: addl %edi, %eax223; X64-NEXT: retq224;225; X86-LABEL: mul33_32:226; X86: # %bb.0:227; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx228; X86-NEXT: movl %ecx, %eax229; X86-NEXT: shll $5, %eax230; X86-NEXT: addl %ecx, %eax231; X86-NEXT: retl232 %mul = mul i32 %A, 33233 ret i32 %mul234}235 236define i32 @mul31_32(i32 %A) {237; X64-LABEL: mul31_32:238; X64: # %bb.0:239; X64-NEXT: movl %edi, %eax240; X64-NEXT: shll $5, %eax241; X64-NEXT: subl %edi, %eax242; X64-NEXT: retq243;244; X86-LABEL: mul31_32:245; X86: # %bb.0:246; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx247; X86-NEXT: movl %ecx, %eax248; X86-NEXT: shll $5, %eax249; X86-NEXT: subl %ecx, %eax250; X86-NEXT: retl251 %mul = mul i32 %A, 31252 ret i32 %mul253}254 255define i32 @mul0_32(i32 %A) {256; X64-LABEL: mul0_32:257; X64: # %bb.0:258; X64-NEXT: xorl %eax, %eax259; X64-NEXT: retq260;261; X86-LABEL: mul0_32:262; X86: # %bb.0:263; X86-NEXT: xorl %eax, %eax264; X86-NEXT: retl265 %mul = mul i32 %A, 0266 ret i32 %mul267}268 269define i32 @mul4294967295_32(i32 %A) {270; X64-LABEL: mul4294967295_32:271; X64: # %bb.0:272; X64-NEXT: movl %edi, %eax273; X64-NEXT: negl %eax274; X64-NEXT: retq275;276; X86-LABEL: mul4294967295_32:277; X86: # %bb.0:278; X86-NEXT: xorl %eax, %eax279; X86-NEXT: subl {{[0-9]+}}(%esp), %eax280; X86-NEXT: retl281 %mul = mul i32 %A, 4294967295282 ret i32 %mul283}284 285define i64 @mul18446744073709551615_64(i64 %A) {286; X64-LABEL: mul18446744073709551615_64:287; X64: # %bb.0:288; X64-NEXT: movq %rdi, %rax289; X64-NEXT: negq %rax290; X64-NEXT: retq291;292; X86-LABEL: mul18446744073709551615_64:293; X86: # %bb.0:294; X86-NEXT: xorl %edx, %edx295; X86-NEXT: xorl %eax, %eax296; X86-NEXT: subl {{[0-9]+}}(%esp), %eax297; X86-NEXT: sbbl {{[0-9]+}}(%esp), %edx298; X86-NEXT: retl299 %mul = mul i64 %A, 18446744073709551615300 ret i64 %mul301}302 303define i32 @test(i32 %a) {304; X64-LABEL: test:305; X64: # %bb.0: # %entry306; X64-NEXT: movl %edi, %eax307; X64-NEXT: shll $5, %eax308; X64-NEXT: subl %edi, %eax309; X64-NEXT: retq310;311; X86-LABEL: test:312; X86: # %bb.0: # %entry313; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx314; X86-NEXT: movl %ecx, %eax315; X86-NEXT: shll $5, %eax316; X86-NEXT: subl %ecx, %eax317; X86-NEXT: retl318entry:319 %tmp3 = mul i32 %a, 31320 ret i32 %tmp3321}322 323define i32 @test1(i32 %a) {324; X64-LABEL: test1:325; X64: # %bb.0: # %entry326; X64-NEXT: movl %edi, %eax327; X64-NEXT: movl %edi, %ecx328; X64-NEXT: shll $5, %ecx329; X64-NEXT: subl %ecx, %eax330; X64-NEXT: retq331;332; X86-LABEL: test1:333; X86: # %bb.0: # %entry334; X86-NEXT: movl {{[0-9]+}}(%esp), %eax335; X86-NEXT: movl %eax, %ecx336; X86-NEXT: shll $5, %ecx337; X86-NEXT: subl %ecx, %eax338; X86-NEXT: retl339entry:340 %tmp3 = mul i32 %a, -31341 ret i32 %tmp3342}343 344 345define i32 @test2(i32 %a) {346; X64-LABEL: test2:347; X64: # %bb.0: # %entry348; X64-NEXT: movl %edi, %eax349; X64-NEXT: shll $5, %eax350; X64-NEXT: addl %edi, %eax351; X64-NEXT: retq352;353; X86-LABEL: test2:354; X86: # %bb.0: # %entry355; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx356; X86-NEXT: movl %ecx, %eax357; X86-NEXT: shll $5, %eax358; X86-NEXT: addl %ecx, %eax359; X86-NEXT: retl360entry:361 %tmp3 = mul i32 %a, 33362 ret i32 %tmp3363}364 365define i32 @test3(i32 %a) {366; X64-LABEL: test3:367; X64: # %bb.0: # %entry368; X64-NEXT: movl %edi, %eax369; X64-NEXT: shll $5, %eax370; X64-NEXT: addl %edi, %eax371; X64-NEXT: negl %eax372; X64-NEXT: retq373;374; X86-LABEL: test3:375; X86: # %bb.0: # %entry376; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx377; X86-NEXT: movl %ecx, %eax378; X86-NEXT: shll $5, %eax379; X86-NEXT: addl %ecx, %eax380; X86-NEXT: negl %eax381; X86-NEXT: retl382entry:383 %tmp3 = mul i32 %a, -33384 ret i32 %tmp3385}386 387define i64 @test4(i64 %a) {388; X64-LABEL: test4:389; X64: # %bb.0: # %entry390; X64-NEXT: movq %rdi, %rax391; X64-NEXT: shlq $5, %rax392; X64-NEXT: subq %rdi, %rax393; X64-NEXT: retq394;395; X86-LABEL: test4:396; X86: # %bb.0: # %entry397; X86-NEXT: movl {{[0-9]+}}(%esp), %eax398; X86-NEXT: movl %eax, %ecx399; X86-NEXT: shll $5, %ecx400; X86-NEXT: subl %eax, %ecx401; X86-NEXT: movl $31, %eax402; X86-NEXT: mull {{[0-9]+}}(%esp)403; X86-NEXT: addl %ecx, %edx404; X86-NEXT: retl405entry:406 %tmp3 = mul i64 %a, 31407 ret i64 %tmp3408}409 410define i64 @test5(i64 %a) {411; X64-LABEL: test5:412; X64: # %bb.0: # %entry413; X64-NEXT: movq %rdi, %rax414; X64-NEXT: movq %rdi, %rcx415; X64-NEXT: shlq $5, %rcx416; X64-NEXT: subq %rcx, %rax417; X64-NEXT: retq418;419; X86-LABEL: test5:420; X86: # %bb.0: # %entry421; X86-NEXT: pushl %esi422; X86-NEXT: .cfi_def_cfa_offset 8423; X86-NEXT: .cfi_offset %esi, -8424; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx425; X86-NEXT: movl {{[0-9]+}}(%esp), %esi426; X86-NEXT: movl %esi, %eax427; X86-NEXT: shll $5, %eax428; X86-NEXT: subl %eax, %esi429; X86-NEXT: movl $-31, %edx430; X86-NEXT: movl %ecx, %eax431; X86-NEXT: mull %edx432; X86-NEXT: subl %ecx, %edx433; X86-NEXT: addl %esi, %edx434; X86-NEXT: popl %esi435; X86-NEXT: .cfi_def_cfa_offset 4436; X86-NEXT: retl437entry:438 %tmp3 = mul i64 %a, -31439 ret i64 %tmp3440}441 442 443define i64 @test6(i64 %a) {444; X64-LABEL: test6:445; X64: # %bb.0: # %entry446; X64-NEXT: movq %rdi, %rax447; X64-NEXT: shlq $5, %rax448; X64-NEXT: addq %rdi, %rax449; X64-NEXT: retq450;451; X86-LABEL: test6:452; X86: # %bb.0: # %entry453; X86-NEXT: movl {{[0-9]+}}(%esp), %eax454; X86-NEXT: movl %eax, %ecx455; X86-NEXT: shll $5, %ecx456; X86-NEXT: addl %eax, %ecx457; X86-NEXT: movl $33, %eax458; X86-NEXT: mull {{[0-9]+}}(%esp)459; X86-NEXT: addl %ecx, %edx460; X86-NEXT: retl461entry:462 %tmp3 = mul i64 %a, 33463 ret i64 %tmp3464}465 466define i64 @test7(i64 %a) {467; X64-LABEL: test7:468; X64: # %bb.0: # %entry469; X64-NEXT: movq %rdi, %rax470; X64-NEXT: shlq $5, %rax471; X64-NEXT: addq %rdi, %rax472; X64-NEXT: negq %rax473; X64-NEXT: retq474;475; X86-LABEL: test7:476; X86: # %bb.0: # %entry477; X86-NEXT: pushl %esi478; X86-NEXT: .cfi_def_cfa_offset 8479; X86-NEXT: .cfi_offset %esi, -8480; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx481; X86-NEXT: movl {{[0-9]+}}(%esp), %eax482; X86-NEXT: movl %eax, %esi483; X86-NEXT: shll $5, %esi484; X86-NEXT: addl %eax, %esi485; X86-NEXT: movl $-33, %edx486; X86-NEXT: movl %ecx, %eax487; X86-NEXT: mull %edx488; X86-NEXT: subl %ecx, %edx489; X86-NEXT: subl %esi, %edx490; X86-NEXT: popl %esi491; X86-NEXT: .cfi_def_cfa_offset 4492; X86-NEXT: retl493entry:494 %tmp3 = mul i64 %a, -33495 ret i64 %tmp3496}497 498define i64 @testOverflow(i64 %a) {499; X64-LABEL: testOverflow:500; X64: # %bb.0: # %entry501; X64-NEXT: movq %rdi, %rax502; X64-NEXT: shlq $63, %rax503; X64-NEXT: subq %rdi, %rax504; X64-NEXT: retq505;506; X86-LABEL: testOverflow:507; X86: # %bb.0: # %entry508; X86-NEXT: pushl %esi509; X86-NEXT: .cfi_def_cfa_offset 8510; X86-NEXT: .cfi_offset %esi, -8511; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx512; X86-NEXT: movl $-1, %edx513; X86-NEXT: movl %ecx, %eax514; X86-NEXT: mull %edx515; X86-NEXT: movl %ecx, %esi516; X86-NEXT: shll $31, %esi517; X86-NEXT: subl %ecx, %esi518; X86-NEXT: addl %esi, %edx519; X86-NEXT: subl {{[0-9]+}}(%esp), %edx520; X86-NEXT: popl %esi521; X86-NEXT: .cfi_def_cfa_offset 4522; X86-NEXT: retl523entry:524 %tmp3 = mul i64 %a, 9223372036854775807525 ret i64 %tmp3526}527 528define i64 @testNegOverflow(i64 %a) {529; X64-LABEL: testNegOverflow:530; X64: # %bb.0: # %entry531; X64-NEXT: movq %rdi, %rax532; X64-NEXT: shlq $63, %rax533; X64-NEXT: addq %rdi, %rax534; X64-NEXT: retq535;536; X86-LABEL: testNegOverflow:537; X86: # %bb.0: # %entry538; X86-NEXT: movl {{[0-9]+}}(%esp), %eax539; X86-NEXT: movl %eax, %edx540; X86-NEXT: shll $31, %edx541; X86-NEXT: addl {{[0-9]+}}(%esp), %edx542; X86-NEXT: retl543entry:544 %tmp3 = mul i64 %a, -9223372036854775807545 ret i64 %tmp3546}547