@@ -48,7 +48,7 @@ let initializeStaticGlobalsPass = FunctionPass(name: "initialize-static-globals"
48
48
return
49
49
}
50
50
51
- guard let ( allocInst, storeToGlobal) = function . getGlobalInitialization ( ) else {
51
+ guard let ( allocInst, storeToGlobal) = getGlobalInitialization ( of : function ) else {
52
52
return
53
53
}
54
54
@@ -62,69 +62,69 @@ let initializeStaticGlobalsPass = FunctionPass(name: "initialize-static-globals"
62
62
context. erase ( instruction: storeToGlobal)
63
63
}
64
64
65
- private extension Function {
66
- /// Analyses the global initializer function and returns the `alloc_global` and `store`
67
- /// instructions which initialize the global.
68
- ///
69
- /// The function's single basic block must contain following code pattern:
70
- /// ```
71
- /// alloc_global @the_global
72
- /// %a = global_addr @the_global
73
- /// %i = some_const_initializer_insts
74
- /// store %i to %a
75
- /// ```
76
- func getGlobalInitialization( ) -> ( allocInst: AllocGlobalInst , storeToGlobal: StoreInst ) ? {
65
+ /// Analyses the global initializer function and returns the `alloc_global` and `store`
66
+ /// instructions which initialize the global.
67
+ ///
68
+ /// The function's single basic block must contain following code pattern:
69
+ /// ```
70
+ /// alloc_global @the_global
71
+ /// %a = global_addr @the_global
72
+ /// %i = some_const_initializer_insts
73
+ /// store %i to %a
74
+ /// ```
75
+ private func getGlobalInitialization( of function: Function ) -> ( allocInst: AllocGlobalInst , storeToGlobal: StoreInst ) ? {
77
76
78
- guard let block = singleBlock else {
79
- return nil
80
- }
77
+ guard let block = function . singleBlock else {
78
+ return nil
79
+ }
81
80
82
- var allocInst : AllocGlobalInst ? = nil
83
- var globalAddr : GlobalAddrInst ? = nil
84
- var store : StoreInst ? = nil
81
+ var allocInst : AllocGlobalInst ? = nil
82
+ var globalAddr : GlobalAddrInst ? = nil
83
+ var store : StoreInst ? = nil
85
84
86
- for inst in block. instructions {
87
- switch inst {
88
- case is ReturnInst ,
89
- is DebugValueInst ,
90
- is DebugStepInst :
91
- break
92
- case let agi as AllocGlobalInst :
93
- if allocInst != nil {
94
- return nil
95
- }
96
- allocInst = agi
97
- case let ga as GlobalAddrInst :
98
- if globalAddr != nil {
99
- return nil
100
- }
101
- guard let agi = allocInst, agi. global == ga. global else {
102
- return nil
103
- }
104
- globalAddr = ga
105
- case let si as StoreInst :
106
- if store != nil {
107
- return nil
108
- }
109
- guard let ga = globalAddr else {
110
- return nil
111
- }
112
- if si. destination != ga {
113
- return nil
114
- }
115
- store = si
116
- default :
117
- if !inst. isValidInStaticInitializerOfGlobal {
118
- return nil
119
- }
85
+ for inst in block. instructions {
86
+ switch inst {
87
+ case is ReturnInst ,
88
+ is DebugValueInst ,
89
+ is DebugStepInst :
90
+ break
91
+ case let agi as AllocGlobalInst :
92
+ if allocInst != nil {
93
+ return nil
94
+ }
95
+ allocInst = agi
96
+ case let ga as GlobalAddrInst :
97
+ if globalAddr != nil {
98
+ return nil
99
+ }
100
+ guard let agi = allocInst, agi. global == ga. global else {
101
+ return nil
102
+ }
103
+ globalAddr = ga
104
+ case let si as StoreInst :
105
+ if store != nil {
106
+ return nil
107
+ }
108
+ guard let ga = globalAddr else {
109
+ return nil
110
+ }
111
+ if si. destination != ga {
112
+ return nil
113
+ }
114
+ store = si
115
+ default :
116
+ if !inst. isValidInStaticInitializerOfGlobal {
117
+ return nil
120
118
}
121
119
}
122
- if let store = store {
123
- return ( allocInst: allocInst!, storeToGlobal: store)
124
- }
125
- return nil
126
120
}
121
+ if let store = store {
122
+ return ( allocInst: allocInst!, storeToGlobal: store)
123
+ }
124
+ return nil
125
+ }
127
126
127
+ private extension Function {
128
128
var singleBlock : BasicBlock ? {
129
129
let block = entryBlock
130
130
if block. next != nil {
0 commit comments