561 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -O3 -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=+bmi < %s | FileCheck %s3 4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"5target triple = "x86_64-unknown-unknown"6 7; Stack reload folding tests.8;9; By including a nop call with sideeffects we can force a partial register spill of the10; relevant registers and check that the reload is correctly folded into the instruction.11 12define i32 @stack_fold_andn_u32(i32 %a0, i32 %a1) {13; CHECK-LABEL: stack_fold_andn_u32:14; CHECK: # %bb.0:15; CHECK-NEXT: pushq %rbp16; CHECK-NEXT: .cfi_def_cfa_offset 1617; CHECK-NEXT: pushq %r1518; CHECK-NEXT: .cfi_def_cfa_offset 2419; CHECK-NEXT: pushq %r1420; CHECK-NEXT: .cfi_def_cfa_offset 3221; CHECK-NEXT: pushq %r1322; CHECK-NEXT: .cfi_def_cfa_offset 4023; CHECK-NEXT: pushq %r1224; CHECK-NEXT: .cfi_def_cfa_offset 4825; CHECK-NEXT: pushq %rbx26; CHECK-NEXT: .cfi_def_cfa_offset 5627; CHECK-NEXT: .cfi_offset %rbx, -5628; CHECK-NEXT: .cfi_offset %r12, -4829; CHECK-NEXT: .cfi_offset %r13, -4030; CHECK-NEXT: .cfi_offset %r14, -3231; CHECK-NEXT: .cfi_offset %r15, -2432; CHECK-NEXT: .cfi_offset %rbp, -1633; CHECK-NEXT: movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill34; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill35; CHECK-NEXT: #APP36; CHECK-NEXT: nop37; CHECK-NEXT: #NO_APP38; CHECK-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload39; CHECK-NEXT: andnl {{[-0-9]+}}(%r{{[sb]}}p), %eax, %eax # 4-byte Folded Reload40; CHECK-NEXT: popq %rbx41; CHECK-NEXT: .cfi_def_cfa_offset 4842; CHECK-NEXT: popq %r1243; CHECK-NEXT: .cfi_def_cfa_offset 4044; CHECK-NEXT: popq %r1345; CHECK-NEXT: .cfi_def_cfa_offset 3246; CHECK-NEXT: popq %r1447; CHECK-NEXT: .cfi_def_cfa_offset 2448; CHECK-NEXT: popq %r1549; CHECK-NEXT: .cfi_def_cfa_offset 1650; CHECK-NEXT: popq %rbp51; CHECK-NEXT: .cfi_def_cfa_offset 852; CHECK-NEXT: retq53 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()54 %2 = xor i32 %a0, -155 %3 = and i32 %a1, %256 ret i32 %357}58 59define i64 @stack_fold_andn_u64(i64 %a0, i64 %a1) {60; CHECK-LABEL: stack_fold_andn_u64:61; CHECK: # %bb.0:62; CHECK-NEXT: pushq %rbp63; CHECK-NEXT: .cfi_def_cfa_offset 1664; CHECK-NEXT: pushq %r1565; CHECK-NEXT: .cfi_def_cfa_offset 2466; CHECK-NEXT: pushq %r1467; CHECK-NEXT: .cfi_def_cfa_offset 3268; CHECK-NEXT: pushq %r1369; CHECK-NEXT: .cfi_def_cfa_offset 4070; CHECK-NEXT: pushq %r1271; CHECK-NEXT: .cfi_def_cfa_offset 4872; CHECK-NEXT: pushq %rbx73; CHECK-NEXT: .cfi_def_cfa_offset 5674; CHECK-NEXT: .cfi_offset %rbx, -5675; CHECK-NEXT: .cfi_offset %r12, -4876; CHECK-NEXT: .cfi_offset %r13, -4077; CHECK-NEXT: .cfi_offset %r14, -3278; CHECK-NEXT: .cfi_offset %r15, -2479; CHECK-NEXT: .cfi_offset %rbp, -1680; CHECK-NEXT: movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill81; CHECK-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill82; CHECK-NEXT: #APP83; CHECK-NEXT: nop84; CHECK-NEXT: #NO_APP85; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload86; CHECK-NEXT: andnq {{[-0-9]+}}(%r{{[sb]}}p), %rax, %rax # 8-byte Folded Reload87; CHECK-NEXT: popq %rbx88; CHECK-NEXT: .cfi_def_cfa_offset 4889; CHECK-NEXT: popq %r1290; CHECK-NEXT: .cfi_def_cfa_offset 4091; CHECK-NEXT: popq %r1392; CHECK-NEXT: .cfi_def_cfa_offset 3293; CHECK-NEXT: popq %r1494; CHECK-NEXT: .cfi_def_cfa_offset 2495; CHECK-NEXT: popq %r1596; CHECK-NEXT: .cfi_def_cfa_offset 1697; CHECK-NEXT: popq %rbp98; CHECK-NEXT: .cfi_def_cfa_offset 899; CHECK-NEXT: retq100 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()101 %2 = xor i64 %a0, -1102 %3 = and i64 %a1, %2103 ret i64 %3104}105 106define i32 @stack_fold_bextr_u32(i32 %a0, i32 %a1) {107; CHECK-LABEL: stack_fold_bextr_u32:108; CHECK: # %bb.0:109; CHECK-NEXT: pushq %rbp110; CHECK-NEXT: .cfi_def_cfa_offset 16111; CHECK-NEXT: pushq %r15112; CHECK-NEXT: .cfi_def_cfa_offset 24113; CHECK-NEXT: pushq %r14114; CHECK-NEXT: .cfi_def_cfa_offset 32115; CHECK-NEXT: pushq %r13116; CHECK-NEXT: .cfi_def_cfa_offset 40117; CHECK-NEXT: pushq %r12118; CHECK-NEXT: .cfi_def_cfa_offset 48119; CHECK-NEXT: pushq %rbx120; CHECK-NEXT: .cfi_def_cfa_offset 56121; CHECK-NEXT: .cfi_offset %rbx, -56122; CHECK-NEXT: .cfi_offset %r12, -48123; CHECK-NEXT: .cfi_offset %r13, -40124; CHECK-NEXT: .cfi_offset %r14, -32125; CHECK-NEXT: .cfi_offset %r15, -24126; CHECK-NEXT: .cfi_offset %rbp, -16127; CHECK-NEXT: movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill128; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill129; CHECK-NEXT: #APP130; CHECK-NEXT: nop131; CHECK-NEXT: #NO_APP132; CHECK-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload133; CHECK-NEXT: bextrl %eax, {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Folded Reload134; CHECK-NEXT: popq %rbx135; CHECK-NEXT: .cfi_def_cfa_offset 48136; CHECK-NEXT: popq %r12137; CHECK-NEXT: .cfi_def_cfa_offset 40138; CHECK-NEXT: popq %r13139; CHECK-NEXT: .cfi_def_cfa_offset 32140; CHECK-NEXT: popq %r14141; CHECK-NEXT: .cfi_def_cfa_offset 24142; CHECK-NEXT: popq %r15143; CHECK-NEXT: .cfi_def_cfa_offset 16144; CHECK-NEXT: popq %rbp145; CHECK-NEXT: .cfi_def_cfa_offset 8146; CHECK-NEXT: retq147 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()148 %2 = tail call i32 @llvm.x86.bmi.bextr.32(i32 %a0, i32 %a1)149 ret i32 %2150}151declare i32 @llvm.x86.bmi.bextr.32(i32, i32)152 153define i64 @stack_fold_bextr_u64(i64 %a0, i64 %a1) {154; CHECK-LABEL: stack_fold_bextr_u64:155; CHECK: # %bb.0:156; CHECK-NEXT: pushq %rbp157; CHECK-NEXT: .cfi_def_cfa_offset 16158; CHECK-NEXT: pushq %r15159; CHECK-NEXT: .cfi_def_cfa_offset 24160; CHECK-NEXT: pushq %r14161; CHECK-NEXT: .cfi_def_cfa_offset 32162; CHECK-NEXT: pushq %r13163; CHECK-NEXT: .cfi_def_cfa_offset 40164; CHECK-NEXT: pushq %r12165; CHECK-NEXT: .cfi_def_cfa_offset 48166; CHECK-NEXT: pushq %rbx167; CHECK-NEXT: .cfi_def_cfa_offset 56168; CHECK-NEXT: .cfi_offset %rbx, -56169; CHECK-NEXT: .cfi_offset %r12, -48170; CHECK-NEXT: .cfi_offset %r13, -40171; CHECK-NEXT: .cfi_offset %r14, -32172; CHECK-NEXT: .cfi_offset %r15, -24173; CHECK-NEXT: .cfi_offset %rbp, -16174; CHECK-NEXT: movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill175; CHECK-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill176; CHECK-NEXT: #APP177; CHECK-NEXT: nop178; CHECK-NEXT: #NO_APP179; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload180; CHECK-NEXT: bextrq %rax, {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload181; CHECK-NEXT: popq %rbx182; CHECK-NEXT: .cfi_def_cfa_offset 48183; CHECK-NEXT: popq %r12184; CHECK-NEXT: .cfi_def_cfa_offset 40185; CHECK-NEXT: popq %r13186; CHECK-NEXT: .cfi_def_cfa_offset 32187; CHECK-NEXT: popq %r14188; CHECK-NEXT: .cfi_def_cfa_offset 24189; CHECK-NEXT: popq %r15190; CHECK-NEXT: .cfi_def_cfa_offset 16191; CHECK-NEXT: popq %rbp192; CHECK-NEXT: .cfi_def_cfa_offset 8193; CHECK-NEXT: retq194 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()195 %2 = tail call i64 @llvm.x86.bmi.bextr.64(i64 %a0, i64 %a1)196 ret i64 %2197}198declare i64 @llvm.x86.bmi.bextr.64(i64, i64)199 200define i32 @stack_fold_blsi_u32(i32 %a0) {201; CHECK-LABEL: stack_fold_blsi_u32:202; CHECK: # %bb.0:203; CHECK-NEXT: pushq %rbp204; CHECK-NEXT: .cfi_def_cfa_offset 16205; CHECK-NEXT: pushq %r15206; CHECK-NEXT: .cfi_def_cfa_offset 24207; CHECK-NEXT: pushq %r14208; CHECK-NEXT: .cfi_def_cfa_offset 32209; CHECK-NEXT: pushq %r13210; CHECK-NEXT: .cfi_def_cfa_offset 40211; CHECK-NEXT: pushq %r12212; CHECK-NEXT: .cfi_def_cfa_offset 48213; CHECK-NEXT: pushq %rbx214; CHECK-NEXT: .cfi_def_cfa_offset 56215; CHECK-NEXT: .cfi_offset %rbx, -56216; CHECK-NEXT: .cfi_offset %r12, -48217; CHECK-NEXT: .cfi_offset %r13, -40218; CHECK-NEXT: .cfi_offset %r14, -32219; CHECK-NEXT: .cfi_offset %r15, -24220; CHECK-NEXT: .cfi_offset %rbp, -16221; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill222; CHECK-NEXT: #APP223; CHECK-NEXT: nop224; CHECK-NEXT: #NO_APP225; CHECK-NEXT: blsil {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Folded Reload226; CHECK-NEXT: popq %rbx227; CHECK-NEXT: .cfi_def_cfa_offset 48228; CHECK-NEXT: popq %r12229; CHECK-NEXT: .cfi_def_cfa_offset 40230; CHECK-NEXT: popq %r13231; CHECK-NEXT: .cfi_def_cfa_offset 32232; CHECK-NEXT: popq %r14233; CHECK-NEXT: .cfi_def_cfa_offset 24234; CHECK-NEXT: popq %r15235; CHECK-NEXT: .cfi_def_cfa_offset 16236; CHECK-NEXT: popq %rbp237; CHECK-NEXT: .cfi_def_cfa_offset 8238; CHECK-NEXT: retq239 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()240 %2 = sub i32 0, %a0241 %3 = and i32 %2, %a0242 ret i32 %3243}244 245define i64 @stack_fold_blsi_u64(i64 %a0) {246; CHECK-LABEL: stack_fold_blsi_u64:247; CHECK: # %bb.0:248; CHECK-NEXT: pushq %rbp249; CHECK-NEXT: .cfi_def_cfa_offset 16250; CHECK-NEXT: pushq %r15251; CHECK-NEXT: .cfi_def_cfa_offset 24252; CHECK-NEXT: pushq %r14253; CHECK-NEXT: .cfi_def_cfa_offset 32254; CHECK-NEXT: pushq %r13255; CHECK-NEXT: .cfi_def_cfa_offset 40256; CHECK-NEXT: pushq %r12257; CHECK-NEXT: .cfi_def_cfa_offset 48258; CHECK-NEXT: pushq %rbx259; CHECK-NEXT: .cfi_def_cfa_offset 56260; CHECK-NEXT: .cfi_offset %rbx, -56261; CHECK-NEXT: .cfi_offset %r12, -48262; CHECK-NEXT: .cfi_offset %r13, -40263; CHECK-NEXT: .cfi_offset %r14, -32264; CHECK-NEXT: .cfi_offset %r15, -24265; CHECK-NEXT: .cfi_offset %rbp, -16266; CHECK-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill267; CHECK-NEXT: #APP268; CHECK-NEXT: nop269; CHECK-NEXT: #NO_APP270; CHECK-NEXT: blsiq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload271; CHECK-NEXT: popq %rbx272; CHECK-NEXT: .cfi_def_cfa_offset 48273; CHECK-NEXT: popq %r12274; CHECK-NEXT: .cfi_def_cfa_offset 40275; CHECK-NEXT: popq %r13276; CHECK-NEXT: .cfi_def_cfa_offset 32277; CHECK-NEXT: popq %r14278; CHECK-NEXT: .cfi_def_cfa_offset 24279; CHECK-NEXT: popq %r15280; CHECK-NEXT: .cfi_def_cfa_offset 16281; CHECK-NEXT: popq %rbp282; CHECK-NEXT: .cfi_def_cfa_offset 8283; CHECK-NEXT: retq284 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()285 %2 = sub i64 0, %a0286 %3 = and i64 %2, %a0287 ret i64 %3288}289 290define i32 @stack_fold_blsmsk_u32(i32 %a0) {291; CHECK-LABEL: stack_fold_blsmsk_u32:292; CHECK: # %bb.0:293; CHECK-NEXT: pushq %rbp294; CHECK-NEXT: .cfi_def_cfa_offset 16295; CHECK-NEXT: pushq %r15296; CHECK-NEXT: .cfi_def_cfa_offset 24297; CHECK-NEXT: pushq %r14298; CHECK-NEXT: .cfi_def_cfa_offset 32299; CHECK-NEXT: pushq %r13300; CHECK-NEXT: .cfi_def_cfa_offset 40301; CHECK-NEXT: pushq %r12302; CHECK-NEXT: .cfi_def_cfa_offset 48303; CHECK-NEXT: pushq %rbx304; CHECK-NEXT: .cfi_def_cfa_offset 56305; CHECK-NEXT: .cfi_offset %rbx, -56306; CHECK-NEXT: .cfi_offset %r12, -48307; CHECK-NEXT: .cfi_offset %r13, -40308; CHECK-NEXT: .cfi_offset %r14, -32309; CHECK-NEXT: .cfi_offset %r15, -24310; CHECK-NEXT: .cfi_offset %rbp, -16311; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill312; CHECK-NEXT: #APP313; CHECK-NEXT: nop314; CHECK-NEXT: #NO_APP315; CHECK-NEXT: blsmskl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Folded Reload316; CHECK-NEXT: popq %rbx317; CHECK-NEXT: .cfi_def_cfa_offset 48318; CHECK-NEXT: popq %r12319; CHECK-NEXT: .cfi_def_cfa_offset 40320; CHECK-NEXT: popq %r13321; CHECK-NEXT: .cfi_def_cfa_offset 32322; CHECK-NEXT: popq %r14323; CHECK-NEXT: .cfi_def_cfa_offset 24324; CHECK-NEXT: popq %r15325; CHECK-NEXT: .cfi_def_cfa_offset 16326; CHECK-NEXT: popq %rbp327; CHECK-NEXT: .cfi_def_cfa_offset 8328; CHECK-NEXT: retq329 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()330 %2 = sub i32 %a0, 1331 %3 = xor i32 %2, %a0332 ret i32 %3333}334 335define i64 @stack_fold_blsmsk_u64(i64 %a0) {336; CHECK-LABEL: stack_fold_blsmsk_u64:337; CHECK: # %bb.0:338; CHECK-NEXT: pushq %rbp339; CHECK-NEXT: .cfi_def_cfa_offset 16340; CHECK-NEXT: pushq %r15341; CHECK-NEXT: .cfi_def_cfa_offset 24342; CHECK-NEXT: pushq %r14343; CHECK-NEXT: .cfi_def_cfa_offset 32344; CHECK-NEXT: pushq %r13345; CHECK-NEXT: .cfi_def_cfa_offset 40346; CHECK-NEXT: pushq %r12347; CHECK-NEXT: .cfi_def_cfa_offset 48348; CHECK-NEXT: pushq %rbx349; CHECK-NEXT: .cfi_def_cfa_offset 56350; CHECK-NEXT: .cfi_offset %rbx, -56351; CHECK-NEXT: .cfi_offset %r12, -48352; CHECK-NEXT: .cfi_offset %r13, -40353; CHECK-NEXT: .cfi_offset %r14, -32354; CHECK-NEXT: .cfi_offset %r15, -24355; CHECK-NEXT: .cfi_offset %rbp, -16356; CHECK-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill357; CHECK-NEXT: #APP358; CHECK-NEXT: nop359; CHECK-NEXT: #NO_APP360; CHECK-NEXT: blsmskq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload361; CHECK-NEXT: popq %rbx362; CHECK-NEXT: .cfi_def_cfa_offset 48363; CHECK-NEXT: popq %r12364; CHECK-NEXT: .cfi_def_cfa_offset 40365; CHECK-NEXT: popq %r13366; CHECK-NEXT: .cfi_def_cfa_offset 32367; CHECK-NEXT: popq %r14368; CHECK-NEXT: .cfi_def_cfa_offset 24369; CHECK-NEXT: popq %r15370; CHECK-NEXT: .cfi_def_cfa_offset 16371; CHECK-NEXT: popq %rbp372; CHECK-NEXT: .cfi_def_cfa_offset 8373; CHECK-NEXT: retq374 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()375 %2 = sub i64 %a0, 1376 %3 = xor i64 %2, %a0377 ret i64 %3378}379 380define i32 @stack_fold_blsr_u32(i32 %a0) {381; CHECK-LABEL: stack_fold_blsr_u32:382; CHECK: # %bb.0:383; CHECK-NEXT: pushq %rbp384; CHECK-NEXT: .cfi_def_cfa_offset 16385; CHECK-NEXT: pushq %r15386; CHECK-NEXT: .cfi_def_cfa_offset 24387; CHECK-NEXT: pushq %r14388; CHECK-NEXT: .cfi_def_cfa_offset 32389; CHECK-NEXT: pushq %r13390; CHECK-NEXT: .cfi_def_cfa_offset 40391; CHECK-NEXT: pushq %r12392; CHECK-NEXT: .cfi_def_cfa_offset 48393; CHECK-NEXT: pushq %rbx394; CHECK-NEXT: .cfi_def_cfa_offset 56395; CHECK-NEXT: .cfi_offset %rbx, -56396; CHECK-NEXT: .cfi_offset %r12, -48397; CHECK-NEXT: .cfi_offset %r13, -40398; CHECK-NEXT: .cfi_offset %r14, -32399; CHECK-NEXT: .cfi_offset %r15, -24400; CHECK-NEXT: .cfi_offset %rbp, -16401; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill402; CHECK-NEXT: #APP403; CHECK-NEXT: nop404; CHECK-NEXT: #NO_APP405; CHECK-NEXT: blsrl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Folded Reload406; CHECK-NEXT: popq %rbx407; CHECK-NEXT: .cfi_def_cfa_offset 48408; CHECK-NEXT: popq %r12409; CHECK-NEXT: .cfi_def_cfa_offset 40410; CHECK-NEXT: popq %r13411; CHECK-NEXT: .cfi_def_cfa_offset 32412; CHECK-NEXT: popq %r14413; CHECK-NEXT: .cfi_def_cfa_offset 24414; CHECK-NEXT: popq %r15415; CHECK-NEXT: .cfi_def_cfa_offset 16416; CHECK-NEXT: popq %rbp417; CHECK-NEXT: .cfi_def_cfa_offset 8418; CHECK-NEXT: retq419 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()420 %2 = sub i32 %a0, 1421 %3 = and i32 %2, %a0422 ret i32 %3423}424 425define i64 @stack_fold_blsr_u64(i64 %a0) {426; CHECK-LABEL: stack_fold_blsr_u64:427; CHECK: # %bb.0:428; CHECK-NEXT: pushq %rbp429; CHECK-NEXT: .cfi_def_cfa_offset 16430; CHECK-NEXT: pushq %r15431; CHECK-NEXT: .cfi_def_cfa_offset 24432; CHECK-NEXT: pushq %r14433; CHECK-NEXT: .cfi_def_cfa_offset 32434; CHECK-NEXT: pushq %r13435; CHECK-NEXT: .cfi_def_cfa_offset 40436; CHECK-NEXT: pushq %r12437; CHECK-NEXT: .cfi_def_cfa_offset 48438; CHECK-NEXT: pushq %rbx439; CHECK-NEXT: .cfi_def_cfa_offset 56440; CHECK-NEXT: .cfi_offset %rbx, -56441; CHECK-NEXT: .cfi_offset %r12, -48442; CHECK-NEXT: .cfi_offset %r13, -40443; CHECK-NEXT: .cfi_offset %r14, -32444; CHECK-NEXT: .cfi_offset %r15, -24445; CHECK-NEXT: .cfi_offset %rbp, -16446; CHECK-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill447; CHECK-NEXT: #APP448; CHECK-NEXT: nop449; CHECK-NEXT: #NO_APP450; CHECK-NEXT: blsrq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload451; CHECK-NEXT: popq %rbx452; CHECK-NEXT: .cfi_def_cfa_offset 48453; CHECK-NEXT: popq %r12454; CHECK-NEXT: .cfi_def_cfa_offset 40455; CHECK-NEXT: popq %r13456; CHECK-NEXT: .cfi_def_cfa_offset 32457; CHECK-NEXT: popq %r14458; CHECK-NEXT: .cfi_def_cfa_offset 24459; CHECK-NEXT: popq %r15460; CHECK-NEXT: .cfi_def_cfa_offset 16461; CHECK-NEXT: popq %rbp462; CHECK-NEXT: .cfi_def_cfa_offset 8463; CHECK-NEXT: retq464 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()465 %2 = sub i64 %a0, 1466 %3 = and i64 %2, %a0467 ret i64 %3468}469 470;TODO stack_fold_tzcnt_u16471 472define i32 @stack_fold_tzcnt_u32(i32 %a0) {473; CHECK-LABEL: stack_fold_tzcnt_u32:474; CHECK: # %bb.0:475; CHECK-NEXT: pushq %rbp476; CHECK-NEXT: .cfi_def_cfa_offset 16477; CHECK-NEXT: pushq %r15478; CHECK-NEXT: .cfi_def_cfa_offset 24479; CHECK-NEXT: pushq %r14480; CHECK-NEXT: .cfi_def_cfa_offset 32481; CHECK-NEXT: pushq %r13482; CHECK-NEXT: .cfi_def_cfa_offset 40483; CHECK-NEXT: pushq %r12484; CHECK-NEXT: .cfi_def_cfa_offset 48485; CHECK-NEXT: pushq %rbx486; CHECK-NEXT: .cfi_def_cfa_offset 56487; CHECK-NEXT: .cfi_offset %rbx, -56488; CHECK-NEXT: .cfi_offset %r12, -48489; CHECK-NEXT: .cfi_offset %r13, -40490; CHECK-NEXT: .cfi_offset %r14, -32491; CHECK-NEXT: .cfi_offset %r15, -24492; CHECK-NEXT: .cfi_offset %rbp, -16493; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill494; CHECK-NEXT: #APP495; CHECK-NEXT: nop496; CHECK-NEXT: #NO_APP497; CHECK-NEXT: tzcntl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Folded Reload498; CHECK-NEXT: popq %rbx499; CHECK-NEXT: .cfi_def_cfa_offset 48500; CHECK-NEXT: popq %r12501; CHECK-NEXT: .cfi_def_cfa_offset 40502; CHECK-NEXT: popq %r13503; CHECK-NEXT: .cfi_def_cfa_offset 32504; CHECK-NEXT: popq %r14505; CHECK-NEXT: .cfi_def_cfa_offset 24506; CHECK-NEXT: popq %r15507; CHECK-NEXT: .cfi_def_cfa_offset 16508; CHECK-NEXT: popq %rbp509; CHECK-NEXT: .cfi_def_cfa_offset 8510; CHECK-NEXT: retq511 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()512 %2 = tail call i32 @llvm.cttz.i32(i32 %a0, i1 0)513 ret i32 %2514}515declare i32 @llvm.cttz.i32(i32, i1)516 517define i64 @stack_fold_tzcnt_u64(i64 %a0) {518; CHECK-LABEL: stack_fold_tzcnt_u64:519; CHECK: # %bb.0:520; CHECK-NEXT: pushq %rbp521; CHECK-NEXT: .cfi_def_cfa_offset 16522; CHECK-NEXT: pushq %r15523; CHECK-NEXT: .cfi_def_cfa_offset 24524; CHECK-NEXT: pushq %r14525; CHECK-NEXT: .cfi_def_cfa_offset 32526; CHECK-NEXT: pushq %r13527; CHECK-NEXT: .cfi_def_cfa_offset 40528; CHECK-NEXT: pushq %r12529; CHECK-NEXT: .cfi_def_cfa_offset 48530; CHECK-NEXT: pushq %rbx531; CHECK-NEXT: .cfi_def_cfa_offset 56532; CHECK-NEXT: .cfi_offset %rbx, -56533; CHECK-NEXT: .cfi_offset %r12, -48534; CHECK-NEXT: .cfi_offset %r13, -40535; CHECK-NEXT: .cfi_offset %r14, -32536; CHECK-NEXT: .cfi_offset %r15, -24537; CHECK-NEXT: .cfi_offset %rbp, -16538; CHECK-NEXT: movq %rdi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill539; CHECK-NEXT: #APP540; CHECK-NEXT: nop541; CHECK-NEXT: #NO_APP542; CHECK-NEXT: tzcntq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Folded Reload543; CHECK-NEXT: popq %rbx544; CHECK-NEXT: .cfi_def_cfa_offset 48545; CHECK-NEXT: popq %r12546; CHECK-NEXT: .cfi_def_cfa_offset 40547; CHECK-NEXT: popq %r13548; CHECK-NEXT: .cfi_def_cfa_offset 32549; CHECK-NEXT: popq %r14550; CHECK-NEXT: .cfi_def_cfa_offset 24551; CHECK-NEXT: popq %r15552; CHECK-NEXT: .cfi_def_cfa_offset 16553; CHECK-NEXT: popq %rbp554; CHECK-NEXT: .cfi_def_cfa_offset 8555; CHECK-NEXT: retq556 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()557 %2 = tail call i64 @llvm.cttz.i64(i64 %a0, i1 0)558 ret i64 %2559}560declare i64 @llvm.cttz.i64(i64, i1)561