457 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+push2pop2 | FileCheck %s --check-prefix=CHECK3; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+push2pop2,+ppx | FileCheck %s --check-prefix=PPX4; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+push2pop2 -frame-pointer=all | FileCheck %s --check-prefix=FRAME5 6define void @csr1() nounwind {7; CHECK-LABEL: csr1:8; CHECK: # %bb.0: # %entry9; CHECK-NEXT: pushq %rbp10; CHECK-NEXT: #APP11; CHECK-NEXT: #NO_APP12; CHECK-NEXT: popq %rbp13; CHECK-NEXT: retq14;15; PPX-LABEL: csr1:16; PPX: # %bb.0: # %entry17; PPX-NEXT: pushp %rbp18; PPX-NEXT: #APP19; PPX-NEXT: #NO_APP20; PPX-NEXT: popp %rbp21; PPX-NEXT: retq22;23; FRAME-LABEL: csr1:24; FRAME: # %bb.0: # %entry25; FRAME-NEXT: pushq %rbp26; FRAME-NEXT: movq %rsp, %rbp27; FRAME-NEXT: pushq %rbp28; FRAME-NEXT: pushq %rax29; FRAME-NEXT: #APP30; FRAME-NEXT: #NO_APP31; FRAME-NEXT: popq %rax32; FRAME-NEXT: popq %rbp33; FRAME-NEXT: popq %rbp34; FRAME-NEXT: retq35entry:36 tail call void asm sideeffect "", "~{rbp},~{dirflag},~{fpsr},~{flags}"()37 ret void38}39 40define void @csr2() nounwind {41; CHECK-LABEL: csr2:42; CHECK: # %bb.0: # %entry43; CHECK-NEXT: pushq %rbp44; CHECK-NEXT: pushq %r1545; CHECK-NEXT: #APP46; CHECK-NEXT: #NO_APP47; CHECK-NEXT: popq %r1548; CHECK-NEXT: popq %rbp49; CHECK-NEXT: retq50;51; PPX-LABEL: csr2:52; PPX: # %bb.0: # %entry53; PPX-NEXT: pushp %rbp54; PPX-NEXT: pushp %r1555; PPX-NEXT: #APP56; PPX-NEXT: #NO_APP57; PPX-NEXT: popp %r1558; PPX-NEXT: popp %rbp59; PPX-NEXT: retq60;61; FRAME-LABEL: csr2:62; FRAME: # %bb.0: # %entry63; FRAME-NEXT: pushq %rbp64; FRAME-NEXT: movq %rsp, %rbp65; FRAME-NEXT: pushq %r1566; FRAME-NEXT: pushq %rbp67; FRAME-NEXT: pushq %rax68; FRAME-NEXT: #APP69; FRAME-NEXT: #NO_APP70; FRAME-NEXT: popq %rax71; FRAME-NEXT: popq %rbp72; FRAME-NEXT: popq %r1573; FRAME-NEXT: popq %rbp74; FRAME-NEXT: retq75entry:76 tail call void asm sideeffect "", "~{rbp},~{r15},~{dirflag},~{fpsr},~{flags}"()77 ret void78}79 80define void @csr3() nounwind {81; CHECK-LABEL: csr3:82; CHECK: # %bb.0: # %entry83; CHECK-NEXT: pushq %rbp84; CHECK-NEXT: push2 %r14, %r1585; CHECK-NEXT: #APP86; CHECK-NEXT: #NO_APP87; CHECK-NEXT: pop2 %r15, %r1488; CHECK-NEXT: popq %rbp89; CHECK-NEXT: retq90;91; PPX-LABEL: csr3:92; PPX: # %bb.0: # %entry93; PPX-NEXT: pushp %rbp94; PPX-NEXT: push2p %r14, %r1595; PPX-NEXT: #APP96; PPX-NEXT: #NO_APP97; PPX-NEXT: pop2p %r15, %r1498; PPX-NEXT: popp %rbp99; PPX-NEXT: retq100;101; FRAME-LABEL: csr3:102; FRAME: # %bb.0: # %entry103; FRAME-NEXT: pushq %rbp104; FRAME-NEXT: movq %rsp, %rbp105; FRAME-NEXT: push2 %r14, %r15106; FRAME-NEXT: pushq %rbp107; FRAME-NEXT: pushq %rax108; FRAME-NEXT: #APP109; FRAME-NEXT: #NO_APP110; FRAME-NEXT: popq %rax111; FRAME-NEXT: popq %rbp112; FRAME-NEXT: pop2 %r15, %r14113; FRAME-NEXT: popq %rbp114; FRAME-NEXT: retq115entry:116 tail call void asm sideeffect "", "~{rbp},~{r15},~{r14},~{dirflag},~{fpsr},~{flags}"()117 ret void118}119 120define void @csr4() nounwind {121; CHECK-LABEL: csr4:122; CHECK: # %bb.0: # %entry123; CHECK-NEXT: pushq %rax124; CHECK-NEXT: push2 %r15, %rbp125; CHECK-NEXT: push2 %r13, %r14126; CHECK-NEXT: #APP127; CHECK-NEXT: #NO_APP128; CHECK-NEXT: pop2 %r14, %r13129; CHECK-NEXT: pop2 %rbp, %r15130; CHECK-NEXT: popq %rax131; CHECK-NEXT: retq132;133; PPX-LABEL: csr4:134; PPX: # %bb.0: # %entry135; PPX-NEXT: pushq %rax136; PPX-NEXT: push2p %r15, %rbp137; PPX-NEXT: push2p %r13, %r14138; PPX-NEXT: #APP139; PPX-NEXT: #NO_APP140; PPX-NEXT: pop2p %r14, %r13141; PPX-NEXT: pop2p %rbp, %r15142; PPX-NEXT: popq %rax143; PPX-NEXT: retq144;145; FRAME-LABEL: csr4:146; FRAME: # %bb.0: # %entry147; FRAME-NEXT: pushq %rbp148; FRAME-NEXT: movq %rsp, %rbp149; FRAME-NEXT: push2 %r14, %r15150; FRAME-NEXT: pushq %r13151; FRAME-NEXT: pushq %rbp152; FRAME-NEXT: pushq %rax153; FRAME-NEXT: #APP154; FRAME-NEXT: #NO_APP155; FRAME-NEXT: popq %rax156; FRAME-NEXT: popq %rbp157; FRAME-NEXT: popq %r13158; FRAME-NEXT: pop2 %r15, %r14159; FRAME-NEXT: popq %rbp160; FRAME-NEXT: retq161entry:162 tail call void asm sideeffect "", "~{rbp},~{r15},~{r14},~{r13},~{dirflag},~{fpsr},~{flags}"()163 ret void164}165 166define void @csr5() nounwind {167; CHECK-LABEL: csr5:168; CHECK: # %bb.0: # %entry169; CHECK-NEXT: pushq %rbp170; CHECK-NEXT: push2 %r14, %r15171; CHECK-NEXT: push2 %r12, %r13172; CHECK-NEXT: #APP173; CHECK-NEXT: #NO_APP174; CHECK-NEXT: pop2 %r13, %r12175; CHECK-NEXT: pop2 %r15, %r14176; CHECK-NEXT: popq %rbp177; CHECK-NEXT: retq178;179; PPX-LABEL: csr5:180; PPX: # %bb.0: # %entry181; PPX-NEXT: pushp %rbp182; PPX-NEXT: push2p %r14, %r15183; PPX-NEXT: push2p %r12, %r13184; PPX-NEXT: #APP185; PPX-NEXT: #NO_APP186; PPX-NEXT: pop2p %r13, %r12187; PPX-NEXT: pop2p %r15, %r14188; PPX-NEXT: popp %rbp189; PPX-NEXT: retq190;191; FRAME-LABEL: csr5:192; FRAME: # %bb.0: # %entry193; FRAME-NEXT: pushq %rbp194; FRAME-NEXT: movq %rsp, %rbp195; FRAME-NEXT: push2 %r14, %r15196; FRAME-NEXT: push2 %r12, %r13197; FRAME-NEXT: pushq %rbp198; FRAME-NEXT: pushq %rax199; FRAME-NEXT: #APP200; FRAME-NEXT: #NO_APP201; FRAME-NEXT: popq %rax202; FRAME-NEXT: popq %rbp203; FRAME-NEXT: pop2 %r13, %r12204; FRAME-NEXT: pop2 %r15, %r14205; FRAME-NEXT: popq %rbp206; FRAME-NEXT: retq207entry:208 tail call void asm sideeffect "", "~{rbp},~{r15},~{r14},~{r13},~{r12},~{dirflag},~{fpsr},~{flags}"()209 ret void210}211 212define void @csr6() nounwind {213; CHECK-LABEL: csr6:214; CHECK: # %bb.0: # %entry215; CHECK-NEXT: pushq %rax216; CHECK-NEXT: push2 %r15, %rbp217; CHECK-NEXT: push2 %r13, %r14218; CHECK-NEXT: push2 %rbx, %r12219; CHECK-NEXT: #APP220; CHECK-NEXT: #NO_APP221; CHECK-NEXT: pop2 %r12, %rbx222; CHECK-NEXT: pop2 %r14, %r13223; CHECK-NEXT: pop2 %rbp, %r15224; CHECK-NEXT: popq %rax225; CHECK-NEXT: retq226;227; PPX-LABEL: csr6:228; PPX: # %bb.0: # %entry229; PPX-NEXT: pushq %rax230; PPX-NEXT: push2p %r15, %rbp231; PPX-NEXT: push2p %r13, %r14232; PPX-NEXT: push2p %rbx, %r12233; PPX-NEXT: #APP234; PPX-NEXT: #NO_APP235; PPX-NEXT: pop2p %r12, %rbx236; PPX-NEXT: pop2p %r14, %r13237; PPX-NEXT: pop2p %rbp, %r15238; PPX-NEXT: popq %rax239; PPX-NEXT: retq240;241; FRAME-LABEL: csr6:242; FRAME: # %bb.0: # %entry243; FRAME-NEXT: pushq %rbp244; FRAME-NEXT: movq %rsp, %rbp245; FRAME-NEXT: push2 %r14, %r15246; FRAME-NEXT: push2 %r12, %r13247; FRAME-NEXT: pushq %rbx248; FRAME-NEXT: pushq %rbp249; FRAME-NEXT: pushq %rax250; FRAME-NEXT: #APP251; FRAME-NEXT: #NO_APP252; FRAME-NEXT: popq %rax253; FRAME-NEXT: popq %rbp254; FRAME-NEXT: popq %rbx255; FRAME-NEXT: pop2 %r13, %r12256; FRAME-NEXT: pop2 %r15, %r14257; FRAME-NEXT: popq %rbp258; FRAME-NEXT: retq259entry:260 tail call void asm sideeffect "", "~{rbp},~{r15},~{r14},~{r13},~{r12},~{rbx},~{dirflag},~{fpsr},~{flags}"()261 ret void262}263 264declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg)265 266define void @lea_in_epilog(i1 %arg, ptr %arg1, ptr %arg2, i64 %arg3, i64 %arg4, i64 %arg5, i64 %arg6, i64 %arg7, i64 %arg8, i64 %arg9, i64 %arg10) nounwind {267; CHECK-LABEL: lea_in_epilog:268; CHECK: # %bb.0: # %bb269; CHECK-NEXT: testb $1, %dil270; CHECK-NEXT: je .LBB6_5271; CHECK-NEXT: # %bb.1: # %bb13272; CHECK-NEXT: pushq %rax273; CHECK-NEXT: push2 %r15, %rbp274; CHECK-NEXT: push2 %r13, %r14275; CHECK-NEXT: push2 %rbx, %r12276; CHECK-NEXT: subq $16, %rsp277; CHECK-NEXT: movq %r9, %r14278; CHECK-NEXT: movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill279; CHECK-NEXT: addq {{[0-9]+}}(%rsp), %r14280; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %r13281; CHECK-NEXT: addq %r14, %r13282; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %r15283; CHECK-NEXT: addq %r14, %r15284; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rbx285; CHECK-NEXT: addq %r14, %rbx286; CHECK-NEXT: xorl %ebp, %ebp287; CHECK-NEXT: xorl %r12d, %r12d288; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill289; CHECK-NEXT: .p2align 4290; CHECK-NEXT: .LBB6_2: # %bb15291; CHECK-NEXT: # =>This Inner Loop Header: Depth=1292; CHECK-NEXT: incq %r12293; CHECK-NEXT: movl $432, %edx # imm = 0x1B0294; CHECK-NEXT: xorl %edi, %edi295; CHECK-NEXT: movq %r15, %rsi296; CHECK-NEXT: callq memcpy@PLT297; CHECK-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload298; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax299; CHECK-NEXT: addq %rax, %r13300; CHECK-NEXT: addq %rax, %r15301; CHECK-NEXT: addq %rax, %rbx302; CHECK-NEXT: addq %rax, %r14303; CHECK-NEXT: addq $8, %rbp304; CHECK-NEXT: testb $1, %dil305; CHECK-NEXT: je .LBB6_2306; CHECK-NEXT: # %bb.3: # %bb11307; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload308; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rsp309; CHECK-NEXT: pop2 %r12, %rbx310; CHECK-NEXT: pop2 %r14, %r13311; CHECK-NEXT: pop2 %rbp, %r15312; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rsp313; CHECK-NEXT: jne .LBB6_5314; CHECK-NEXT: # %bb.4: # %bb12315; CHECK-NEXT: movq $0, (%rax)316; CHECK-NEXT: .LBB6_5: # %bb14317; CHECK-NEXT: retq318;319; PPX-LABEL: lea_in_epilog:320; PPX: # %bb.0: # %bb321; PPX-NEXT: testb $1, %dil322; PPX-NEXT: je .LBB6_5323; PPX-NEXT: # %bb.1: # %bb13324; PPX-NEXT: pushq %rax325; PPX-NEXT: push2p %r15, %rbp326; PPX-NEXT: push2p %r13, %r14327; PPX-NEXT: push2p %rbx, %r12328; PPX-NEXT: subq $16, %rsp329; PPX-NEXT: movq %r9, %r14330; PPX-NEXT: movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill331; PPX-NEXT: addq {{[0-9]+}}(%rsp), %r14332; PPX-NEXT: movq {{[0-9]+}}(%rsp), %r13333; PPX-NEXT: addq %r14, %r13334; PPX-NEXT: movq {{[0-9]+}}(%rsp), %r15335; PPX-NEXT: addq %r14, %r15336; PPX-NEXT: movq {{[0-9]+}}(%rsp), %rbx337; PPX-NEXT: addq %r14, %rbx338; PPX-NEXT: xorl %ebp, %ebp339; PPX-NEXT: xorl %r12d, %r12d340; PPX-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill341; PPX-NEXT: .p2align 4342; PPX-NEXT: .LBB6_2: # %bb15343; PPX-NEXT: # =>This Inner Loop Header: Depth=1344; PPX-NEXT: incq %r12345; PPX-NEXT: movl $432, %edx # imm = 0x1B0346; PPX-NEXT: xorl %edi, %edi347; PPX-NEXT: movq %r15, %rsi348; PPX-NEXT: callq memcpy@PLT349; PPX-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload350; PPX-NEXT: movq {{[0-9]+}}(%rsp), %rax351; PPX-NEXT: addq %rax, %r13352; PPX-NEXT: addq %rax, %r15353; PPX-NEXT: addq %rax, %rbx354; PPX-NEXT: addq %rax, %r14355; PPX-NEXT: addq $8, %rbp356; PPX-NEXT: testb $1, %dil357; PPX-NEXT: je .LBB6_2358; PPX-NEXT: # %bb.3: # %bb11359; PPX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload360; PPX-NEXT: leaq {{[0-9]+}}(%rsp), %rsp361; PPX-NEXT: pop2p %r12, %rbx362; PPX-NEXT: pop2p %r14, %r13363; PPX-NEXT: pop2p %rbp, %r15364; PPX-NEXT: leaq {{[0-9]+}}(%rsp), %rsp365; PPX-NEXT: jne .LBB6_5366; PPX-NEXT: # %bb.4: # %bb12367; PPX-NEXT: movq $0, (%rax)368; PPX-NEXT: .LBB6_5: # %bb14369; PPX-NEXT: retq370;371; FRAME-LABEL: lea_in_epilog:372; FRAME: # %bb.0: # %bb373; FRAME-NEXT: testb $1, %dil374; FRAME-NEXT: je .LBB6_5375; FRAME-NEXT: # %bb.1: # %bb13376; FRAME-NEXT: pushq %rbp377; FRAME-NEXT: movq %rsp, %rbp378; FRAME-NEXT: push2 %r14, %r15379; FRAME-NEXT: push2 %r12, %r13380; FRAME-NEXT: pushq %rbx381; FRAME-NEXT: subq $24, %rsp382; FRAME-NEXT: movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill383; FRAME-NEXT: addq 16(%rbp), %r9384; FRAME-NEXT: movq 48(%rbp), %rbx385; FRAME-NEXT: addq %r9, %rbx386; FRAME-NEXT: movq 40(%rbp), %r12387; FRAME-NEXT: addq %r9, %r12388; FRAME-NEXT: movq 32(%rbp), %r15389; FRAME-NEXT: addq %r9, %r15390; FRAME-NEXT: xorl %r13d, %r13d391; FRAME-NEXT: xorl %r14d, %r14d392; FRAME-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill393; FRAME-NEXT: .p2align 4394; FRAME-NEXT: .LBB6_2: # %bb15395; FRAME-NEXT: # =>This Inner Loop Header: Depth=1396; FRAME-NEXT: movq %r9, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill397; FRAME-NEXT: incq %r14398; FRAME-NEXT: movl $432, %edx # imm = 0x1B0399; FRAME-NEXT: xorl %edi, %edi400; FRAME-NEXT: movq %r12, %rsi401; FRAME-NEXT: callq memcpy@PLT402; FRAME-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %edi # 4-byte Reload403; FRAME-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %r9 # 8-byte Reload404; FRAME-NEXT: movq 16(%rbp), %rax405; FRAME-NEXT: addq %rax, %rbx406; FRAME-NEXT: addq %rax, %r12407; FRAME-NEXT: addq %rax, %r15408; FRAME-NEXT: addq %rax, %r9409; FRAME-NEXT: addq $8, %r13410; FRAME-NEXT: testb $1, %dil411; FRAME-NEXT: je .LBB6_2412; FRAME-NEXT: # %bb.3: # %bb11413; FRAME-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload414; FRAME-NEXT: leaq {{[0-9]+}}(%rsp), %rsp415; FRAME-NEXT: popq %rbx416; FRAME-NEXT: pop2 %r13, %r12417; FRAME-NEXT: pop2 %r15, %r14418; FRAME-NEXT: popq %rbp419; FRAME-NEXT: jne .LBB6_5420; FRAME-NEXT: # %bb.4: # %bb12421; FRAME-NEXT: movq $0, (%rax)422; FRAME-NEXT: .LBB6_5: # %bb14423; FRAME-NEXT: retq424bb:425 br i1 %arg, label %bb13, label %bb14426 427bb11:428 br i1 %arg, label %bb14, label %bb12429 430bb12:431 store double 0.000000e+00, ptr %arg1, align 8432 br label %bb14433 434bb13:435 %getelementptr = getelementptr i8, ptr null, i64 %arg5436 br label %bb15437 438bb14:439 ret void440 441bb15:442 %phi = phi i64 [ 0, %bb13 ], [ %add, %bb15 ]443 %getelementptr16 = getelementptr double, ptr null, i64 %phi444 %add = add i64 %phi, 1445 %mul = mul i64 %arg6, %add446 %getelementptr17 = getelementptr i8, ptr %getelementptr, i64 %mul447 call void @llvm.memcpy.p0.p0.i64(ptr %getelementptr16, ptr %getelementptr17, i64 0, i1 false)448 %getelementptr18 = getelementptr i8, ptr %getelementptr17, i64 %arg7449 %getelementptr19 = getelementptr i8, ptr %getelementptr17, i64 %arg8450 call void @llvm.memcpy.p0.p0.i64(ptr null, ptr %getelementptr19, i64 0, i1 false)451 %getelementptr20 = getelementptr i8, ptr %getelementptr17, i64 %arg9452 call void @llvm.memcpy.p0.p0.i64(ptr null, ptr %getelementptr20, i64 432, i1 false)453 %getelementptr21 = getelementptr i8, ptr %getelementptr17, i64 %arg10454 call void @llvm.memcpy.p0.p0.i64(ptr null, ptr %getelementptr21, i64 0, i1 false)455 br i1 %arg, label %bb11, label %bb15456}457