v / vlib / v2 / ssa / fixed_array_zero_test.v
93 lines · 84 sloc · 2.35 KB · 81a5657604ec6da99c25e26546870c6888d6fdde
Raw
1module ssa
2
3import os
4import v2.parser
5import v2.pref as vpref
6import v2.token
7import v2.transformer
8import v2.types
9
10struct FixedArrayZeroStats {
11 instrs int
12 geps int
13 stores int
14}
15
16fn build_ssa_for_fixed_array_zero_test(code string, native_bulk_zero bool) &Module {
17 tmp_file := os.join_path(os.vtmp_dir(), 'v2_ssa_fixed_array_zero_${os.getpid()}.v')
18 os.write_file(tmp_file, code) or { panic('failed to write temp file') }
19 defer {
20 os.rm(tmp_file) or {}
21 }
22 mut prefs := &vpref.Preferences{
23 backend: .x64
24 no_parallel: true
25 }
26 mut file_set := token.FileSet.new()
27 mut par := parser.Parser.new(prefs)
28 files := par.parse_files([tmp_file], mut file_set)
29 mut env := types.Environment.new()
30 mut checker := types.Checker.new(prefs, file_set, env)
31 checker.check_files(files)
32 mut trans := transformer.Transformer.new_with_pref(env, prefs)
33 transformed := trans.transform_files(files)
34 mut ssa_mod := Module.new('fixed_array_zero')
35 mut b := Builder.new_with_env(ssa_mod, env)
36 b.native_backend_bulk_zero_alloca = native_bulk_zero
37 b.build_all(transformed)
38 return ssa_mod
39}
40
41fn fixed_array_zero_stats(len int, native_bulk_zero bool) FixedArrayZeroStats {
42 m := build_ssa_for_fixed_array_zero_test('
43module main
44
45fn main() {
46 a := [${len}]u8{}
47 _ = a
48}
49',
50 native_bulk_zero)
51 mut geps := 0
52 mut stores := 0
53 for instr in m.instrs {
54 if instr.op == .get_element_ptr {
55 geps++
56 } else if instr.op == .store {
57 stores++
58 }
59 }
60 return FixedArrayZeroStats{
61 instrs: m.instrs.len
62 geps: geps
63 stores: stores
64 }
65}
66
67fn test_empty_fixed_array_literal_emits_explicit_ssa_zero_stores() {
68 small := fixed_array_zero_stats(16, false)
69 large17 := fixed_array_zero_stats(17, false)
70 large64 := fixed_array_zero_stats(64, false)
71
72 assert small.geps >= 16
73 assert small.stores >= 16
74 assert large17.geps >= 17
75 assert large17.stores >= 17
76 assert large64.geps >= 64
77 assert large64.stores >= 64
78 assert large64.instrs > large17.instrs
79}
80
81fn test_native_bulk_zero_capable_backend_keeps_bounded_ssa_zero_stores() {
82 small := fixed_array_zero_stats(16, true)
83 large17 := fixed_array_zero_stats(17, true)
84 large64 := fixed_array_zero_stats(64, true)
85
86 assert small.geps >= 16
87 assert small.stores >= 16
88 assert large17.geps < small.geps
89 assert large17.stores < small.stores
90 assert large64.geps == large17.geps
91 assert large64.stores == large17.stores
92 assert large64.instrs <= large17.instrs + 4
93}
94