@@ -122,13 +122,15 @@ type Liveness struct {
122
122
123
123
be []BlockEffects
124
124
125
- // stackMapIndex maps from safe points (i.e., CALLs) to their
126
- // index within the stack maps.
127
- stackMapIndex map [* ssa.Value ]int
128
-
129
125
// An array with a bit vector for each safe point tracking live variables.
126
+ // Indexed sequentially by safe points in Block and Value order.
130
127
livevars []bvec
131
128
129
+ // stackMapIndex maps from safe points (i.e., CALLs) to their
130
+ // index within stackMaps.
131
+ stackMapIndex map [* ssa.Value ]int
132
+ stackMaps []bvec
133
+
132
134
cache progeffectscache
133
135
}
134
136
@@ -766,7 +768,7 @@ func (lv *Liveness) clobber() {
766
768
for _ , n := range lv .vars {
767
769
varSize += n .Type .Size ()
768
770
}
769
- if len (lv .livevars ) > 1000 || varSize > 10000 {
771
+ if len (lv .stackMaps ) > 1000 || varSize > 10000 {
770
772
// Be careful to avoid doing too much work.
771
773
// Bail if >1000 safepoints or >10000 bytes of variables.
772
774
// Otherwise, giant functions make this experiment generate too much code.
@@ -810,7 +812,7 @@ func (lv *Liveness) clobber() {
810
812
b .Values = append (b .Values , oldSched [0 ])
811
813
oldSched = oldSched [1 :]
812
814
}
813
- clobber (lv , b , lv .livevars [0 ])
815
+ clobber (lv , b , lv .stackMaps [0 ])
814
816
}
815
817
816
818
// Copy values into schedule, adding clobbering around safepoints.
@@ -831,10 +833,10 @@ func (lv *Liveness) clobber() {
831
833
before = false
832
834
}
833
835
if before {
834
- clobber (lv , b , lv.livevars [lv.stackMapIndex [v ]])
836
+ clobber (lv , b , lv.stackMaps [lv.stackMapIndex [v ]])
835
837
}
836
838
b .Values = append (b .Values , v )
837
- clobber (lv , b , lv.livevars [lv.stackMapIndex [v ]])
839
+ clobber (lv , b , lv.stackMaps [lv.stackMapIndex [v ]])
838
840
}
839
841
}
840
842
}
@@ -980,7 +982,6 @@ func (lv *Liveness) compact() {
980
982
for i := range remap {
981
983
remap [i ] = - 1
982
984
}
983
- uniq := 0 // unique tables found so far
984
985
985
986
// Consider bit vectors in turn.
986
987
// If new, assign next number using uniq,
@@ -996,7 +997,7 @@ Outer:
996
997
if j < 0 {
997
998
break
998
999
}
999
- jlive := lv .livevars [j ]
1000
+ jlive := lv .stackMaps [j ]
1000
1001
if live .Eq (jlive ) {
1001
1002
remap [i ] = j
1002
1003
continue Outer
@@ -1008,29 +1009,24 @@ Outer:
1008
1009
}
1009
1010
}
1010
1011
1011
- table [h ] = uniq
1012
- remap [i ] = uniq
1013
- lv .livevars [uniq ] = live
1014
- uniq ++
1012
+ table [h ] = len (lv .stackMaps )
1013
+ remap [i ] = len (lv .stackMaps )
1014
+ lv .stackMaps = append (lv .stackMaps , live )
1015
1015
}
1016
1016
1017
- // We've already reordered lv.livevars[0:uniq]. Clear the
1018
- // pointers later in the array so they can be GC'd.
1019
- tail := lv .livevars [uniq :]
1020
- for i := range tail { // memclr loop pattern
1021
- tail [i ] = bvec {}
1022
- }
1023
- lv .livevars = lv .livevars [:uniq ]
1017
+ // Clear lv.livevars to allow GC of duplicate maps and to
1018
+ // prevent accidental use.
1019
+ lv .livevars = nil
1024
1020
1025
1021
// Record compacted stack map indexes for each value.
1026
1022
// These will later become PCDATA instructions.
1027
- lv .showlive (nil , lv .livevars [0 ])
1023
+ lv .showlive (nil , lv .stackMaps [0 ])
1028
1024
pos := 1
1029
1025
lv .stackMapIndex = make (map [* ssa.Value ]int )
1030
1026
for _ , b := range lv .f .Blocks {
1031
1027
for _ , v := range b .Values {
1032
1028
if issafepoint (v ) {
1033
- lv .showlive (v , lv.livevars [remap [pos ]])
1029
+ lv .showlive (v , lv.stackMaps [remap [pos ]])
1034
1030
lv .stackMapIndex [v ] = remap [pos ]
1035
1031
pos ++
1036
1032
}
@@ -1153,7 +1149,7 @@ func (lv *Liveness) printDebug() {
1153
1149
// program listing, with individual effects listed
1154
1150
1155
1151
if b == lv .f .Entry {
1156
- live := lv .livevars [pcdata ]
1152
+ live := lv .stackMaps [pcdata ]
1157
1153
fmt .Printf ("(%s) function entry\n " , linestr (lv .fn .Func .Nname .Pos ))
1158
1154
fmt .Printf ("\t live=" )
1159
1155
printed = false
@@ -1190,7 +1186,7 @@ func (lv *Liveness) printDebug() {
1190
1186
continue
1191
1187
}
1192
1188
1193
- live := lv .livevars [pcdata ]
1189
+ live := lv .stackMaps [pcdata ]
1194
1190
fmt .Printf ("\t live=" )
1195
1191
printed = false
1196
1192
for j , n := range lv .vars {
@@ -1228,14 +1224,14 @@ func (lv *Liveness) printDebug() {
1228
1224
// remaining bytes are the raw bitmaps.
1229
1225
func (lv * Liveness ) emit (argssym , livesym * obj.LSym ) {
1230
1226
args := bvalloc (lv .argWords ())
1231
- aoff := duint32 (argssym , 0 , uint32 (len (lv .livevars ))) // number of bitmaps
1232
- aoff = duint32 (argssym , aoff , uint32 (args .n )) // number of bits in each bitmap
1227
+ aoff := duint32 (argssym , 0 , uint32 (len (lv .stackMaps ))) // number of bitmaps
1228
+ aoff = duint32 (argssym , aoff , uint32 (args .n )) // number of bits in each bitmap
1233
1229
1234
1230
locals := bvalloc (lv .localWords ())
1235
- loff := duint32 (livesym , 0 , uint32 (len (lv .livevars ))) // number of bitmaps
1236
- loff = duint32 (livesym , loff , uint32 (locals .n )) // number of bits in each bitmap
1231
+ loff := duint32 (livesym , 0 , uint32 (len (lv .stackMaps ))) // number of bitmaps
1232
+ loff = duint32 (livesym , loff , uint32 (locals .n )) // number of bits in each bitmap
1237
1233
1238
- for _ , live := range lv .livevars {
1234
+ for _ , live := range lv .stackMaps {
1239
1235
args .Clear ()
1240
1236
locals .Clear ()
1241
1237
0 commit comments