[Vm-dev] VM Maker: VMMaker.oscog-eem.1623.mcz

commits at source.squeak.org commits at source.squeak.org
Sat Jan 9 06:58:13 UTC 2016


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1623.mcz

==================== Summary ====================

Name: VMMaker.oscog-eem.1623
Author: eem
Time: 8 January 2016, 10:56:32.739189 pm
UUID: 796c33c7-b025-4e0c-bd4e-1d3fa3d71f22
Ancestors: VMMaker.oscog-eem.1622

Fix a bug with out-of-place two-way become, which got the hash copy the wrong way round.  By default, the hash stays with the reference in two-way become.

Fix what appears to be a compiler bug with in-place two-way-become by treating the headers to be swapped so that remembered flags are swapped and hash bits are swapped if required.

=============== Diff against VMMaker.oscog-eem.1622 ===============

Item was removed:
- ----- Method: Spur64BitMemoryManager>>identityHashFullWordMask (in category 'header access') -----
- identityHashFullWordMask
- 	^16r3fffff00000000!

Item was added:
+ ----- Method: SpurMemoryManager>>cleverSwapHeaders:and:copyHashFlag: (in category 'become implementation') -----
+ cleverSwapHeaders: obj1 and: obj2 copyHashFlag: copyHashFlag
+ 	"swap headers, but swapping headers swaps remembered bits and hashes;
+ 	 remembered bits must be unswapped and hashes may be unswapped if
+ 	 copyHash is false."
+ 	"This variant doesn't tickle a compiler bug in gcc and clang.  See naiveSwapHeaders:and:copyHashFlag:"
+ 	<inline: true>
+ 	| header1 header2 remembered1 remembered2 |
+ 	header1 := self long64At: obj1.
+ 	header2 := self long64At: obj2.
+ 	remembered1 := header1 bitAnd: 1 << self rememberedBitShift.
+ 	remembered2 := header2 bitAnd: 1 << self rememberedBitShift.
+ 	remembered1 ~= remembered2 ifTrue:
+ 		[header1 := header1 - remembered1 + remembered2.
+ 		 header2 := header2 - remembered2 + remembered1].
+ 	"swapping headers swaps hash; if not copyHashFlag then unswap hash"
+ 	copyHashFlag ifFalse:
+ 		[| hash1 hash2 |
+ 		 hash1 := header1 bitAnd: self identityHashFullWordMask.
+ 		 hash2 := header2 bitAnd: self identityHashFullWordMask.
+ 		 hash1 ~= hash2 ifTrue:
+ 			[header1 := header1 - hash1 + hash2.
+ 			 header2 := header2 - hash2 + hash1]].
+ 	self long64At: obj1 put: header2.
+ 	self long64At: obj2 put: header1!

Item was added:
+ ----- Method: SpurMemoryManager>>identityHashFullWordMask (in category 'header access') -----
+ identityHashFullWordMask
+ 	^16r3fffff00000000!

Item was changed:
  ----- Method: SpurMemoryManager>>inPlaceBecome:and:copyHashFlag: (in category 'become implementation') -----
  inPlaceBecome: obj1 and: obj2 copyHashFlag: copyHashFlag
+ 	<inline: #never> "in an effort to fix a compiler bug with two-way become post r3427"
  	"Do become in place by swapping object contents."
+ 	| o1HasYoung o2HasYoung fmt |
- 	| headerTemp temp1 temp2 o1HasYoung o2HasYoung fmt |
  	self assert: (self numSlotsOf: obj1) = (self numSlotsOf: obj2).
  	self assert: ((self rawHashBitsOf: obj1) = 0
  				 or: [(self classOrNilAtIndex: (self rawHashBitsOf: obj1)) ~= obj1]).
  	self assert: ((self rawHashBitsOf: obj2) = 0
  				 or: [(self classOrNilAtIndex: (self rawHashBitsOf: obj2)) ~= obj2]).
+ 	"swap headers, but swapping headers swaps remembered bits and hashes;
+ 	 remembered bits must be unswapped and hashes may be unswapped if
+ 	 copyHash is false."
+ 	false
+ 		ifTrue: [self naiveSwapHeaders: obj1 and: obj2 copyHashFlag: copyHashFlag]
+ 		ifFalse: [self cleverSwapHeaders: obj1 and: obj2 copyHashFlag: copyHashFlag].
- 	"swap headers, but swapping headers swaps remembered bits;
- 	 these need to be unswapped."
- 	temp1 := self isRemembered: obj1.
- 	temp2 := self isRemembered: obj2.
- 	headerTemp := self long64At: obj1.
- 	self long64At: obj1 put: (self long64At: obj2).
- 	self long64At: obj2 put: headerTemp.
- 	self setIsRememberedOf: obj1 to: temp1.
- 	self setIsRememberedOf: obj2 to: temp2.
- 	"swapping headers swaps hash; if !!copyHashFlag undo hash copy"
- 	copyHashFlag ifFalse:
- 		[temp1 := self rawHashBitsOf: obj1.
- 		 self setHashBitsOf: obj1 to: (self rawHashBitsOf: obj2).
- 		 self setHashBitsOf: obj2 to: temp1].
  	o1HasYoung := o2HasYoung := false.
  	0 to: (self numSlotsOf: obj1) - 1 do:
+ 		[:i| | temp1 temp2 |
- 		[:i|
  		temp1 := self fetchPointer: i ofObject: obj1.
  		temp2 := self fetchPointer: i ofObject: obj2.
+ 		self storePointerUnchecked: i ofObject: obj1 withValue: temp2.
+ 		self storePointerUnchecked: i ofObject: obj2 withValue: temp1.
- 		self storePointerUnchecked: i
- 			ofObject: obj1
- 			withValue: temp2.
- 		self storePointerUnchecked: i
- 			ofObject: obj2
- 			withValue: temp1.
  		(self isYoung: temp2) ifTrue:
  			[o1HasYoung := true].
  		(self isYoung: temp1) ifTrue:
  			[o2HasYoung := true]].
+ 	(o1HasYoung and: [self isOldObject: obj1]) ifTrue:
- 	(self isOldObject: obj1) ifTrue:
  		[fmt := self formatOf: obj1.
+ 		 (self isPureBitsFormat: fmt) ifFalse:
- 		 (o1HasYoung and: [(self isPureBitsFormat: fmt) not]) ifTrue:
  			[self possibleRootStoreInto: obj1]].
+ 	(o2HasYoung and: [self isOldObject: obj2]) ifTrue:
- 	(self isOldObject: obj2) ifTrue:
  		[fmt := self formatOf: obj2.
+ 		 (self isPureBitsFormat: fmt) ifFalse:
- 		 (o2HasYoung and: [(self isPureBitsFormat: fmt) not]) ifTrue:
  			[self possibleRootStoreInto: obj2]]!

Item was added:
+ ----- Method: SpurMemoryManager>>naiveSwapHeaders:and:copyHashFlag: (in category 'become implementation') -----
+ naiveSwapHeaders: obj1 and: obj2 copyHashFlag: copyHashFlag
+ 	"swap headers, but swapping headers swaps remembered bits and hashes;
+ 	 remembered bits must be unswapped and hashes may be unswapped if
+ 	 copyHash is false."
+ 	"This variant tickles a compiler bug in gcc and clang. See cleverSwapHeaders:and:copyHashFlag:"
+ 	<inline: true>
+ 	| headerTemp remembered1 remembered2 hashTemp |
+ 	remembered1 := self isRemembered: obj1.
+ 	remembered2 := self isRemembered: obj2.
+ 	headerTemp := self long64At: obj1.
+ 	self long64At: obj1 put: (self long64At: obj2).
+ 	self long64At: obj2 put: headerTemp.
+ 	self setIsRememberedOf: obj1 to: remembered1.
+ 	self setIsRememberedOf: obj2 to: remembered2.
+ 	"swapping headers swaps hash; if !!copyHashFlag undo hash copy"
+ 	copyHashFlag ifFalse:
+ 		[hashTemp := self rawHashBitsOf: obj1.
+ 		 self setHashBitsOf: obj1 to: (self rawHashBitsOf: obj2).
+ 		 self setHashBitsOf: obj2 to: hashTemp]!

Item was changed:
  ----- Method: SpurMemoryManager>>outOfPlaceBecome:and:copyHashFlag: (in category 'become implementation') -----
  outOfPlaceBecome: obj1 and: obj2 copyHashFlag: copyHashFlag
+ 	<inline: #never> "in an effort to fix a compiler bug with two-way become post r3427"
  	"Allocate two new objects, n1 & n2.  Copy the contents appropriately. Convert
  	 obj1 and obj2 into forwarding objects pointing to n2 and n1 respectively"
  	| clone1 clone2 |
  	clone1 := (self isContextNonImm: obj1)
  				ifTrue: [coInterpreter cloneContext: obj1]
  				ifFalse: [self clone: obj1].
  	clone2 := (self isContextNonImm: obj2)
  				ifTrue: [coInterpreter cloneContext: obj2]
  				ifFalse: [self clone: obj2].
  	copyHashFlag
  		ifTrue:
- 			[self setHashBitsOf: clone1 to: (self rawHashBitsOf: obj2).
- 			 self setHashBitsOf: clone2 to: (self rawHashBitsOf: obj1)]
- 		ifFalse:
  			[self setHashBitsOf: clone1 to: (self rawHashBitsOf: obj1).
+ 			 self setHashBitsOf: clone2 to: (self rawHashBitsOf: obj2)]
+ 		ifFalse:
+ 			[self setHashBitsOf: clone1 to: (self rawHashBitsOf: obj2).
+ 			 self setHashBitsOf: clone2 to: (self rawHashBitsOf: obj1)].
- 			 self setHashBitsOf: clone2 to: (self rawHashBitsOf: obj2)].
  	self
  		forward: obj1 to: clone2;
  		forward: obj2 to: clone1.
  	((self isYoungObject: obj1) ~= (self isYoungObject: clone2)
  	 or: [(self isYoungObject: obj2) ~= (self isYoungObject: clone1)]) ifTrue:
  		[becomeEffectsFlags := becomeEffectsFlags bitOr: OldBecameNewFlag]!



More information about the Vm-dev mailing list