Skip to content

Commit a3d0f96

Browse files
committed
Add test in ossa for GlobalOpt
1 parent 048dc85 commit a3d0f96

File tree

1 file changed

+128
-0
lines changed

1 file changed

+128
-0
lines changed
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
// RUN: %target-sil-opt -enable-sil-verify-all %s -global-opt | %FileCheck %s
2+
sil_stage canonical
3+
4+
import Builtin
5+
import Swift
6+
import SwiftShims
7+
8+
public struct TStruct {
9+
let x: Int32
10+
init(x: Int32)
11+
}
12+
13+
let trivialglobal: TStruct
14+
15+
public class TClass {
16+
final let x: Int32
17+
init(x: Int32)
18+
deinit
19+
}
20+
21+
let nontrivialglobal: TClass
22+
23+
// CHECK-LABEL: sil_global hidden [let] @$trivialglobal : $TStruct = {
24+
// CHECK: [[CONST:%.*]] = integer_literal $Builtin.Int32, 10
25+
// CHECK: [[INT:%.*]] = struct $Int32 ([[CONST]] : $Builtin.Int32)
26+
// CHECK: %initval = struct $TStruct ([[INT]] : $Int32)
27+
sil_global private @globalinit_trivialglobal_token : $Builtin.Word
28+
29+
sil_global hidden [let] @$trivialglobal : $TStruct
30+
31+
sil_global private @globalinit_nontrivialglobal_token : $Builtin.Word
32+
33+
sil_global hidden [let] @$nontrivialglobal : $TClass
34+
35+
sil private [ossa] @globalinit_trivialglobal_func : $@convention(c) () -> () {
36+
bb0:
37+
alloc_global @$trivialglobal
38+
%1 = global_addr @$trivialglobal : $*TStruct
39+
%2 = integer_literal $Builtin.Int32, 10
40+
%3 = struct $Int32 (%2 : $Builtin.Int32)
41+
%4 = struct $TStruct (%3 : $Int32)
42+
store %4 to [trivial] %1 : $*TStruct
43+
%6 = tuple ()
44+
return %6 : $()
45+
}
46+
47+
// CHECK-LABEL: sil hidden [global_init] [ossa] @$trivialglobal_unsafemutableaddressor :
48+
// CHECK: [[GLOBL:%.*]] = global_addr @$trivialglobal : $*TStruct
49+
// CHECK: [[GLOBL_ADDR:%.*]] = address_to_pointer [[GLOBL]] : $*TStruct to $Builtin.RawPointer
50+
// CHECK: return [[GLOBL_ADDR]] : $Builtin.RawPointer
51+
// CHECK: } // end sil function '$trivialglobal_unsafemutableaddressor'
52+
sil hidden [global_init] [ossa] @$trivialglobal_unsafemutableaddressor : $@convention(thin) () -> Builtin.RawPointer {
53+
bb0:
54+
%0 = global_addr @globalinit_trivialglobal_token : $*Builtin.Word
55+
%1 = address_to_pointer %0 : $*Builtin.Word to $Builtin.RawPointer
56+
%2 = function_ref @globalinit_trivialglobal_func : $@convention(c) () -> ()
57+
%3 = builtin "once"(%1 : $Builtin.RawPointer, %2 : $@convention(c) () -> ()) : $()
58+
%4 = global_addr @$trivialglobal : $*TStruct
59+
%5 = address_to_pointer %4 : $*TStruct to $Builtin.RawPointer
60+
return %5 : $Builtin.RawPointer
61+
}
62+
63+
// CHECK-LABEL: sil hidden [noinline] [ossa] @$bartrivial :
64+
// CHECK: [[CONST:%.*]] = integer_literal $Builtin.Int32, 10
65+
// CHECK: [[INT:%.*]] = struct $Int32 ([[CONST]] : $Builtin.Int32)
66+
// CHECK: return [[INT]] : $Int32
67+
// CHECK-LABEL: } // end sil function '$bartrivial'
68+
sil hidden [noinline] [ossa] @$bartrivial : $@convention(thin) () -> Int32 {
69+
bb0:
70+
%0 = function_ref @$trivialglobal_unsafemutableaddressor : $@convention(thin) () -> Builtin.RawPointer
71+
%1 = apply %0() : $@convention(thin) () -> Builtin.RawPointer
72+
%2 = pointer_to_address %1 : $Builtin.RawPointer to [strict] $*TStruct
73+
%3 = struct_element_addr %2 : $*TStruct, #TStruct.x
74+
%4 = load [trivial] %3 : $*Int32
75+
return %4 : $Int32
76+
}
77+
78+
// CHECK-LABEL: sil private [ossa] @globalinit_nontrivialglobal_func :
79+
// CHECK: alloc_global @$nontrivialglobal
80+
// CHECK: [[GLOBL_ADDR:%.*]] = global_addr @$nontrivialglobal : $*TClass
81+
// CHECK: [[REF:%.*]] = alloc_ref $TClass
82+
// CHECK: store [[REF]] to [init] [[GLOBL_ADDR]] : $*TClass
83+
// CHECK: } // end sil function 'globalinit_nontrivialglobal_func'
84+
sil private [ossa] @globalinit_nontrivialglobal_func : $@convention(c) () -> () {
85+
bb0:
86+
alloc_global @$nontrivialglobal
87+
%1 = global_addr @$nontrivialglobal : $*TClass
88+
%2 = integer_literal $Builtin.Int32, 10
89+
%3 = struct $Int32 (%2 : $Builtin.Int32)
90+
%4 = alloc_ref $TClass
91+
%5 = begin_borrow %4 : $TClass
92+
%6 = ref_element_addr %5 : $TClass, #TClass.x
93+
store %3 to [trivial] %6 : $*Int32
94+
end_borrow %5 : $TClass
95+
store %4 to [init] %1 : $*TClass
96+
%10 = tuple ()
97+
return %10 : $()
98+
}
99+
100+
sil hidden [global_init] [ossa] @$nontrivialglobal_unsafemutableaccessor : $@convention(thin) () -> Builtin.RawPointer {
101+
bb0:
102+
%0 = global_addr @globalinit_nontrivialglobal_token : $*Builtin.Word
103+
%1 = address_to_pointer %0 : $*Builtin.Word to $Builtin.RawPointer
104+
%2 = function_ref @globalinit_nontrivialglobal_func : $@convention(c) () -> ()
105+
%3 = builtin "once"(%1 : $Builtin.RawPointer, %2 : $@convention(c) () -> ()) : $()
106+
%4 = global_addr @$nontrivialglobal : $*TClass
107+
%5 = address_to_pointer %4 : $*TClass to $Builtin.RawPointer
108+
return %5 : $Builtin.RawPointer
109+
}
110+
111+
// CHECK-LABEL: sil hidden [noinline] [ossa] @$barnontrivial :
112+
// CHECK: [[FUNC_REF:%.*]] = function_ref @$nontrivialglobal_unsafemutableaccessor :
113+
// CHECK: [[APPLY:%.*]] = apply [[FUNC_REF]]() :
114+
// CHECK-LABEL: } // end sil function '$barnontrivial'
115+
sil hidden [noinline] [ossa] @$barnontrivial : $@convention(thin) () -> Int32 {
116+
bb0:
117+
%0 = function_ref @$nontrivialglobal_unsafemutableaccessor : $@convention(thin) () -> Builtin.RawPointer
118+
%1 = apply %0() : $@convention(thin) () -> Builtin.RawPointer
119+
%2 = pointer_to_address %1 : $Builtin.RawPointer to [strict] $*TClass
120+
%3 = load [copy] %2 : $*TClass
121+
%3b = begin_borrow %3 : $TClass
122+
%4 = ref_element_addr %3b : $TClass, #TClass.x
123+
%5 = load [trivial] %4 : $*Int32
124+
end_borrow %3b : $TClass
125+
destroy_value %3 : $TClass
126+
return %5 : $Int32
127+
}
128+

0 commit comments

Comments
 (0)