brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · d1be4a5 Raw
201 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=x86_64-unknown-linux-gnu -verify-machineinstrs < %s | FileCheck %s -check-prefix=X643 4declare i256 @llvm.get.fpenv.i256()5declare void @llvm.set.fpenv.i256(i256 %fpenv)6declare void @llvm.reset.fpenv()7 8; Cannot fold get_fpenv+load+store because loaded value is used in9; more than one instruction.10define void @get_fpenv_02(ptr %ptr1, ptr %ptr2) #0 {11; X64-LABEL: get_fpenv_02:12; X64:       # %bb.0:13; X64-NEXT:    pushq %r1414; X64-NEXT:    pushq %rbx15; X64-NEXT:    subq $40, %rsp16; X64-NEXT:    movq %rsi, %rbx17; X64-NEXT:    movq %rdi, %r1418; X64-NEXT:    movq %rsp, %rdi19; X64-NEXT:    callq fegetenv@PLT20; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rax21; X64-NEXT:    movq (%rsp), %rcx22; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rdx23; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rsi24; X64-NEXT:    movq %rsi, 16(%r14)25; X64-NEXT:    movq %rcx, (%r14)26; X64-NEXT:    movq %rax, 24(%r14)27; X64-NEXT:    movq %rdx, 8(%r14)28; X64-NEXT:    movq %rsi, 16(%rbx)29; X64-NEXT:    movq %rcx, (%rbx)30; X64-NEXT:    movq %rax, 24(%rbx)31; X64-NEXT:    movq %rdx, 8(%rbx)32; X64-NEXT:    addq $40, %rsp33; X64-NEXT:    popq %rbx34; X64-NEXT:    popq %r1435; X64-NEXT:    retq36  %fpenv = call i256 @llvm.get.fpenv.i256()37  store i256 %fpenv, ptr %ptr138  store i256 %fpenv, ptr %ptr239  ret void40}41 42; Cannot fold get_fpenv+load+store because load and store have different type.43define void @get_fpenv_03(ptr %ptr) #0 {44; X64-LABEL: get_fpenv_03:45; X64:       # %bb.0:46; X64-NEXT:    pushq %rbx47; X64-NEXT:    subq $32, %rsp48; X64-NEXT:    movq %rdi, %rbx49; X64-NEXT:    movq %rsp, %rdi50; X64-NEXT:    callq fegetenv@PLT51; X64-NEXT:    movl (%rsp), %eax52; X64-NEXT:    movl %eax, (%rbx)53; X64-NEXT:    addq $32, %rsp54; X64-NEXT:    popq %rbx55; X64-NEXT:    retq56  %fpenv = call i256 @llvm.get.fpenv.i256()57  %part = trunc i256 %fpenv to i3258  store i32 %part, ptr %ptr59  ret void60}61 62; Cannot fold get_fpenv+load+store because loaded value is not63; immediately stored.64define void @get_fpenv_04(ptr %ptr) #0 {65; X64-LABEL: get_fpenv_04:66; X64:       # %bb.0:67; X64-NEXT:    pushq %rbx68; X64-NEXT:    subq $32, %rsp69; X64-NEXT:    movq %rdi, %rbx70; X64-NEXT:    movq %rsp, %rdi71; X64-NEXT:    callq fegetenv@PLT72; X64-NEXT:    movq (%rsp), %rax73; X64-NEXT:    andl $1, %eax74; X64-NEXT:    movq %rax, (%rbx)75; X64-NEXT:    movq $0, 24(%rbx)76; X64-NEXT:    movq $0, 8(%rbx)77; X64-NEXT:    movq $0, 16(%rbx)78; X64-NEXT:    addq $32, %rsp79; X64-NEXT:    popq %rbx80; X64-NEXT:    retq81  %fpenv = call i256 @llvm.get.fpenv.i256()82  %masked = and i256 %fpenv, 183  store i256 %masked, ptr %ptr84  ret void85}86 87; Cannot fold get_fpenv+load+store because there is a memory operation88; between load and store.89define void @get_fpenv_05(ptr %ptr1, ptr %ptr2) #0 {90; X64-LABEL: get_fpenv_05:91; X64:       # %bb.0:92; X64-NEXT:    pushq %r1493; X64-NEXT:    pushq %rbx94; X64-NEXT:    subq $40, %rsp95; X64-NEXT:    movq %rsi, %rbx96; X64-NEXT:    movq %rdi, %r1497; X64-NEXT:    movq %rsp, %rdi98; X64-NEXT:    callq fegetenv@PLT99; X64-NEXT:    movq (%rsp), %rax100; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rcx101; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rdx102; X64-NEXT:    movq {{[0-9]+}}(%rsp), %rsi103; X64-NEXT:    movl $0, (%r14)104; X64-NEXT:    movq %rsi, 24(%rbx)105; X64-NEXT:    movq %rdx, 16(%rbx)106; X64-NEXT:    movq %rcx, 8(%rbx)107; X64-NEXT:    movq %rax, (%rbx)108; X64-NEXT:    addq $40, %rsp109; X64-NEXT:    popq %rbx110; X64-NEXT:    popq %r14111; X64-NEXT:    retq112  %fpenv = call i256 @llvm.get.fpenv.i256()113  store i32 0, ptr %ptr1114  store i256 %fpenv, ptr %ptr2115  ret void116}117 118; Cannot fold load+save+set_fpenv because there is a memory operation119; between load and store.120define void @set_fpenv_02(ptr %ptr1, ptr %ptr2) #0 {121; X64-LABEL: set_fpenv_02:122; X64:       # %bb.0:123; X64-NEXT:    subq $40, %rsp124; X64-NEXT:    movq (%rdi), %rax125; X64-NEXT:    movq 8(%rdi), %rcx126; X64-NEXT:    movq 16(%rdi), %rdx127; X64-NEXT:    movq 24(%rdi), %rdi128; X64-NEXT:    movl $0, (%rsi)129; X64-NEXT:    movq %rdi, {{[0-9]+}}(%rsp)130; X64-NEXT:    movq %rdx, {{[0-9]+}}(%rsp)131; X64-NEXT:    movq %rcx, {{[0-9]+}}(%rsp)132; X64-NEXT:    movq %rax, (%rsp)133; X64-NEXT:    movq %rsp, %rdi134; X64-NEXT:    callq fesetenv@PLT135; X64-NEXT:    addq $40, %rsp136; X64-NEXT:    retq137  %fpenv = load i256, ptr %ptr1138  store i32 0, ptr %ptr2139  call void @llvm.set.fpenv.i256(i256 %fpenv)140  ret void141}142 143; Cannot fold load+save+set_fpenv because loaded value is used in144; more then one store.145define void @set_fpenv_03(ptr %ptr1, ptr %ptr2) #0 {146; X64-LABEL: set_fpenv_03:147; X64:       # %bb.0:148; X64-NEXT:    pushq %r15149; X64-NEXT:    pushq %r14150; X64-NEXT:    pushq %r13151; X64-NEXT:    pushq %r12152; X64-NEXT:    pushq %rbx153; X64-NEXT:    subq $32, %rsp154; X64-NEXT:    movq %rsi, %rbx155; X64-NEXT:    movq (%rdi), %r14156; X64-NEXT:    movq 8(%rdi), %r15157; X64-NEXT:    movq 16(%rdi), %r12158; X64-NEXT:    movq 24(%rdi), %r13159; X64-NEXT:    callq fesetenv@PLT160; X64-NEXT:    movq %r13, 24(%rbx)161; X64-NEXT:    movq %r12, 16(%rbx)162; X64-NEXT:    movq %r15, 8(%rbx)163; X64-NEXT:    movq %r14, (%rbx)164; X64-NEXT:    addq $32, %rsp165; X64-NEXT:    popq %rbx166; X64-NEXT:    popq %r12167; X64-NEXT:    popq %r13168; X64-NEXT:    popq %r14169; X64-NEXT:    popq %r15170; X64-NEXT:    retq171  %fpenv = load i256, ptr %ptr1172  call void @llvm.set.fpenv.i256(i256 %fpenv)173  store i256 %fpenv, ptr %ptr2174  ret void175}176 177; Cannot fold load+save+set_fpenv because loaded value is not178; immediately stored.179define void @set_fpenv_04(ptr %ptr) #0 {180; X64-LABEL: set_fpenv_04:181; X64:       # %bb.0:182; X64-NEXT:    subq $40, %rsp183; X64-NEXT:    movq (%rdi), %rax184; X64-NEXT:    andl $1, %eax185; X64-NEXT:    movq %rax, (%rsp)186; X64-NEXT:    movq $0, {{[0-9]+}}(%rsp)187; X64-NEXT:    movq $0, {{[0-9]+}}(%rsp)188; X64-NEXT:    movq $0, {{[0-9]+}}(%rsp)189; X64-NEXT:    movq %rsp, %rdi190; X64-NEXT:    callq fesetenv@PLT191; X64-NEXT:    addq $40, %rsp192; X64-NEXT:    retq193  %fpenv = load i256, ptr %ptr194  %masked = and i256 %fpenv, 1195  call void @llvm.set.fpenv.i256(i256 %masked)196  ret void197}198 199 200attributes #0 = { nounwind "use-soft-float"="true" }201