brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.9 KiB · 5d8f256 Raw
245 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: -p --function-signature --check-globals2; RUN: opt -mtriple=wasm32-unknown-unknown -S --passes=expand-variadics --expand-variadics-override=optimize < %s | FileCheck %s --check-prefixes=OPT3; RUN: opt -mtriple=wasm32-unknown-unknown -S --passes=expand-variadics --expand-variadics-override=lowering < %s | FileCheck %s --check-prefixes=ABI4; REQUIRES: webassembly-registered-target5 6; Split variadic functions into two functions:7; - one equivalent to the original, same symbol etc8; - one implementing the contents of the original but taking a valist9; IR here is applicable to any target that uses a ptr for valist10;11; Defines a function with each linkage (in the order of the llvm documentation).12; If split applies it does the same transform to each.13; Whether split applies depends on whether the ABI is being changed or not - e.g. a weak14; function is not normally useful to split as the contents cannot be called from elsewhere.15; If the ABI is being rewritten then the function is still converted. Call sites tested elsewhere.16 17; Update test checks doesn't emit checks for declares18 19declare void @sink_valist(ptr)20declare void @llvm.va_start(ptr)21declare void @llvm.va_end(ptr)22 23declare void @decl_simple(...)24define void @defn_simple(...) !prof !0 {25; OPT-LABEL: define {{[^@]+}}@defn_simple(...) !prof !0 {26; OPT-NEXT:  entry:27; OPT-NEXT:    %va_start = alloca ptr, align 428; OPT-NEXT:    call void @llvm.lifetime.start.p0(ptr %va_start)29; OPT-NEXT:    call void @llvm.va_start.p0(ptr %va_start)30; OPT-NEXT:    %0 = load ptr, ptr %va_start, align 431; OPT-NEXT:    call void @defn_simple.valist(ptr %0)32; OPT-NEXT:    call void @llvm.lifetime.end.p0(ptr %va_start)33; OPT-NEXT:    ret void34;35; ABI-LABEL: define {{[^@]+}}@defn_simple(ptr %varargs) !prof !0 {36; ABI-NEXT:    %va = alloca ptr, align 437; ABI-NEXT:    store ptr %varargs, ptr %va, align 438; ABI-NEXT:    call void @sink_valist(ptr %va)39; ABI-NEXT:    ret void40;41  %va = alloca ptr, align 442  call void @llvm.va_start(ptr %va)43  call void @sink_valist(ptr %va)44  call void @llvm.va_end(ptr %va)45  ret void46}47 48; no declare for private49define private void @defn_private_simple(...) !prof !0 {50; OPT-LABEL: define {{[^@]+}}@defn_private_simple(...) !prof !0 {51; OPT-NEXT:  entry:52; OPT-NEXT:    %va_start = alloca ptr, align 453; OPT-NEXT:    call void @llvm.lifetime.start.p0(ptr %va_start)54; OPT-NEXT:    call void @llvm.va_start.p0(ptr %va_start)55; OPT-NEXT:    %0 = load ptr, ptr %va_start, align 456; OPT-NEXT:    call void @defn_private_simple.valist(ptr %0)57; OPT-NEXT:    call void @llvm.lifetime.end.p0(ptr %va_start)58; OPT-NEXT:    ret void59;60; ABI-LABEL: define {{[^@]+}}@defn_private_simple(ptr %varargs) !prof !0 {61; ABI-NEXT:    %va = alloca ptr, align 462; ABI-NEXT:    store ptr %varargs, ptr %va, align 463; ABI-NEXT:    call void @sink_valist(ptr %va)64; ABI-NEXT:    ret void65;66  %va = alloca ptr, align 467  call void @llvm.va_start(ptr %va)68  call void @sink_valist(ptr %va)69  call void @llvm.va_end(ptr %va)70  ret void71}72 73; no declare for internal74define internal void @defn_internal_simple(...) !prof !0 {75; OPT-LABEL: define {{[^@]+}}@defn_internal_simple(...) !prof !0 {76; OPT-NEXT:  entry:77; OPT-NEXT:    %va_start = alloca ptr, align 478; OPT-NEXT:    call void @llvm.lifetime.start.p0(ptr %va_start)79; OPT-NEXT:    call void @llvm.va_start.p0(ptr %va_start)80; OPT-NEXT:    %0 = load ptr, ptr %va_start, align 481; OPT-NEXT:    call void @defn_internal_simple.valist(ptr %0)82; OPT-NEXT:    call void @llvm.lifetime.end.p0(ptr %va_start)83; OPT-NEXT:    ret void84;85; ABI-LABEL: define {{[^@]+}}@defn_internal_simple(ptr %varargs) !prof !0 {86; ABI-NEXT:    %va = alloca ptr, align 487; ABI-NEXT:    store ptr %varargs, ptr %va, align 488; ABI-NEXT:    call void @sink_valist(ptr %va)89; ABI-NEXT:    ret void90;91  %va = alloca ptr, align 492  call void @llvm.va_start(ptr %va)93  call void @sink_valist(ptr %va)94  call void @llvm.va_end(ptr %va)95  ret void96}97 98; no declare for available_externally99define available_externally void @available_externally_simple(...) !prof !0 {100; OPT-LABEL: define {{[^@]+}}@available_externally_simple(...) !prof !0 {101; OPT-NEXT:    %va = alloca ptr, align 4102; OPT-NEXT:    call void @llvm.va_start.p0(ptr %va)103; OPT-NEXT:    call void @sink_valist(ptr %va)104; OPT-NEXT:    ret void105;106; ABI-LABEL: define {{[^@]+}}@available_externally_simple(ptr %varargs) !prof !0 {107; ABI-NEXT:    %va = alloca ptr, align 4108; ABI-NEXT:    store ptr %varargs, ptr %va, align 4109; ABI-NEXT:    call void @sink_valist(ptr %va)110; ABI-NEXT:    ret void111;112  %va = alloca ptr, align 4113  call void @llvm.va_start(ptr %va)114  call void @sink_valist(ptr %va)115  call void @llvm.va_end(ptr %va)116  ret void117}118 119; no declare for linkonce120define linkonce void @defn_linkonce_simple(...) !prof !0 {121; OPT-LABEL: define {{[^@]+}}@defn_linkonce_simple(...) !prof !0 {122; OPT-NEXT:    %va = alloca ptr, align 4123; OPT-NEXT:    call void @llvm.va_start.p0(ptr %va)124; OPT-NEXT:    call void @sink_valist(ptr %va)125; OPT-NEXT:    ret void126;127; ABI-LABEL: define {{[^@]+}}@defn_linkonce_simple(ptr %varargs) !prof !0 {128; ABI-NEXT:    %va = alloca ptr, align 4129; ABI-NEXT:    store ptr %varargs, ptr %va, align 4130; ABI-NEXT:    call void @sink_valist(ptr %va)131; ABI-NEXT:    ret void132;133  %va = alloca ptr, align 4134  call void @llvm.va_start(ptr %va)135  call void @sink_valist(ptr %va)136  call void @llvm.va_end(ptr %va)137  ret void138}139 140; no declare for weak141define weak void @defn_weak_simple(...) !prof !0 {142; OPT-LABEL: define {{[^@]+}}@defn_weak_simple(...) !prof !0 {143; OPT-NEXT:    %va = alloca ptr, align 4144; OPT-NEXT:    call void @llvm.va_start.p0(ptr %va)145; OPT-NEXT:    call void @sink_valist(ptr %va)146; OPT-NEXT:    ret void147;148; ABI-LABEL: define {{[^@]+}}@defn_weak_simple(ptr %varargs) !prof !0 {149; ABI-NEXT:    %va = alloca ptr, align 4150; ABI-NEXT:    store ptr %varargs, ptr %va, align 4151; ABI-NEXT:    call void @sink_valist(ptr %va)152; ABI-NEXT:    ret void153;154  %va = alloca ptr, align 4155  call void @llvm.va_start(ptr %va)156  call void @sink_valist(ptr %va)157  call void @llvm.va_end(ptr %va)158  ret void159}160 161; common is not applicable to functions162; appending is not applicable to functions163 164declare extern_weak void @decl_extern_weak_simple(...)165; no define for extern_weak166 167; no declare for linkonce_odr168define linkonce_odr void @defn_linkonce_odr_simple(...) !prof !0 {169; OPT-LABEL: define {{[^@]+}}@defn_linkonce_odr_simple(...) !prof !0 {170; OPT-NEXT:    %va = alloca ptr, align 4171; OPT-NEXT:    call void @llvm.va_start.p0(ptr %va)172; OPT-NEXT:    call void @sink_valist(ptr %va)173; OPT-NEXT:    ret void174;175; ABI-LABEL: define {{[^@]+}}@defn_linkonce_odr_simple(ptr %varargs) !prof !0 {176; ABI-NEXT:    %va = alloca ptr, align 4177; ABI-NEXT:    store ptr %varargs, ptr %va, align 4178; ABI-NEXT:    call void @sink_valist(ptr %va)179; ABI-NEXT:    ret void180;181  %va = alloca ptr, align 4182  call void @llvm.va_start(ptr %va)183  call void @sink_valist(ptr %va)184  call void @llvm.va_end(ptr %va)185  ret void186}187 188; no declare for weak_odr189define weak_odr void @defn_weak_odr_simple(...) !prof !0 {190; OPT-LABEL: define {{[^@]+}}@defn_weak_odr_simple(...) !prof !0 {191; OPT-NEXT:    %va = alloca ptr, align 4192; OPT-NEXT:    call void @llvm.va_start.p0(ptr %va)193; OPT-NEXT:    call void @sink_valist(ptr %va)194; OPT-NEXT:    ret void195;196; ABI-LABEL: define {{[^@]+}}@defn_weak_odr_simple(ptr %varargs) !prof !0 {197; ABI-NEXT:    %va = alloca ptr, align 4198; ABI-NEXT:    store ptr %varargs, ptr %va, align 4199; ABI-NEXT:    call void @sink_valist(ptr %va)200; ABI-NEXT:    ret void201;202  %va = alloca ptr, align 4203  call void @llvm.va_start(ptr %va)204  call void @sink_valist(ptr %va)205  call void @llvm.va_end(ptr %va)206  ret void207}208 209declare external void @decl_external_simple(...)210define external void @defn_external_simple(...) !prof !0 {211; OPT-LABEL: define {{[^@]+}}@defn_external_simple(...) !prof !0 {212; OPT-NEXT:  entry:213; OPT-NEXT:    %va_start = alloca ptr, align 4214; OPT-NEXT:    call void @llvm.lifetime.start.p0(ptr %va_start)215; OPT-NEXT:    call void @llvm.va_start.p0(ptr %va_start)216; OPT-NEXT:    %0 = load ptr, ptr %va_start, align 4217; OPT-NEXT:    call void @defn_external_simple.valist(ptr %0)218; OPT-NEXT:    call void @llvm.lifetime.end.p0(ptr %va_start)219; OPT-NEXT:    ret void220;221; ABI-LABEL: define {{[^@]+}}@defn_external_simple(ptr %varargs) !prof !0 {222; ABI-NEXT:    %va = alloca ptr, align 4223; ABI-NEXT:    store ptr %varargs, ptr %va, align 4224; ABI-NEXT:    call void @sink_valist(ptr %va)225; ABI-NEXT:    ret void226;227  %va = alloca ptr, align 4228  call void @llvm.va_start(ptr %va)229  call void @sink_valist(ptr %va)230  call void @llvm.va_end(ptr %va)231  ret void232}233 234!0 = !{!"function_entry_count", i64 1000}235;.236; OPT: attributes #0 = { nocallback nofree nosync nounwind willreturn }237; OPT: attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }238;.239; ABI: attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }240;.241; OPT: !0 = !{!"function_entry_count", i64 1000}242;.243; ABI: !0 = !{!"function_entry_count", i64 1000}244;.245