[Vm-dev] VM Maker: VMMaker.oscog-cb.1188.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Apr 13 22:33:27 UTC 2015
ClementBera uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-cb.1188.mcz
==================== Summary ====================
Name: VMMaker.oscog-cb.1188
Author: cb
Time: 13 April 2015, 3:31:45.334 pm
UUID: cd69e2b4-f2bc-45f3-8183-3dfd01738742
Ancestors: VMMaker.oscog-eem.1187
fix a bug where sometimes register allocation was marking ReceiverResultReg as dead whereas it was still alive.
=============== Diff against VMMaker.oscog-eem.1187 ===============
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateOneRegister (in category 'simulation stack') -----
allocateOneRegister
- | rTop |
-
self ssTop type = SSRegister ifTrue: [ ^ self ssTop register].
+ ^ self allocateRegisterNotConflictingWith: 0
- rTop := self allocateRegisterNotConflictingWith: 0.
-
- rTop = ReceiverResultReg ifTrue:
- [ optStatus isReceiverResultRegLive: false ].
-
- ^ rTop
-
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateRegisterNotConflictingWith: (in category 'simulation stack') -----
allocateRegisterNotConflictingWith: registerMask
| reg |
"if there's a free register, use it"
reg := backEnd availableRegisterOrNilFor: (self liveRegisters bitOr: registerMask).
+ reg ifNil: "No free register, choose one that does not conflict with registerMask"
+ [reg := self freeRegisterNotConflictingWith: registerMask].
+ reg = ReceiverResultReg ifTrue: "If we've allocated RcvrResultReg, it's not live anymore"
+ [ optStatus isReceiverResultRegLive: false ].
+ ^ reg!
- reg ifNotNil: [^ reg].
- "No free register, choose one that does not conflict with registerMask"
- ^ self freeRegisterNotConflictingWith: registerMask!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateThreeRegistersInto:thirdIsReceiver: (in category 'simulation stack') -----
allocateThreeRegistersInto: trinaryBlock thirdIsReceiver: thirdIsReceiver
+ | topRegistersMask rTop rNext rThird |
- | topRegistersMask rTop rNext rThird needsThirdRegUpdate |
topRegistersMask := 0.
- needsThirdRegUpdate := true.
(self ssTop type = SSRegister and: [ thirdIsReceiver not or: [ self ssTop register ~= ReceiverResultReg ] ]) ifTrue:
[ topRegistersMask := self registerMaskFor: (rTop := self ssTop register)].
((self ssValue: 1) type = SSRegister and: [ thirdIsReceiver not or: [ (self ssValue: 1) register ~= ReceiverResultReg ] ]) ifTrue:
[ topRegistersMask := topRegistersMask bitOr: (self registerMaskFor: (rNext := (self ssValue: 1) register))].
((self ssValue: 2) type = SSRegister and: [thirdIsReceiver not or: [ (self ssValue: 2) register = ReceiverResultReg ] ]) ifTrue:
+ [ topRegistersMask := topRegistersMask bitOr: (self registerMaskFor: (rThird := (self ssValue: 2) register))].
- [ needsThirdRegUpdate := false.
- topRegistersMask := topRegistersMask bitOr: (self registerMaskFor: (rThird := (self ssValue: 2) register))].
rThird ifNil:
[ thirdIsReceiver
+ ifTrue:
+ [ rThird := ReceiverResultReg. "Free ReceiverResultReg if it was not free"
- ifTrue: "Is ReceiverResultReg free ?"
- [ rThird := ReceiverResultReg.
(self register: ReceiverResultReg isInMask: self liveRegisters) ifTrue:
+ [ self ssAllocateRequiredReg: ReceiverResultReg ].
+ optStatus isReceiverResultRegLive: false ]
- [ self ssAllocateRequiredReg: ReceiverResultReg ] ]
ifFalse: [ rThird := self allocateRegisterNotConflictingWith: topRegistersMask ].
topRegistersMask := topRegistersMask bitOr: (self registerMaskFor: rThird) ].
rTop ifNil: [
rTop := self allocateRegisterNotConflictingWith: topRegistersMask.
topRegistersMask := topRegistersMask bitOr: (self registerMaskFor: rTop) ].
rNext ifNil: [ rNext := self allocateRegisterNotConflictingWith: topRegistersMask ].
- (rTop = ReceiverResultReg or: [rNext = ReceiverResultReg or: [rThird = ReceiverResultReg and: [ needsThirdRegUpdate ]]]) ifTrue:
- [ optStatus isReceiverResultRegLive: false ].
-
^ trinaryBlock value: rTop value: rNext value: rThird
!
Item was changed:
----- Method: StackToRegisterMappingCogit>>allocateTwoRegistersInto: (in category 'simulation stack') -----
allocateTwoRegistersInto: binaryBlock
| topRegistersMask rTop rNext |
topRegistersMask := 0.
self ssTop type = SSRegister ifTrue:
[ topRegistersMask := self registerMaskFor: (rTop := self ssTop register)].
(self ssValue: 1) type = SSRegister ifTrue:
[ topRegistersMask := topRegistersMask bitOr: (self registerMaskFor: (rNext := (self ssValue: 1) register))].
rTop ifNil: [ rTop := self allocateRegisterNotConflictingWith: topRegistersMask ].
rNext ifNil: [ rNext := self allocateRegisterNotConflictingWith: (self registerMaskFor: rTop) ].
- (rTop = ReceiverResultReg or: [rNext = ReceiverResultReg]) ifTrue:
- [ optStatus isReceiverResultRegLive: false ].
-
^ binaryBlock value: rTop value: rNext
!
More information about the Vm-dev
mailing list