353 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=+adx < %s | FileCheck %s --check-prefix=CHECK3; RUN: llc -O3 -disable-peephole -mtriple=x86_64-unknown-unknown -mattr=-adx < %s | FileCheck %s --check-prefix=CHECK4 5target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"6target triple = "x86_64-unknown-unknown"7 8; Stack reload folding tests.9;10; By including a nop call with sideeffects we can force a partial register spill of the11; relevant registers and check that the reload is correctly folded into the instruction.12 13define i8 @stack_fold_addcarry_u32(i8 %a0, i32 %a1, i32 %a2, ptr %a3) {14; CHECK-LABEL: stack_fold_addcarry_u32:15; CHECK: # %bb.0:16; CHECK-NEXT: pushq %rbp17; CHECK-NEXT: .cfi_def_cfa_offset 1618; CHECK-NEXT: pushq %r1519; CHECK-NEXT: .cfi_def_cfa_offset 2420; CHECK-NEXT: pushq %r1421; CHECK-NEXT: .cfi_def_cfa_offset 3222; CHECK-NEXT: pushq %r1323; CHECK-NEXT: .cfi_def_cfa_offset 4024; CHECK-NEXT: pushq %r1225; CHECK-NEXT: .cfi_def_cfa_offset 4826; CHECK-NEXT: pushq %rbx27; CHECK-NEXT: .cfi_def_cfa_offset 5628; CHECK-NEXT: .cfi_offset %rbx, -5629; CHECK-NEXT: .cfi_offset %r12, -4830; CHECK-NEXT: .cfi_offset %r13, -4031; CHECK-NEXT: .cfi_offset %r14, -3232; CHECK-NEXT: .cfi_offset %r15, -2433; CHECK-NEXT: .cfi_offset %rbp, -1634; CHECK-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill35; CHECK-NEXT: movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill36; CHECK-NEXT: movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill37; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill38; CHECK-NEXT: #APP39; CHECK-NEXT: nop40; CHECK-NEXT: #NO_APP41; CHECK-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload42; CHECK-NEXT: addb $-1, %al43; CHECK-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %edx # 4-byte Reload44; CHECK-NEXT: adcl {{[-0-9]+}}(%r{{[sb]}}p), %edx # 4-byte Folded Reload45; CHECK-NEXT: setb %al46; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload47; CHECK-NEXT: movl %edx, (%rcx)48; CHECK-NEXT: popq %rbx49; CHECK-NEXT: .cfi_def_cfa_offset 4850; CHECK-NEXT: popq %r1251; CHECK-NEXT: .cfi_def_cfa_offset 4052; CHECK-NEXT: popq %r1353; CHECK-NEXT: .cfi_def_cfa_offset 3254; CHECK-NEXT: popq %r1455; CHECK-NEXT: .cfi_def_cfa_offset 2456; CHECK-NEXT: popq %r1557; CHECK-NEXT: .cfi_def_cfa_offset 1658; CHECK-NEXT: popq %rbp59; CHECK-NEXT: .cfi_def_cfa_offset 860; CHECK-NEXT: retq61 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()62 %2 = call { i8, i32 } @llvm.x86.addcarry.32(i8 %a0, i32 %a1, i32 %a2)63 %3 = extractvalue { i8, i32 } %2, 164 store i32 %3, ptr %a3, align 165 %4 = extractvalue { i8, i32 } %2, 066 ret i8 %467}68 69define i8 @stack_fold_addcarry_u64(i8 %a0, i64 %a1, i64 %a2, ptr %a3) {70; CHECK-LABEL: stack_fold_addcarry_u64:71; CHECK: # %bb.0:72; CHECK-NEXT: pushq %rbp73; CHECK-NEXT: .cfi_def_cfa_offset 1674; CHECK-NEXT: pushq %r1575; CHECK-NEXT: .cfi_def_cfa_offset 2476; CHECK-NEXT: pushq %r1477; CHECK-NEXT: .cfi_def_cfa_offset 3278; CHECK-NEXT: pushq %r1379; CHECK-NEXT: .cfi_def_cfa_offset 4080; CHECK-NEXT: pushq %r1281; CHECK-NEXT: .cfi_def_cfa_offset 4882; CHECK-NEXT: pushq %rbx83; CHECK-NEXT: .cfi_def_cfa_offset 5684; CHECK-NEXT: .cfi_offset %rbx, -5685; CHECK-NEXT: .cfi_offset %r12, -4886; CHECK-NEXT: .cfi_offset %r13, -4087; CHECK-NEXT: .cfi_offset %r14, -3288; CHECK-NEXT: .cfi_offset %r15, -2489; CHECK-NEXT: .cfi_offset %rbp, -1690; CHECK-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill91; CHECK-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill92; CHECK-NEXT: movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill93; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill94; CHECK-NEXT: #APP95; CHECK-NEXT: nop96; CHECK-NEXT: #NO_APP97; CHECK-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload98; CHECK-NEXT: addb $-1, %al99; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload100; CHECK-NEXT: adcq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Folded Reload101; CHECK-NEXT: setb %al102; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload103; CHECK-NEXT: movq %rdx, (%rcx)104; CHECK-NEXT: popq %rbx105; CHECK-NEXT: .cfi_def_cfa_offset 48106; CHECK-NEXT: popq %r12107; CHECK-NEXT: .cfi_def_cfa_offset 40108; CHECK-NEXT: popq %r13109; CHECK-NEXT: .cfi_def_cfa_offset 32110; CHECK-NEXT: popq %r14111; CHECK-NEXT: .cfi_def_cfa_offset 24112; CHECK-NEXT: popq %r15113; CHECK-NEXT: .cfi_def_cfa_offset 16114; CHECK-NEXT: popq %rbp115; CHECK-NEXT: .cfi_def_cfa_offset 8116; CHECK-NEXT: retq117 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()118 %2 = call { i8, i64 } @llvm.x86.addcarry.64(i8 %a0, i64 %a1, i64 %a2)119 %3 = extractvalue { i8, i64 } %2, 1120 store i64 %3, ptr %a3, align 1121 %4 = extractvalue { i8, i64 } %2, 0122 ret i8 %4123}124 125define i8 @stack_fold_addcarryx_u32(i8 %a0, i32 %a1, i32 %a2, ptr %a3) {126; CHECK-LABEL: stack_fold_addcarryx_u32:127; CHECK: # %bb.0:128; CHECK-NEXT: pushq %rbp129; CHECK-NEXT: .cfi_def_cfa_offset 16130; CHECK-NEXT: pushq %r15131; CHECK-NEXT: .cfi_def_cfa_offset 24132; CHECK-NEXT: pushq %r14133; CHECK-NEXT: .cfi_def_cfa_offset 32134; CHECK-NEXT: pushq %r13135; CHECK-NEXT: .cfi_def_cfa_offset 40136; CHECK-NEXT: pushq %r12137; CHECK-NEXT: .cfi_def_cfa_offset 48138; CHECK-NEXT: pushq %rbx139; CHECK-NEXT: .cfi_def_cfa_offset 56140; CHECK-NEXT: .cfi_offset %rbx, -56141; CHECK-NEXT: .cfi_offset %r12, -48142; CHECK-NEXT: .cfi_offset %r13, -40143; CHECK-NEXT: .cfi_offset %r14, -32144; CHECK-NEXT: .cfi_offset %r15, -24145; CHECK-NEXT: .cfi_offset %rbp, -16146; CHECK-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill147; CHECK-NEXT: movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill148; CHECK-NEXT: movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill149; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill150; CHECK-NEXT: #APP151; CHECK-NEXT: nop152; CHECK-NEXT: #NO_APP153; CHECK-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload154; CHECK-NEXT: addb $-1, %al155; CHECK-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %edx # 4-byte Reload156; CHECK-NEXT: adcl {{[-0-9]+}}(%r{{[sb]}}p), %edx # 4-byte Folded Reload157; CHECK-NEXT: setb %al158; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload159; CHECK-NEXT: movl %edx, (%rcx)160; CHECK-NEXT: popq %rbx161; CHECK-NEXT: .cfi_def_cfa_offset 48162; CHECK-NEXT: popq %r12163; CHECK-NEXT: .cfi_def_cfa_offset 40164; CHECK-NEXT: popq %r13165; CHECK-NEXT: .cfi_def_cfa_offset 32166; CHECK-NEXT: popq %r14167; CHECK-NEXT: .cfi_def_cfa_offset 24168; CHECK-NEXT: popq %r15169; CHECK-NEXT: .cfi_def_cfa_offset 16170; CHECK-NEXT: popq %rbp171; CHECK-NEXT: .cfi_def_cfa_offset 8172; CHECK-NEXT: retq173 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()174 %2 = call { i8, i32 } @llvm.x86.addcarry.32(i8 %a0, i32 %a1, i32 %a2)175 %3 = extractvalue { i8, i32 } %2, 1176 store i32 %3, ptr %a3, align 1177 %4 = extractvalue { i8, i32 } %2, 0178 ret i8 %4179}180 181define i8 @stack_fold_addcarryx_u64(i8 %a0, i64 %a1, i64 %a2, ptr %a3) {182; CHECK-LABEL: stack_fold_addcarryx_u64:183; CHECK: # %bb.0:184; CHECK-NEXT: pushq %rbp185; CHECK-NEXT: .cfi_def_cfa_offset 16186; CHECK-NEXT: pushq %r15187; CHECK-NEXT: .cfi_def_cfa_offset 24188; CHECK-NEXT: pushq %r14189; CHECK-NEXT: .cfi_def_cfa_offset 32190; CHECK-NEXT: pushq %r13191; CHECK-NEXT: .cfi_def_cfa_offset 40192; CHECK-NEXT: pushq %r12193; CHECK-NEXT: .cfi_def_cfa_offset 48194; CHECK-NEXT: pushq %rbx195; CHECK-NEXT: .cfi_def_cfa_offset 56196; CHECK-NEXT: .cfi_offset %rbx, -56197; CHECK-NEXT: .cfi_offset %r12, -48198; CHECK-NEXT: .cfi_offset %r13, -40199; CHECK-NEXT: .cfi_offset %r14, -32200; CHECK-NEXT: .cfi_offset %r15, -24201; CHECK-NEXT: .cfi_offset %rbp, -16202; CHECK-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill203; CHECK-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill204; CHECK-NEXT: movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill205; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill206; CHECK-NEXT: #APP207; CHECK-NEXT: nop208; CHECK-NEXT: #NO_APP209; CHECK-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload210; CHECK-NEXT: addb $-1, %al211; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload212; CHECK-NEXT: adcq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Folded Reload213; CHECK-NEXT: setb %al214; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload215; CHECK-NEXT: movq %rdx, (%rcx)216; CHECK-NEXT: popq %rbx217; CHECK-NEXT: .cfi_def_cfa_offset 48218; CHECK-NEXT: popq %r12219; CHECK-NEXT: .cfi_def_cfa_offset 40220; CHECK-NEXT: popq %r13221; CHECK-NEXT: .cfi_def_cfa_offset 32222; CHECK-NEXT: popq %r14223; CHECK-NEXT: .cfi_def_cfa_offset 24224; CHECK-NEXT: popq %r15225; CHECK-NEXT: .cfi_def_cfa_offset 16226; CHECK-NEXT: popq %rbp227; CHECK-NEXT: .cfi_def_cfa_offset 8228; CHECK-NEXT: retq229 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()230 %2 = call { i8, i64 } @llvm.x86.addcarry.64(i8 %a0, i64 %a1, i64 %a2)231 %3 = extractvalue { i8, i64 } %2, 1232 store i64 %3, ptr %a3, align 1233 %4 = extractvalue { i8, i64 } %2, 0234 ret i8 %4235}236 237define i8 @stack_fold_subborrow_u32(i8 %a0, i32 %a1, i32 %a2, ptr %a3) {238; CHECK-LABEL: stack_fold_subborrow_u32:239; CHECK: # %bb.0:240; CHECK-NEXT: pushq %rbp241; CHECK-NEXT: .cfi_def_cfa_offset 16242; CHECK-NEXT: pushq %r15243; CHECK-NEXT: .cfi_def_cfa_offset 24244; CHECK-NEXT: pushq %r14245; CHECK-NEXT: .cfi_def_cfa_offset 32246; CHECK-NEXT: pushq %r13247; CHECK-NEXT: .cfi_def_cfa_offset 40248; CHECK-NEXT: pushq %r12249; CHECK-NEXT: .cfi_def_cfa_offset 48250; CHECK-NEXT: pushq %rbx251; CHECK-NEXT: .cfi_def_cfa_offset 56252; CHECK-NEXT: .cfi_offset %rbx, -56253; CHECK-NEXT: .cfi_offset %r12, -48254; CHECK-NEXT: .cfi_offset %r13, -40255; CHECK-NEXT: .cfi_offset %r14, -32256; CHECK-NEXT: .cfi_offset %r15, -24257; CHECK-NEXT: .cfi_offset %rbp, -16258; CHECK-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill259; CHECK-NEXT: movl %edx, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill260; CHECK-NEXT: movl %esi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill261; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill262; CHECK-NEXT: #APP263; CHECK-NEXT: nop264; CHECK-NEXT: #NO_APP265; CHECK-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload266; CHECK-NEXT: addb $-1, %al267; CHECK-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %edx # 4-byte Reload268; CHECK-NEXT: sbbl {{[-0-9]+}}(%r{{[sb]}}p), %edx # 4-byte Folded Reload269; CHECK-NEXT: setb %al270; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload271; CHECK-NEXT: movl %edx, (%rcx)272; CHECK-NEXT: popq %rbx273; CHECK-NEXT: .cfi_def_cfa_offset 48274; CHECK-NEXT: popq %r12275; CHECK-NEXT: .cfi_def_cfa_offset 40276; CHECK-NEXT: popq %r13277; CHECK-NEXT: .cfi_def_cfa_offset 32278; CHECK-NEXT: popq %r14279; CHECK-NEXT: .cfi_def_cfa_offset 24280; CHECK-NEXT: popq %r15281; CHECK-NEXT: .cfi_def_cfa_offset 16282; CHECK-NEXT: popq %rbp283; CHECK-NEXT: .cfi_def_cfa_offset 8284; CHECK-NEXT: retq285 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()286 %2 = call { i8, i32 } @llvm.x86.subborrow.32(i8 %a0, i32 %a1, i32 %a2)287 %3 = extractvalue { i8, i32 } %2, 1288 store i32 %3, ptr %a3, align 1289 %4 = extractvalue { i8, i32 } %2, 0290 ret i8 %4291}292 293define i8 @stack_fold_subborrow_u64(i8 %a0, i64 %a1, i64 %a2, ptr %a3) {294; CHECK-LABEL: stack_fold_subborrow_u64:295; CHECK: # %bb.0:296; CHECK-NEXT: pushq %rbp297; CHECK-NEXT: .cfi_def_cfa_offset 16298; CHECK-NEXT: pushq %r15299; CHECK-NEXT: .cfi_def_cfa_offset 24300; CHECK-NEXT: pushq %r14301; CHECK-NEXT: .cfi_def_cfa_offset 32302; CHECK-NEXT: pushq %r13303; CHECK-NEXT: .cfi_def_cfa_offset 40304; CHECK-NEXT: pushq %r12305; CHECK-NEXT: .cfi_def_cfa_offset 48306; CHECK-NEXT: pushq %rbx307; CHECK-NEXT: .cfi_def_cfa_offset 56308; CHECK-NEXT: .cfi_offset %rbx, -56309; CHECK-NEXT: .cfi_offset %r12, -48310; CHECK-NEXT: .cfi_offset %r13, -40311; CHECK-NEXT: .cfi_offset %r14, -32312; CHECK-NEXT: .cfi_offset %r15, -24313; CHECK-NEXT: .cfi_offset %rbp, -16314; CHECK-NEXT: movq %rcx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill315; CHECK-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill316; CHECK-NEXT: movq %rsi, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill317; CHECK-NEXT: movl %edi, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill318; CHECK-NEXT: #APP319; CHECK-NEXT: nop320; CHECK-NEXT: #NO_APP321; CHECK-NEXT: movl {{[-0-9]+}}(%r{{[sb]}}p), %eax # 4-byte Reload322; CHECK-NEXT: addb $-1, %al323; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Reload324; CHECK-NEXT: sbbq {{[-0-9]+}}(%r{{[sb]}}p), %rdx # 8-byte Folded Reload325; CHECK-NEXT: setb %al326; CHECK-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload327; CHECK-NEXT: movq %rdx, (%rcx)328; CHECK-NEXT: popq %rbx329; CHECK-NEXT: .cfi_def_cfa_offset 48330; CHECK-NEXT: popq %r12331; CHECK-NEXT: .cfi_def_cfa_offset 40332; CHECK-NEXT: popq %r13333; CHECK-NEXT: .cfi_def_cfa_offset 32334; CHECK-NEXT: popq %r14335; CHECK-NEXT: .cfi_def_cfa_offset 24336; CHECK-NEXT: popq %r15337; CHECK-NEXT: .cfi_def_cfa_offset 16338; CHECK-NEXT: popq %rbp339; CHECK-NEXT: .cfi_def_cfa_offset 8340; CHECK-NEXT: retq341 %1 = tail call i64 asm sideeffect "nop", "=x,~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{rbp},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()342 %2 = call { i8, i64 } @llvm.x86.subborrow.64(i8 %a0, i64 %a1, i64 %a2)343 %3 = extractvalue { i8, i64 } %2, 1344 store i64 %3, ptr %a3, align 1345 %4 = extractvalue { i8, i64 } %2, 0346 ret i8 %4347}348 349declare { i8, i32 } @llvm.x86.addcarry.32(i8, i32, i32)350declare { i8, i64 } @llvm.x86.addcarry.64(i8, i64, i64)351declare { i8, i32 } @llvm.x86.subborrow.32(i8, i32, i32)352declare { i8, i64 } @llvm.x86.subborrow.64(i8, i64, i64)353