238 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -stackrealign -mtriple i386-apple-darwin -mcpu=i486 | FileCheck %s3 4%struct.foo = type { [88 x i8] }5 6declare void @bar(ptr nocapture, ptr align 4 byval(%struct.foo)) nounwind7declare void @baz(ptr) nounwind8 9; PR1524910; We can't use rep;movsl here because it clobbers the base pointer in %esi.11define void @test1(ptr nocapture %x, i32 %y) nounwind {12; CHECK-LABEL: test1:13; CHECK: ## %bb.0:14; CHECK-NEXT: pushl %ebp15; CHECK-NEXT: movl %esp, %ebp16; CHECK-NEXT: pushl %ebx17; CHECK-NEXT: pushl %edi18; CHECK-NEXT: pushl %esi19; CHECK-NEXT: andl $-16, %esp20; CHECK-NEXT: subl $80, %esp21; CHECK-NEXT: movl %esp, %esi22; CHECK-NEXT: movl 8(%ebp), %ecx23; CHECK-NEXT: movl 12(%ebp), %edx24; CHECK-NEXT: movl %esp, %eax25; CHECK-NEXT: addl $15, %edx26; CHECK-NEXT: andl $-16, %edx27; CHECK-NEXT: subl %edx, %eax28; CHECK-NEXT: movl %eax, %esp29; CHECK-NEXT: subl $4, %esp30; CHECK-NEXT: movl 84(%ecx), %edi31; CHECK-NEXT: movl 80(%ecx), %ebx32; CHECK-NEXT: movl 76(%ecx), %edx33; CHECK-NEXT: movl %edx, 68(%esi) ## 4-byte Spill34; CHECK-NEXT: movl 72(%ecx), %edx35; CHECK-NEXT: movl %edx, 64(%esi) ## 4-byte Spill36; CHECK-NEXT: movl 68(%ecx), %edx37; CHECK-NEXT: movl %edx, 60(%esi) ## 4-byte Spill38; CHECK-NEXT: movl 64(%ecx), %edx39; CHECK-NEXT: movl %edx, 56(%esi) ## 4-byte Spill40; CHECK-NEXT: movl 60(%ecx), %edx41; CHECK-NEXT: movl %edx, 52(%esi) ## 4-byte Spill42; CHECK-NEXT: movl 56(%ecx), %edx43; CHECK-NEXT: movl %edx, 48(%esi) ## 4-byte Spill44; CHECK-NEXT: movl 52(%ecx), %edx45; CHECK-NEXT: movl %edx, 44(%esi) ## 4-byte Spill46; CHECK-NEXT: movl 48(%ecx), %edx47; CHECK-NEXT: movl %edx, 40(%esi) ## 4-byte Spill48; CHECK-NEXT: movl 44(%ecx), %edx49; CHECK-NEXT: movl %edx, 36(%esi) ## 4-byte Spill50; CHECK-NEXT: movl 40(%ecx), %edx51; CHECK-NEXT: movl %edx, 32(%esi) ## 4-byte Spill52; CHECK-NEXT: movl 36(%ecx), %edx53; CHECK-NEXT: movl %edx, 28(%esi) ## 4-byte Spill54; CHECK-NEXT: movl 32(%ecx), %edx55; CHECK-NEXT: movl %edx, 24(%esi) ## 4-byte Spill56; CHECK-NEXT: movl 28(%ecx), %edx57; CHECK-NEXT: movl %edx, 20(%esi) ## 4-byte Spill58; CHECK-NEXT: movl 24(%ecx), %edx59; CHECK-NEXT: movl %edx, 16(%esi) ## 4-byte Spill60; CHECK-NEXT: movl 20(%ecx), %edx61; CHECK-NEXT: movl %edx, 12(%esi) ## 4-byte Spill62; CHECK-NEXT: movl 16(%ecx), %edx63; CHECK-NEXT: movl %edx, 8(%esi) ## 4-byte Spill64; CHECK-NEXT: movl 12(%ecx), %edx65; CHECK-NEXT: movl %edx, 4(%esi) ## 4-byte Spill66; CHECK-NEXT: movl 8(%ecx), %edx67; CHECK-NEXT: movl %edx, (%esi) ## 4-byte Spill68; CHECK-NEXT: movl (%ecx), %edx69; CHECK-NEXT: movl %edx, 72(%esi) ## 4-byte Spill70; CHECK-NEXT: movl 4(%ecx), %ecx71; CHECK-NEXT: pushl %edi72; CHECK-NEXT: pushl %ebx73; CHECK-NEXT: pushl 68(%esi) ## 4-byte Folded Reload74; CHECK-NEXT: pushl 64(%esi) ## 4-byte Folded Reload75; CHECK-NEXT: pushl 60(%esi) ## 4-byte Folded Reload76; CHECK-NEXT: pushl 56(%esi) ## 4-byte Folded Reload77; CHECK-NEXT: pushl 52(%esi) ## 4-byte Folded Reload78; CHECK-NEXT: pushl 48(%esi) ## 4-byte Folded Reload79; CHECK-NEXT: pushl 44(%esi) ## 4-byte Folded Reload80; CHECK-NEXT: pushl 40(%esi) ## 4-byte Folded Reload81; CHECK-NEXT: pushl 36(%esi) ## 4-byte Folded Reload82; CHECK-NEXT: pushl 32(%esi) ## 4-byte Folded Reload83; CHECK-NEXT: pushl 28(%esi) ## 4-byte Folded Reload84; CHECK-NEXT: pushl 24(%esi) ## 4-byte Folded Reload85; CHECK-NEXT: pushl 20(%esi) ## 4-byte Folded Reload86; CHECK-NEXT: pushl 16(%esi) ## 4-byte Folded Reload87; CHECK-NEXT: pushl 12(%esi) ## 4-byte Folded Reload88; CHECK-NEXT: pushl 8(%esi) ## 4-byte Folded Reload89; CHECK-NEXT: pushl 4(%esi) ## 4-byte Folded Reload90; CHECK-NEXT: pushl (%esi) ## 4-byte Folded Reload91; CHECK-NEXT: pushl %ecx92; CHECK-NEXT: pushl 72(%esi) ## 4-byte Folded Reload93; CHECK-NEXT: pushl %eax94; CHECK-NEXT: calll _bar95; CHECK-NEXT: leal -12(%ebp), %esp96; CHECK-NEXT: popl %esi97; CHECK-NEXT: popl %edi98; CHECK-NEXT: popl %ebx99; CHECK-NEXT: popl %ebp100; CHECK-NEXT: retl101 %dynalloc = alloca i8, i32 %y, align 1102 call void @bar(ptr %dynalloc, ptr align 4 byval(%struct.foo) %x)103 ret void104}105 106; PR19012107; Also don't clobber %esi if the dynamic alloca comes after the memcpy.108define void @test2(ptr nocapture %x, i32 %y, ptr %z) nounwind {109; CHECK-LABEL: test2:110; CHECK: ## %bb.0:111; CHECK-NEXT: pushl %ebp112; CHECK-NEXT: movl %esp, %ebp113; CHECK-NEXT: pushl %ebx114; CHECK-NEXT: pushl %edi115; CHECK-NEXT: pushl %esi116; CHECK-NEXT: andl $-16, %esp117; CHECK-NEXT: subl $80, %esp118; CHECK-NEXT: movl %esp, %esi119; CHECK-NEXT: movl 12(%ebp), %edi120; CHECK-NEXT: movl 8(%ebp), %eax121; CHECK-NEXT: subl $4, %esp122; CHECK-NEXT: movl 84(%eax), %edx123; CHECK-NEXT: movl 80(%eax), %ebx124; CHECK-NEXT: movl 76(%eax), %ecx125; CHECK-NEXT: movl %ecx, 68(%esi) ## 4-byte Spill126; CHECK-NEXT: movl 72(%eax), %ecx127; CHECK-NEXT: movl %ecx, 64(%esi) ## 4-byte Spill128; CHECK-NEXT: movl 68(%eax), %ecx129; CHECK-NEXT: movl %ecx, 60(%esi) ## 4-byte Spill130; CHECK-NEXT: movl 64(%eax), %ecx131; CHECK-NEXT: movl %ecx, 56(%esi) ## 4-byte Spill132; CHECK-NEXT: movl 60(%eax), %ecx133; CHECK-NEXT: movl %ecx, 52(%esi) ## 4-byte Spill134; CHECK-NEXT: movl 56(%eax), %ecx135; CHECK-NEXT: movl %ecx, 48(%esi) ## 4-byte Spill136; CHECK-NEXT: movl 52(%eax), %ecx137; CHECK-NEXT: movl %ecx, 44(%esi) ## 4-byte Spill138; CHECK-NEXT: movl 48(%eax), %ecx139; CHECK-NEXT: movl %ecx, 40(%esi) ## 4-byte Spill140; CHECK-NEXT: movl 44(%eax), %ecx141; CHECK-NEXT: movl %ecx, 36(%esi) ## 4-byte Spill142; CHECK-NEXT: movl 40(%eax), %ecx143; CHECK-NEXT: movl %ecx, 32(%esi) ## 4-byte Spill144; CHECK-NEXT: movl 36(%eax), %ecx145; CHECK-NEXT: movl %ecx, 28(%esi) ## 4-byte Spill146; CHECK-NEXT: movl 32(%eax), %ecx147; CHECK-NEXT: movl %ecx, 24(%esi) ## 4-byte Spill148; CHECK-NEXT: movl 28(%eax), %ecx149; CHECK-NEXT: movl %ecx, 20(%esi) ## 4-byte Spill150; CHECK-NEXT: movl 24(%eax), %ecx151; CHECK-NEXT: movl %ecx, 16(%esi) ## 4-byte Spill152; CHECK-NEXT: movl 20(%eax), %ecx153; CHECK-NEXT: movl %ecx, 12(%esi) ## 4-byte Spill154; CHECK-NEXT: movl 16(%eax), %ecx155; CHECK-NEXT: movl %ecx, 8(%esi) ## 4-byte Spill156; CHECK-NEXT: movl 12(%eax), %ecx157; CHECK-NEXT: movl %ecx, 4(%esi) ## 4-byte Spill158; CHECK-NEXT: movl 8(%eax), %ecx159; CHECK-NEXT: movl %ecx, (%esi) ## 4-byte Spill160; CHECK-NEXT: movl (%eax), %ecx161; CHECK-NEXT: movl %ecx, 72(%esi) ## 4-byte Spill162; CHECK-NEXT: movl 4(%eax), %eax163; CHECK-NEXT: pushl %edx164; CHECK-NEXT: pushl %ebx165; CHECK-NEXT: pushl 68(%esi) ## 4-byte Folded Reload166; CHECK-NEXT: pushl 64(%esi) ## 4-byte Folded Reload167; CHECK-NEXT: pushl 60(%esi) ## 4-byte Folded Reload168; CHECK-NEXT: pushl 56(%esi) ## 4-byte Folded Reload169; CHECK-NEXT: pushl 52(%esi) ## 4-byte Folded Reload170; CHECK-NEXT: pushl 48(%esi) ## 4-byte Folded Reload171; CHECK-NEXT: pushl 44(%esi) ## 4-byte Folded Reload172; CHECK-NEXT: pushl 40(%esi) ## 4-byte Folded Reload173; CHECK-NEXT: pushl 36(%esi) ## 4-byte Folded Reload174; CHECK-NEXT: pushl 32(%esi) ## 4-byte Folded Reload175; CHECK-NEXT: pushl 28(%esi) ## 4-byte Folded Reload176; CHECK-NEXT: pushl 24(%esi) ## 4-byte Folded Reload177; CHECK-NEXT: pushl 20(%esi) ## 4-byte Folded Reload178; CHECK-NEXT: pushl 16(%esi) ## 4-byte Folded Reload179; CHECK-NEXT: pushl 12(%esi) ## 4-byte Folded Reload180; CHECK-NEXT: pushl 8(%esi) ## 4-byte Folded Reload181; CHECK-NEXT: pushl 4(%esi) ## 4-byte Folded Reload182; CHECK-NEXT: pushl (%esi) ## 4-byte Folded Reload183; CHECK-NEXT: pushl %eax184; CHECK-NEXT: pushl 72(%esi) ## 4-byte Folded Reload185; CHECK-NEXT: pushl 16(%ebp)186; CHECK-NEXT: calll _bar187; CHECK-NEXT: addl $96, %esp188; CHECK-NEXT: movl %esp, %eax189; CHECK-NEXT: addl $15, %edi190; CHECK-NEXT: andl $-16, %edi191; CHECK-NEXT: subl %edi, %eax192; CHECK-NEXT: movl %eax, %esp193; CHECK-NEXT: subl $12, %esp194; CHECK-NEXT: pushl %eax195; CHECK-NEXT: calll _baz196; CHECK-NEXT: leal -12(%ebp), %esp197; CHECK-NEXT: popl %esi198; CHECK-NEXT: popl %edi199; CHECK-NEXT: popl %ebx200; CHECK-NEXT: popl %ebp201; CHECK-NEXT: retl202 call void @bar(ptr %z, ptr align 4 byval(%struct.foo) %x)203 %dynalloc = alloca i8, i32 %y, align 1204 call void @baz(ptr %dynalloc)205 ret void206}207 208; Check that we do use rep movs if we make the alloca static.209define void @test3(ptr nocapture %x, i32 %y, ptr %z) nounwind {210; CHECK-LABEL: test3:211; CHECK: ## %bb.0:212; CHECK-NEXT: pushl %ebp213; CHECK-NEXT: movl %esp, %ebp214; CHECK-NEXT: pushl %edi215; CHECK-NEXT: pushl %esi216; CHECK-NEXT: andl $-16, %esp217; CHECK-NEXT: subl $112, %esp218; CHECK-NEXT: movl 16(%ebp), %eax219; CHECK-NEXT: movl 8(%ebp), %esi220; CHECK-NEXT: leal {{[0-9]+}}(%esp), %edi221; CHECK-NEXT: movl $22, %ecx222; CHECK-NEXT: rep;movsl (%esi), %es:(%edi)223; CHECK-NEXT: movl %eax, (%esp)224; CHECK-NEXT: calll _bar225; CHECK-NEXT: leal {{[0-9]+}}(%esp), %eax226; CHECK-NEXT: movl %eax, (%esp)227; CHECK-NEXT: calll _baz228; CHECK-NEXT: leal -8(%ebp), %esp229; CHECK-NEXT: popl %esi230; CHECK-NEXT: popl %edi231; CHECK-NEXT: popl %ebp232; CHECK-NEXT: retl233 call void @bar(ptr %z, ptr align 4 byval(%struct.foo) %x)234 %statalloc = alloca i8, i32 8, align 1235 call void @baz(ptr %statalloc)236 ret void237}238