brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.9 KiB · 83b33b9 Raw
154 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; 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; CHECK: @sink7declare void @sink(...)8 9 10define void @pass_byval(ptr byval(i32) %b) {11; OPT-LABEL: @pass_byval(12; OPT-NEXT:  entry:13; OPT-NEXT:    tail call void (...) @sink(ptr byval(i32) [[B:%.*]])14; OPT-NEXT:    ret void15;16; ABI-LABEL: @pass_byval(17; ABI-NEXT:  entry:18; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_BYVAL_VARARG:%.*]], align 1619; ABI-NEXT:    call void @llvm.lifetime.start.p0(ptr [[VARARG_BUFFER]])20; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_BYVAL_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 021; ABI-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[TMP0]], ptr [[B:%.*]], i64 4, i1 false)22; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])23; ABI-NEXT:    call void @llvm.lifetime.end.p0(ptr [[VARARG_BUFFER]])24; ABI-NEXT:    ret void25;26entry:27  tail call void (...) @sink(ptr byval(i32) %b)28  ret void29}30 31%struct.libcS = type { i8, i16, i32, i32, float, double }32 33define void @i32_libcS_byval(i32 %x, ptr noundef byval(%struct.libcS) align 8 %y) {34; OPT-LABEL: @i32_libcS_byval(35; OPT-NEXT:  entry:36; OPT-NEXT:    tail call void (...) @sink(i32 [[X:%.*]], ptr byval([[STRUCT_LIBCS:%.*]]) align 8 [[Y:%.*]])37; OPT-NEXT:    ret void38;39; ABI-LABEL: @i32_libcS_byval(40; ABI-NEXT:  entry:41; ABI-NEXT:    [[INDIRECTALLOCA:%.*]] = alloca [[STRUCT_LIBCS:%.*]], align 842; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[I32_LIBCS_BYVAL_VARARG:%.*]], align 1643; ABI-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[INDIRECTALLOCA]], ptr [[Y:%.*]], i64 24, i1 false)44; ABI-NEXT:    call void @llvm.lifetime.start.p0(ptr [[VARARG_BUFFER]])45; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[I32_LIBCS_BYVAL_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 046; ABI-NEXT:    store i32 [[X:%.*]], ptr [[TMP0]], align 447; ABI-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[I32_LIBCS_BYVAL_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 148; ABI-NEXT:    store ptr [[INDIRECTALLOCA]], ptr [[TMP1]], align 449; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])50; ABI-NEXT:    call void @llvm.lifetime.end.p0(ptr [[VARARG_BUFFER]])51; ABI-NEXT:    ret void52;53entry:54  tail call void (...) @sink(i32 %x, ptr byval(%struct.libcS) align 8 %y)55  ret void56}57 58define void @libcS_i32_byval(ptr byval(%struct.libcS) align 8 %x, i32 %y) {59; OPT-LABEL: @libcS_i32_byval(60; OPT-NEXT:  entry:61; OPT-NEXT:    tail call void (...) @sink(ptr byval([[STRUCT_LIBCS:%.*]]) align 8 [[X:%.*]], i32 [[Y:%.*]])62; OPT-NEXT:    ret void63;64; ABI-LABEL: @libcS_i32_byval(65; ABI-NEXT:  entry:66; ABI-NEXT:    [[INDIRECTALLOCA:%.*]] = alloca [[STRUCT_LIBCS:%.*]], align 867; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[LIBCS_I32_BYVAL_VARARG:%.*]], align 1668; ABI-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr [[INDIRECTALLOCA]], ptr [[X:%.*]], i64 24, i1 false)69; ABI-NEXT:    call void @llvm.lifetime.start.p0(ptr [[VARARG_BUFFER]])70; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[LIBCS_I32_BYVAL_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 071; ABI-NEXT:    store ptr [[INDIRECTALLOCA]], ptr [[TMP0]], align 472; ABI-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[LIBCS_I32_BYVAL_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 173; ABI-NEXT:    store i32 [[Y:%.*]], ptr [[TMP1]], align 474; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])75; ABI-NEXT:    call void @llvm.lifetime.end.p0(ptr [[VARARG_BUFFER]])76; ABI-NEXT:    ret void77;78entry:79  tail call void (...) @sink(ptr byval(%struct.libcS) align 8 %x, i32 %y)80  ret void81}82 83 84define void @pass_byref(ptr byref(i32) %b) {85; OPT-LABEL: @pass_byref(86; OPT-NEXT:  entry:87; OPT-NEXT:    tail call void (...) @sink(ptr byref(i32) [[B:%.*]])88; OPT-NEXT:    ret void89;90; ABI-LABEL: @pass_byref(91; ABI-NEXT:  entry:92; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[PASS_BYREF_VARARG:%.*]], align 1693; ABI-NEXT:    call void @llvm.lifetime.start.p0(ptr [[VARARG_BUFFER]])94; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[PASS_BYREF_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 095; ABI-NEXT:    store ptr [[B:%.*]], ptr [[TMP0]], align 496; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])97; ABI-NEXT:    call void @llvm.lifetime.end.p0(ptr [[VARARG_BUFFER]])98; ABI-NEXT:    ret void99;100entry:101  tail call void (...) @sink(ptr byref(i32) %b)102  ret void103}104 105define void @i32_libcS_byref(i32 %x, ptr noundef byref(%struct.libcS) align 8 %y) {106; OPT-LABEL: @i32_libcS_byref(107; OPT-NEXT:  entry:108; OPT-NEXT:    tail call void (...) @sink(i32 [[X:%.*]], ptr byref([[STRUCT_LIBCS:%.*]]) align 8 [[Y:%.*]])109; OPT-NEXT:    ret void110;111; ABI-LABEL: @i32_libcS_byref(112; ABI-NEXT:  entry:113; ABI-NEXT:    [[INDIRECTALLOCA:%.*]] = alloca [[STRUCT_LIBCS:%.*]], align 8114; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[I32_LIBCS_BYREF_VARARG:%.*]], align 16115; ABI-NEXT:    store ptr [[Y:%.*]], ptr [[INDIRECTALLOCA]], align 4116; ABI-NEXT:    call void @llvm.lifetime.start.p0(ptr [[VARARG_BUFFER]])117; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[I32_LIBCS_BYREF_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0118; ABI-NEXT:    store i32 [[X:%.*]], ptr [[TMP0]], align 4119; ABI-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[I32_LIBCS_BYREF_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1120; ABI-NEXT:    store ptr [[INDIRECTALLOCA]], ptr [[TMP1]], align 4121; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])122; ABI-NEXT:    call void @llvm.lifetime.end.p0(ptr [[VARARG_BUFFER]])123; ABI-NEXT:    ret void124;125entry:126  tail call void (...) @sink(i32 %x, ptr byref(%struct.libcS) align 8 %y)127  ret void128}129 130define void @libcS_i32_byref(ptr byref(%struct.libcS) align 8 %x, i32 %y) {131; OPT-LABEL: @libcS_i32_byref(132; OPT-NEXT:  entry:133; OPT-NEXT:    tail call void (...) @sink(ptr byref([[STRUCT_LIBCS:%.*]]) align 8 [[X:%.*]], i32 [[Y:%.*]])134; OPT-NEXT:    ret void135;136; ABI-LABEL: @libcS_i32_byref(137; ABI-NEXT:  entry:138; ABI-NEXT:    [[INDIRECTALLOCA:%.*]] = alloca [[STRUCT_LIBCS:%.*]], align 8139; ABI-NEXT:    [[VARARG_BUFFER:%.*]] = alloca [[LIBCS_I32_BYREF_VARARG:%.*]], align 16140; ABI-NEXT:    store ptr [[X:%.*]], ptr [[INDIRECTALLOCA]], align 4141; ABI-NEXT:    call void @llvm.lifetime.start.p0(ptr [[VARARG_BUFFER]])142; ABI-NEXT:    [[TMP0:%.*]] = getelementptr inbounds nuw [[LIBCS_I32_BYREF_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 0143; ABI-NEXT:    store ptr [[INDIRECTALLOCA]], ptr [[TMP0]], align 4144; ABI-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw [[LIBCS_I32_BYREF_VARARG]], ptr [[VARARG_BUFFER]], i32 0, i32 1145; ABI-NEXT:    store i32 [[Y:%.*]], ptr [[TMP1]], align 4146; ABI-NEXT:    call void @sink(ptr [[VARARG_BUFFER]])147; ABI-NEXT:    call void @llvm.lifetime.end.p0(ptr [[VARARG_BUFFER]])148; ABI-NEXT:    ret void149;150entry:151  tail call void (...) @sink(ptr byref(%struct.libcS) align 8 %x, i32 %y)152  ret void153}154