631 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+amx-int8 -mattr=+avx512f -verify-machineinstrs | FileCheck %s3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+amx-int8 -mattr=+avx512f -verify-machineinstrs -enable-ipra | FileCheck -check-prefix=IPRA %s4; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mattr=+amx-int8 -mattr=+avx512f -verify-machineinstrs | FileCheck -check-prefix=O0 %s5 6@buf = dso_local global [3072 x i8] zeroinitializer, align 647 8define internal void @foo() {9; CHECK-LABEL: foo:10; CHECK: # %bb.0: # %entry11; CHECK-NEXT: retq12;13; IPRA-LABEL: foo:14; IPRA: # %bb.0: # %entry15; IPRA-NEXT: retq16;17; O0-LABEL: foo:18; O0: # %bb.0: # %entry19; O0-NEXT: retq20entry:21 ret void22}23 24define dso_local void @test_api(i16 signext %0, i16 signext %1) nounwind {25; CHECK-LABEL: test_api:26; CHECK: # %bb.0:27; CHECK-NEXT: pushq %rbp28; CHECK-NEXT: pushq %r1529; CHECK-NEXT: pushq %r1430; CHECK-NEXT: pushq %rbx31; CHECK-NEXT: subq $2120, %rsp # imm = 0x84832; CHECK-NEXT: movl %esi, %ebx33; CHECK-NEXT: movl %edi, %ebp34; CHECK-NEXT: vxorps %xmm0, %xmm0, %xmm035; CHECK-NEXT: vmovups %zmm0, (%rsp)36; CHECK-NEXT: movb $1, (%rsp)37; CHECK-NEXT: movw $8, {{[0-9]+}}(%rsp)38; CHECK-NEXT: movb $8, {{[0-9]+}}(%rsp)39; CHECK-NEXT: movw %bx, {{[0-9]+}}(%rsp)40; CHECK-NEXT: movb %bpl, {{[0-9]+}}(%rsp)41; CHECK-NEXT: movw %bx, {{[0-9]+}}(%rsp)42; CHECK-NEXT: movb %bpl, {{[0-9]+}}(%rsp)43; CHECK-NEXT: ldtilecfg (%rsp)44; CHECK-NEXT: movl $buf, %eax45; CHECK-NEXT: movl $32, %r14d46; CHECK-NEXT: movw $8, %r15w47; CHECK-NEXT: tileloadd (%rax,%r14), %tmm148; CHECK-NEXT: movabsq $64, %rax49; CHECK-NEXT: tilestored %tmm1, 1088(%rsp,%rax) # 1024-byte Folded Spill50; CHECK-NEXT: movl $buf+1024, %eax51; CHECK-NEXT: tileloadd (%rax,%r14), %tmm252; CHECK-NEXT: movabsq $64, %rax53; CHECK-NEXT: tilestored %tmm2, 64(%rsp,%rax) # 1024-byte Folded Spill54; CHECK-NEXT: vzeroupper55; CHECK-NEXT: callq foo56; CHECK-NEXT: ldtilecfg (%rsp)57; CHECK-NEXT: movl $buf+2048, %eax58; CHECK-NEXT: tileloadd (%rax,%r14), %tmm059; CHECK-NEXT: movabsq $64, %rcx60; CHECK-NEXT: tileloadd 1088(%rsp,%rcx), %tmm1 # 1024-byte Folded Reload61; CHECK-NEXT: tileloadd 64(%rsp,%rcx), %tmm2 # 1024-byte Folded Reload62; CHECK-NEXT: tdpbssd %tmm2, %tmm1, %tmm063; CHECK-NEXT: tilestored %tmm0, (%rax,%r14)64; CHECK-NEXT: addq $2120, %rsp # imm = 0x84865; CHECK-NEXT: popq %rbx66; CHECK-NEXT: popq %r1467; CHECK-NEXT: popq %r1568; CHECK-NEXT: popq %rbp69; CHECK-NEXT: tilerelease70; CHECK-NEXT: retq71;72; IPRA-LABEL: test_api:73; IPRA: # %bb.0:74; IPRA-NEXT: subq $72, %rsp75; IPRA-NEXT: vxorps %xmm0, %xmm0, %xmm076; IPRA-NEXT: vmovups %zmm0, {{[0-9]+}}(%rsp)77; IPRA-NEXT: movb $1, {{[0-9]+}}(%rsp)78; IPRA-NEXT: movw $8, {{[0-9]+}}(%rsp)79; IPRA-NEXT: movb $8, {{[0-9]+}}(%rsp)80; IPRA-NEXT: movw %si, {{[0-9]+}}(%rsp)81; IPRA-NEXT: movb %dil, {{[0-9]+}}(%rsp)82; IPRA-NEXT: movw %si, {{[0-9]+}}(%rsp)83; IPRA-NEXT: movb %dil, {{[0-9]+}}(%rsp)84; IPRA-NEXT: ldtilecfg {{[0-9]+}}(%rsp)85; IPRA-NEXT: movl $buf, %eax86; IPRA-NEXT: movl $32, %ecx87; IPRA-NEXT: movw $8, %dx88; IPRA-NEXT: tileloadd (%rax,%rcx), %tmm089; IPRA-NEXT: movl $buf+1024, %eax90; IPRA-NEXT: tileloadd (%rax,%rcx), %tmm191; IPRA-NEXT: callq foo92; IPRA-NEXT: movl $buf+2048, %eax93; IPRA-NEXT: tileloadd (%rax,%rcx), %tmm294; IPRA-NEXT: tdpbssd %tmm1, %tmm0, %tmm295; IPRA-NEXT: tilestored %tmm2, (%rax,%rcx)96; IPRA-NEXT: addq $72, %rsp97; IPRA-NEXT: tilerelease98; IPRA-NEXT: vzeroupper99; IPRA-NEXT: retq100;101; O0-LABEL: test_api:102; O0: # %bb.0:103; O0-NEXT: pushq %rbp104; O0-NEXT: movq %rsp, %rbp105; O0-NEXT: andq $-1024, %rsp # imm = 0xFC00106; O0-NEXT: subq $8192, %rsp # imm = 0x2000107; O0-NEXT: vxorps %xmm0, %xmm0, %xmm0108; O0-NEXT: vmovups %zmm0, {{[0-9]+}}(%rsp)109; O0-NEXT: movb $1, {{[0-9]+}}(%rsp)110; O0-NEXT: movw %si, %cx111; O0-NEXT: movw %cx, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill112; O0-NEXT: movw %di, %ax113; O0-NEXT: movw %ax, {{[-0-9]+}}(%r{{[sb]}}p) # 2-byte Spill114; O0-NEXT: movl $buf, %esi115; O0-NEXT: movl $32, %edi116; O0-NEXT: movw $8, %dx117; O0-NEXT: # implicit-def: $al118; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)119; O0-NEXT: movw %dx, {{[0-9]+}}(%rsp)120; O0-NEXT: ldtilecfg {{[0-9]+}}(%rsp)121; O0-NEXT: tileloadd (%rsi,%rdi), %tmm0122; O0-NEXT: movl $64, %edi123; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rsi124; O0-NEXT: movw $8, %dx125; O0-NEXT: tilestored %tmm0, (%rsi,%rdi)126; O0-NEXT: movl $32, %esi127; O0-NEXT: movl $buf+1024, %edx128; O0-NEXT: movw $8, %ax129; O0-NEXT: # implicit-def: $al130; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)131; O0-NEXT: movw %cx, {{[0-9]+}}(%rsp)132; O0-NEXT: ldtilecfg {{[0-9]+}}(%rsp)133; O0-NEXT: tileloadd (%rdx,%rsi), %tmm0134; O0-NEXT: movl $64, %esi135; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdx136; O0-NEXT: movw $8, %ax137; O0-NEXT: tilestored %tmm0, (%rdx,%rsi)138; O0-NEXT: vzeroupper139; O0-NEXT: callq foo140; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %cx # 2-byte Reload141; O0-NEXT: movw {{[-0-9]+}}(%r{{[sb]}}p), %ax # 2-byte Reload142; O0-NEXT: movl $32, %esi143; O0-NEXT: movl $buf+2048, %edx144; O0-NEXT: # implicit-def: $al145; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)146; O0-NEXT: movw %cx, {{[0-9]+}}(%rsp)147; O0-NEXT: ldtilecfg {{[0-9]+}}(%rsp)148; O0-NEXT: tileloadd (%rdx,%rsi), %tmm0149; O0-NEXT: movl $64, %esi150; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdx151; O0-NEXT: tilestored %tmm0, (%rdx,%rsi)152; O0-NEXT: movl $64, %edi153; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdx154; O0-NEXT: movw $8, %si155; O0-NEXT: # implicit-def: $al156; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)157; O0-NEXT: movw %si, {{[0-9]+}}(%rsp)158; O0-NEXT: ldtilecfg {{[0-9]+}}(%rsp)159; O0-NEXT: tileloadd (%rdx,%rdi), %tmm0160; O0-NEXT: movabsq $64, %rdx161; O0-NEXT: tilestored %tmm0, 1024(%rsp,%rdx) # 1024-byte Folded Spill162; O0-NEXT: movl $64, %r8d163; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdi164; O0-NEXT: movw $8, %dx165; O0-NEXT: # implicit-def: $al166; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)167; O0-NEXT: movw %cx, {{[0-9]+}}(%rsp)168; O0-NEXT: # implicit-def: $al169; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)170; O0-NEXT: movw %cx, {{[0-9]+}}(%rsp)171; O0-NEXT: # implicit-def: $al172; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)173; O0-NEXT: movw %si, {{[0-9]+}}(%rsp)174; O0-NEXT: # implicit-def: $al175; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)176; O0-NEXT: movw %cx, {{[0-9]+}}(%rsp)177; O0-NEXT: # implicit-def: $dl178; O0-NEXT: movb %dl, {{[0-9]+}}(%rsp)179; O0-NEXT: movw %cx, {{[0-9]+}}(%rsp)180; O0-NEXT: ldtilecfg {{[0-9]+}}(%rsp)181; O0-NEXT: tileloadd (%rdi,%r8), %tmm2182; O0-NEXT: movl $64, %edi183; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdx184; O0-NEXT: tileloadd (%rdx,%rdi), %tmm0185; O0-NEXT: movw $8, %dx186; O0-NEXT: movabsq $64, %rdi187; O0-NEXT: tileloadd 1024(%rsp,%rdi), %tmm1 # 1024-byte Folded Reload188; O0-NEXT: tdpbssd %tmm2, %tmm1, %tmm0189; O0-NEXT: movl $64, %esi190; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdx191; O0-NEXT: tilestored %tmm0, (%rdx,%rsi)192; O0-NEXT: movl $64, %esi193; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rdx194; O0-NEXT: tileloadd (%rdx,%rsi), %tmm0195; O0-NEXT: movl $32, %esi196; O0-NEXT: movl $buf+2048, %edx197; O0-NEXT: tilestored %tmm0, (%rdx,%rsi)198; O0-NEXT: movq %rbp, %rsp199; O0-NEXT: popq %rbp200; O0-NEXT: tilerelease201; O0-NEXT: retq202 %3 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 %0, i16 8, ptr @buf, i64 32)203 %4 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 8, i16 %1, ptr getelementptr inbounds ([3072 x i8], ptr @buf, i64 0, i64 1024), i64 32)204 call void @foo()205 %5 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 %0, i16 %1, ptr getelementptr inbounds ([3072 x i8], ptr @buf, i64 0, i64 2048), i64 32)206 %6 = tail call x86_amx @llvm.x86.tdpbssd.internal(i16 %0, i16 %1, i16 8, x86_amx %5, x86_amx %3, x86_amx %4)207 tail call void @llvm.x86.tilestored64.internal(i16 %0, i16 %1, ptr getelementptr inbounds ([3072 x i8], ptr @buf, i64 0, i64 2048), i64 32, x86_amx %6)208 ret void209}210 211define dso_local i32 @test_loop(i32 %0) nounwind {212; CHECK-LABEL: test_loop:213; CHECK: # %bb.0:214; CHECK-NEXT: pushq %rbp215; CHECK-NEXT: pushq %r15216; CHECK-NEXT: pushq %r14217; CHECK-NEXT: pushq %r13218; CHECK-NEXT: pushq %r12219; CHECK-NEXT: pushq %rbx220; CHECK-NEXT: subq $1096, %rsp # imm = 0x448221; CHECK-NEXT: movl %edi, %ebx222; CHECK-NEXT: vxorps %xmm0, %xmm0, %xmm0223; CHECK-NEXT: vmovups %zmm0, (%rsp)224; CHECK-NEXT: movb $1, (%rsp)225; CHECK-NEXT: movb $8, {{[0-9]+}}(%rsp)226; CHECK-NEXT: movw $8, {{[0-9]+}}(%rsp)227; CHECK-NEXT: vzeroupper228; CHECK-NEXT: callq foo229; CHECK-NEXT: ldtilecfg (%rsp)230; CHECK-NEXT: testl %ebx, %ebx231; CHECK-NEXT: jg .LBB2_4232; CHECK-NEXT: # %bb.1: # %.preheader233; CHECK-NEXT: movl $7, %ebp234; CHECK-NEXT: movl $buf, %r14d235; CHECK-NEXT: movl $32, %r15d236; CHECK-NEXT: movw $8, %r12w237; CHECK-NEXT: movl $buf+2048, %r13d238; CHECK-NEXT: .p2align 4239; CHECK-NEXT: .LBB2_2: # =>This Inner Loop Header: Depth=1240; CHECK-NEXT: tileloadd (%r14,%r15), %tmm0241; CHECK-NEXT: movabsq $64, %rax242; CHECK-NEXT: tilestored %tmm0, 64(%rsp,%rax) # 1024-byte Folded Spill243; CHECK-NEXT: callq foo244; CHECK-NEXT: ldtilecfg (%rsp)245; CHECK-NEXT: movabsq $64, %rax246; CHECK-NEXT: tileloadd 64(%rsp,%rax), %tmm0 # 1024-byte Folded Reload247; CHECK-NEXT: tilestored %tmm0, (%r13,%r15)248; CHECK-NEXT: callq foo249; CHECK-NEXT: ldtilecfg (%rsp)250; CHECK-NEXT: decl %ebp251; CHECK-NEXT: cmpl $7, %ebp252; CHECK-NEXT: jne .LBB2_2253; CHECK-NEXT: # %bb.3:254; CHECK-NEXT: cmpl $3, %ebx255; CHECK-NEXT: jne .LBB2_4256; CHECK-NEXT: # %bb.6:257; CHECK-NEXT: testl %ebp, %ebp258; CHECK-NEXT: jne .LBB2_5259; CHECK-NEXT: # %bb.7:260; CHECK-NEXT: incl %ebx261; CHECK-NEXT: jmp .LBB2_8262; CHECK-NEXT: .LBB2_4:263; CHECK-NEXT: callq foo264; CHECK-NEXT: ldtilecfg (%rsp)265; CHECK-NEXT: movl $32, %eax266; CHECK-NEXT: movl $buf+1024, %ecx267; CHECK-NEXT: movw $8, %dx268; CHECK-NEXT: tileloadd (%rcx,%rax), %tmm0269; CHECK-NEXT: tilestored %tmm0, (%rcx,%rax)270; CHECK-NEXT: .LBB2_5:271; CHECK-NEXT: decl %ebx272; CHECK-NEXT: .LBB2_8:273; CHECK-NEXT: movl %ebx, %eax274; CHECK-NEXT: addq $1096, %rsp # imm = 0x448275; CHECK-NEXT: popq %rbx276; CHECK-NEXT: popq %r12277; CHECK-NEXT: popq %r13278; CHECK-NEXT: popq %r14279; CHECK-NEXT: popq %r15280; CHECK-NEXT: popq %rbp281; CHECK-NEXT: tilerelease282; CHECK-NEXT: retq283;284; IPRA-LABEL: test_loop:285; IPRA: # %bb.0:286; IPRA-NEXT: subq $72, %rsp287; IPRA-NEXT: movl %edi, %eax288; IPRA-NEXT: vxorps %xmm0, %xmm0, %xmm0289; IPRA-NEXT: vmovups %zmm0, {{[0-9]+}}(%rsp)290; IPRA-NEXT: movb $1, {{[0-9]+}}(%rsp)291; IPRA-NEXT: movb $8, {{[0-9]+}}(%rsp)292; IPRA-NEXT: movw $8, {{[0-9]+}}(%rsp)293; IPRA-NEXT: ldtilecfg {{[0-9]+}}(%rsp)294; IPRA-NEXT: callq foo295; IPRA-NEXT: testl %edi, %edi296; IPRA-NEXT: jg .LBB2_4297; IPRA-NEXT: # %bb.1: # %.preheader298; IPRA-NEXT: movl $7, %ecx299; IPRA-NEXT: movl $buf, %edx300; IPRA-NEXT: movl $32, %esi301; IPRA-NEXT: movw $8, %di302; IPRA-NEXT: movl $buf+2048, %r8d303; IPRA-NEXT: .p2align 4304; IPRA-NEXT: .LBB2_2: # =>This Inner Loop Header: Depth=1305; IPRA-NEXT: tileloadd (%rdx,%rsi), %tmm0306; IPRA-NEXT: callq foo307; IPRA-NEXT: tilestored %tmm0, (%r8,%rsi)308; IPRA-NEXT: callq foo309; IPRA-NEXT: decl %ecx310; IPRA-NEXT: cmpl $7, %ecx311; IPRA-NEXT: jne .LBB2_2312; IPRA-NEXT: # %bb.3:313; IPRA-NEXT: cmpl $3, %eax314; IPRA-NEXT: jne .LBB2_4315; IPRA-NEXT: # %bb.6:316; IPRA-NEXT: testl %ecx, %ecx317; IPRA-NEXT: jne .LBB2_5318; IPRA-NEXT: # %bb.7:319; IPRA-NEXT: incl %eax320; IPRA-NEXT: jmp .LBB2_8321; IPRA-NEXT: .LBB2_4:322; IPRA-NEXT: callq foo323; IPRA-NEXT: movl $32, %ecx324; IPRA-NEXT: movl $buf+1024, %edx325; IPRA-NEXT: movw $8, %si326; IPRA-NEXT: tileloadd (%rdx,%rcx), %tmm0327; IPRA-NEXT: tilestored %tmm0, (%rdx,%rcx)328; IPRA-NEXT: .LBB2_5:329; IPRA-NEXT: decl %eax330; IPRA-NEXT: .LBB2_8:331; IPRA-NEXT: addq $72, %rsp332; IPRA-NEXT: tilerelease333; IPRA-NEXT: vzeroupper334; IPRA-NEXT: retq335;336; O0-LABEL: test_loop:337; O0: # %bb.0:338; O0-NEXT: pushq %rbp339; O0-NEXT: movq %rsp, %rbp340; O0-NEXT: andq $-1024, %rsp # imm = 0xFC00341; O0-NEXT: subq $4096, %rsp # imm = 0x1000342; O0-NEXT: vxorps %xmm0, %xmm0, %xmm0343; O0-NEXT: vmovups %zmm0, {{[0-9]+}}(%rsp)344; O0-NEXT: movb $1, {{[0-9]+}}(%rsp)345; O0-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill346; O0-NEXT: vzeroupper347; O0-NEXT: callq foo348; O0-NEXT: # %bb.1:349; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %ecx # 4-byte Reload350; O0-NEXT: xorl %eax, %eax351; O0-NEXT: cmpl $0, %ecx352; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill353; O0-NEXT: jg .LBB2_4354; O0-NEXT: jmp .LBB2_3355; O0-NEXT: .LBB2_2:356; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload357; O0-NEXT: cmpl $3, %eax358; O0-NEXT: je .LBB2_5359; O0-NEXT: jmp .LBB2_4360; O0-NEXT: .LBB2_3: # =>This Inner Loop Header: Depth=1361; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload362; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill363; O0-NEXT: movl $buf, %ecx364; O0-NEXT: movl $32, %edx365; O0-NEXT: movw $8, %ax366; O0-NEXT: # implicit-def: $al367; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)368; O0-NEXT: movw %ax, {{[0-9]+}}(%rsp)369; O0-NEXT: ldtilecfg {{[0-9]+}}(%rsp)370; O0-NEXT: tileloadd (%rcx,%rdx), %tmm0371; O0-NEXT: movl $64, %edx372; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rcx373; O0-NEXT: movw $8, %ax374; O0-NEXT: tilestored %tmm0, (%rcx,%rdx)375; O0-NEXT: callq foo376; O0-NEXT: movl $64, %edx377; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rcx378; O0-NEXT: movw $8, %ax379; O0-NEXT: # implicit-def: $al380; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)381; O0-NEXT: movw %ax, {{[0-9]+}}(%rsp)382; O0-NEXT: ldtilecfg {{[0-9]+}}(%rsp)383; O0-NEXT: tileloadd (%rcx,%rdx), %tmm0384; O0-NEXT: movl $32, %edx385; O0-NEXT: movl $buf+2048, %ecx386; O0-NEXT: movw $8, %ax387; O0-NEXT: tilestored %tmm0, (%rcx,%rdx)388; O0-NEXT: callq foo389; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload390; O0-NEXT: addl $1, %eax391; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill392; O0-NEXT: cmpl $0, %eax393; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill394; O0-NEXT: je .LBB2_2395; O0-NEXT: jmp .LBB2_3396; O0-NEXT: .LBB2_4:397; O0-NEXT: callq foo398; O0-NEXT: movl $32, %edx399; O0-NEXT: movl $buf+1024, %ecx400; O0-NEXT: movw $8, %ax401; O0-NEXT: # implicit-def: $al402; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)403; O0-NEXT: movw %ax, {{[0-9]+}}(%rsp)404; O0-NEXT: ldtilecfg {{[0-9]+}}(%rsp)405; O0-NEXT: tileloadd (%rcx,%rdx), %tmm0406; O0-NEXT: movl $64, %edx407; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rcx408; O0-NEXT: movw $8, %ax409; O0-NEXT: tilestored %tmm0, (%rcx,%rdx)410; O0-NEXT: movl $64, %edx411; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rcx412; O0-NEXT: movw $8, %ax413; O0-NEXT: # implicit-def: $al414; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)415; O0-NEXT: movw %ax, {{[0-9]+}}(%rsp)416; O0-NEXT: ldtilecfg {{[0-9]+}}(%rsp)417; O0-NEXT: tileloadd (%rcx,%rdx), %tmm0418; O0-NEXT: movl $32, %edx419; O0-NEXT: movl $buf+1024, %ecx420; O0-NEXT: movw $8, %ax421; O0-NEXT: tilestored %tmm0, (%rcx,%rdx)422; O0-NEXT: jmp .LBB2_7423; O0-NEXT: .LBB2_5:424; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload425; O0-NEXT: cmpl $7, %eax426; O0-NEXT: jne .LBB2_7427; O0-NEXT: # %bb.6:428; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload429; O0-NEXT: addl $1, %eax430; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill431; O0-NEXT: jmp .LBB2_8432; O0-NEXT: .LBB2_7:433; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload434; O0-NEXT: subl $1, %eax435; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill436; O0-NEXT: .LBB2_8:437; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload438; O0-NEXT: movq %rbp, %rsp439; O0-NEXT: popq %rbp440; O0-NEXT: tilerelease441; O0-NEXT: retq442 call void @foo()443 br label %24442:445 %3 = icmp sgt i32 %0, 0446 br i1 %3, label %11, label %64474:448 %5 = icmp eq i32 %0, 3449 br i1 %5, label %13, label %114506:451 %7 = phi i32 [ %9, %6 ], [ 0, %2 ]452 %8 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 8, i16 8, ptr @buf, i64 32)453 call void @foo()454 tail call void @llvm.x86.tilestored64.internal(i16 8, i16 8, ptr getelementptr inbounds ([3072 x i8], ptr @buf, i64 0, i64 2048), i64 32, x86_amx %8)455 call void @foo()456 %9 = add i32 %7, 1457 %10 = icmp eq i32 %9, 0458 br i1 %10, label %4, label %645911:460 call void @foo()461 %12 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 8, i16 8, ptr getelementptr inbounds ([3072 x i8], ptr @buf, i64 0, i64 1024), i64 32)462 tail call void @llvm.x86.tilestored64.internal(i16 8, i16 8, ptr getelementptr inbounds ([3072 x i8], ptr @buf, i64 0, i64 1024), i64 32, x86_amx %12)463 br label %1746413:465 %14 = icmp eq i32 %9, 7466 br i1 %14, label %15, label %1746715:468 %16 = add i32 %0, 1469 br label %1947017:471 %18 = sub i32 %0, 1472 br label %1947319:474 %20 = phi i32 [ %16, %15 ], [ %18, %17 ]475 ret i32 %20476}477 478define dso_local void @test_loop2(i32 %0) nounwind {479; CHECK-LABEL: test_loop2:480; CHECK: # %bb.0:481; CHECK-NEXT: pushq %rbp482; CHECK-NEXT: pushq %r15483; CHECK-NEXT: pushq %r14484; CHECK-NEXT: pushq %r12485; CHECK-NEXT: pushq %rbx486; CHECK-NEXT: subq $1088, %rsp # imm = 0x440487; CHECK-NEXT: movl %edi, %ebx488; CHECK-NEXT: vxorps %xmm0, %xmm0, %xmm0489; CHECK-NEXT: vmovups %zmm0, (%rsp)490; CHECK-NEXT: movb $1, (%rsp)491; CHECK-NEXT: movb $8, {{[0-9]+}}(%rsp)492; CHECK-NEXT: movw $8, {{[0-9]+}}(%rsp)493; CHECK-NEXT: movl $buf, %r14d494; CHECK-NEXT: movl $32, %r15d495; CHECK-NEXT: movw $8, %bp496; CHECK-NEXT: movl $buf+2048, %r12d497; CHECK-NEXT: .p2align 4498; CHECK-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1499; CHECK-NEXT: vzeroupper500; CHECK-NEXT: callq foo501; CHECK-NEXT: ldtilecfg (%rsp)502; CHECK-NEXT: testl %ebx, %ebx503; CHECK-NEXT: jle .LBB3_3504; CHECK-NEXT: # %bb.2: # in Loop: Header=BB3_1 Depth=1505; CHECK-NEXT: tileloadd (%r14,%r15), %tmm0506; CHECK-NEXT: movabsq $64, %rax507; CHECK-NEXT: tilestored %tmm0, 64(%rsp,%rax) # 1024-byte Folded Spill508; CHECK-NEXT: callq foo509; CHECK-NEXT: ldtilecfg (%rsp)510; CHECK-NEXT: movabsq $64, %rax511; CHECK-NEXT: tileloadd 64(%rsp,%rax), %tmm0 # 1024-byte Folded Reload512; CHECK-NEXT: tilestored %tmm0, (%r12,%r15)513; CHECK-NEXT: callq foo514; CHECK-NEXT: jmp .LBB3_1515; CHECK-NEXT: .LBB3_3:516; CHECK-NEXT: addq $1088, %rsp # imm = 0x440517; CHECK-NEXT: popq %rbx518; CHECK-NEXT: popq %r12519; CHECK-NEXT: popq %r14520; CHECK-NEXT: popq %r15521; CHECK-NEXT: popq %rbp522; CHECK-NEXT: tilerelease523; CHECK-NEXT: retq524;525; IPRA-LABEL: test_loop2:526; IPRA: # %bb.0:527; IPRA-NEXT: subq $72, %rsp528; IPRA-NEXT: vxorps %xmm0, %xmm0, %xmm0529; IPRA-NEXT: vmovups %zmm0, {{[0-9]+}}(%rsp)530; IPRA-NEXT: movb $1, {{[0-9]+}}(%rsp)531; IPRA-NEXT: movb $8, {{[0-9]+}}(%rsp)532; IPRA-NEXT: movw $8, {{[0-9]+}}(%rsp)533; IPRA-NEXT: ldtilecfg {{[0-9]+}}(%rsp)534; IPRA-NEXT: movl $buf, %eax535; IPRA-NEXT: movl $32, %ecx536; IPRA-NEXT: movw $8, %dx537; IPRA-NEXT: movl $buf+2048, %esi538; IPRA-NEXT: .p2align 4539; IPRA-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1540; IPRA-NEXT: callq foo541; IPRA-NEXT: testl %edi, %edi542; IPRA-NEXT: jle .LBB3_3543; IPRA-NEXT: # %bb.2: # in Loop: Header=BB3_1 Depth=1544; IPRA-NEXT: tileloadd (%rax,%rcx), %tmm0545; IPRA-NEXT: callq foo546; IPRA-NEXT: tilestored %tmm0, (%rsi,%rcx)547; IPRA-NEXT: callq foo548; IPRA-NEXT: jmp .LBB3_1549; IPRA-NEXT: .LBB3_3:550; IPRA-NEXT: addq $72, %rsp551; IPRA-NEXT: tilerelease552; IPRA-NEXT: vzeroupper553; IPRA-NEXT: retq554;555; O0-LABEL: test_loop2:556; O0: # %bb.0:557; O0-NEXT: pushq %rbp558; O0-NEXT: movq %rsp, %rbp559; O0-NEXT: andq $-1024, %rsp # imm = 0xFC00560; O0-NEXT: subq $3072, %rsp # imm = 0xC00561; O0-NEXT: vxorps %xmm0, %xmm0, %xmm0562; O0-NEXT: vmovups %zmm0, {{[0-9]+}}(%rsp)563; O0-NEXT: movb $1, {{[0-9]+}}(%rsp)564; O0-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill565; O0-NEXT: xorl %eax, %eax566; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill567; O0-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1568; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload569; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill570; O0-NEXT: vzeroupper571; O0-NEXT: callq foo572; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload573; O0-NEXT: cmpl $0, %eax574; O0-NEXT: jle .LBB3_3575; O0-NEXT: # %bb.2: # in Loop: Header=BB3_1 Depth=1576; O0-NEXT: movl $buf, %ecx577; O0-NEXT: movl $32, %edx578; O0-NEXT: movw $8, %ax579; O0-NEXT: # implicit-def: $al580; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)581; O0-NEXT: movw %ax, {{[0-9]+}}(%rsp)582; O0-NEXT: ldtilecfg {{[0-9]+}}(%rsp)583; O0-NEXT: tileloadd (%rcx,%rdx), %tmm0584; O0-NEXT: movl $64, %edx585; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rcx586; O0-NEXT: movw $8, %ax587; O0-NEXT: tilestored %tmm0, (%rcx,%rdx)588; O0-NEXT: callq foo589; O0-NEXT: movl $64, %edx590; O0-NEXT: leaq {{[0-9]+}}(%rsp), %rcx591; O0-NEXT: movw $8, %ax592; O0-NEXT: # implicit-def: $al593; O0-NEXT: movb %al, {{[0-9]+}}(%rsp)594; O0-NEXT: movw %ax, {{[0-9]+}}(%rsp)595; O0-NEXT: ldtilecfg {{[0-9]+}}(%rsp)596; O0-NEXT: tileloadd (%rcx,%rdx), %tmm0597; O0-NEXT: movl $32, %edx598; O0-NEXT: movl $buf+2048, %ecx599; O0-NEXT: movw $8, %ax600; O0-NEXT: tilestored %tmm0, (%rcx,%rdx)601; O0-NEXT: callq foo602; O0-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload603; O0-NEXT: addl $1, %eax604; O0-NEXT: movl %eax, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill605; O0-NEXT: jmp .LBB3_1606; O0-NEXT: .LBB3_3:607; O0-NEXT: movq %rbp, %rsp608; O0-NEXT: popq %rbp609; O0-NEXT: tilerelease610; O0-NEXT: retq611 br label %26122:613 %3 = phi i32 [ 0, %1 ], [ %7, %5 ]614 call void @foo()615 %4 = icmp sgt i32 %0, 0616 br i1 %4, label %5, label %86175:618 %6 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 8, i16 8, ptr @buf, i64 32)619 call void @foo()620 tail call void @llvm.x86.tilestored64.internal(i16 8, i16 8, ptr getelementptr inbounds ([3072 x i8], ptr @buf, i64 0, i64 2048), i64 32, x86_amx %6)621 call void @foo()622 %7 = add i32 %3, 1623 br label %26248:625 ret void626}627 628declare x86_amx @llvm.x86.tileloadd64.internal(i16, i16, ptr, i64)629declare x86_amx @llvm.x86.tdpbssd.internal(i16, i16, i16, x86_amx, x86_amx, x86_amx)630declare void @llvm.x86.tilestored64.internal(i16, i16, ptr, i64, x86_amx)631