VM Maker: VMMaker.oscog-eem.2006.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-eem.2006.mcz

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

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

Name: VMMaker.oscog-eem.2006
Author: eem
Time: 25 November 2016, 7:19:10.023637 pm
UUID: cad39d34-1c14-416f-aeae-5b9fc776a3fc
Ancestors: VMMaker.oscog-eem.2005

RegisterAllocatingCogit:
methodOrBlockNumTemps must not be reset to the actual value ignoring the initial pushNils.  Doing so wrecks spilling.

scanMethod must add an extra fixup for conditional branches since, if preceded by a special selector send, there may be two fixups created, one for each target, the target of the jump and the fall-through after the non-inlined send (see e.g. the two ensureFixupAt: sends in genBinaryInlineComparison:opFalse:destReg:).

This gets execution as far as the send of #<= in the loop in Interval>>#collect: which ends up passing nil as the second argument.  It maybe time to tackle inlining of special selector comparisons.

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

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>compileBlockFrameBuild: (in category 'compile abstract instructions') -----
  compileBlockFrameBuild: blockStart
  "Build a frame for a block activation.  See CoInterpreter class>>initializeFrameIndices.
  Override to push the register receiver and register arguments, if any, and to correctly
  initialize the explicitly nilled/pushed temp entries (they are /not/ of type constant nil)."
  super compileBlockFrameBuild: blockStart.
  methodOrBlockNumTemps := blockStart numArgs + blockStart numCopied + blockStart numInitialNils.
  self initSimStackForFramefulMethod: blockStart startpc.
  blockStart numInitialNils > 0 ifTrue:
  [blockStart numInitialNils > 1
  ifTrue:
  [self genMoveNilR: TempReg.
  1 to: blockStart numInitialNils do:
  [:ign| self PushR: TempReg]]
  ifFalse:
+ [self genPushConstant: objectMemory nilObject]]!
- [self genPushConstant: objectMemory nilObject].
- methodOrBlockNumTemps := blockStart numArgs + blockStart numCopied]!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>scanMethod (in category 'compile abstract instructions') -----
  scanMethod
  "Scan the method (and all embedded blocks) to determine
  - what the last bytecode is; extra bytes at the end of a method are used to encode things like source pointers or temp names
  - if the method needs a frame or not
  - what are the targets of any backward branches.
  - how many blocks it creates
  Answer the block count or on error a negative error code"
  | latestContinuation nExts descriptor pc numBlocks distance targetPC framelessStackDelta seenInstVarStore |
  <var: #descriptor type: #'BytecodeDescriptor *'>
  needsFrame := useTwoPaths := seenInstVarStore := false.
  LowcodeVM ifTrue: [ hasNativeFrame := false ].
  self maybeInitNumFixups.
  self maybeInitNumCounters.
  prevBCDescriptor := nil.
  NewspeakVM ifTrue:
  [numIRCs := 0].
  (primitiveIndex > 0
  and: [coInterpreter isQuickPrimitiveIndex: primitiveIndex]) ifTrue:
  [^0].
  pc := latestContinuation := initialPC.
  numBlocks := framelessStackDelta := nExts := extA := extB := 0.
  [pc <= endPC] whileTrue:
  [byte0 := (objectMemory fetchByte: pc ofObject: methodObj) + bytecodeSetOffset.
  descriptor := self generatorAt: byte0.
  descriptor isExtension ifTrue:
  [descriptor opcode = Nop ifTrue: "unknown bytecode tag; see Cogit class>>#generatorTableFrom:"
  [^EncounteredUnknownBytecode].
  self loadSubsequentBytesForDescriptor: descriptor at: pc.
  self perform: descriptor generator].
  (descriptor isReturn
   and: [pc >= latestContinuation]) ifTrue:
  [endPC := pc].
 
   needsFrame ifFalse:
  [(descriptor needsFrameFunction isNil
   or: [self perform: descriptor needsFrameFunction with: framelessStackDelta])
  ifTrue:
  ["With immutability we win simply by avoiding a frame build if the receiver is young and not immutable."
  self cppIf: IMMUTABILITY
  ifTrue: [descriptor is1ByteInstVarStore
  ifTrue: [useTwoPaths := true]
  ifFalse: [needsFrame := true. useTwoPaths := false]]
  ifFalse: [needsFrame := true. useTwoPaths := false]]
  ifFalse:
  [framelessStackDelta := framelessStackDelta + descriptor stackDelta.
  "Without immutability we win if there are two or more stores and the receiver is new."
  self cppIf: IMMUTABILITY
  ifTrue: []
  ifFalse:
  [descriptor is1ByteInstVarStore ifTrue:
  [seenInstVarStore
  ifTrue: [useTwoPaths := true]
  ifFalse: [seenInstVarStore := true]]]]].
 
  descriptor isBranch ifTrue:
  [distance := self spanFor: descriptor at: pc exts: nExts in: methodObj.
  targetPC := pc + descriptor numBytes + distance.
  (self isBackwardBranch: descriptor at: pc exts: nExts in: methodObj)
  ifTrue: [self initializeFixupAt: targetPC - initialPC]
  ifFalse:
  [latestContinuation := latestContinuation max: targetPC.
+ (descriptor isBranchTrue or: [descriptor isBranchFalse]) ifTrue:
+ [self maybeCountFixup].
  self maybeCountFixup.
  self maybeCountCounter]].
  descriptor isBlockCreation ifTrue:
  [numBlocks := numBlocks + 1.
  distance := self spanFor: descriptor at: pc exts: nExts in: methodObj.
  targetPC := pc + descriptor numBytes + distance.
  latestContinuation := latestContinuation max: targetPC.
  self maybeCountFixup].
 
  NewspeakVM ifTrue:
+ [descriptor hasIRC ifTrue: [numIRCs := numIRCs + 1]].
- [descriptor hasIRC ifTrue:
- [numIRCs := numIRCs + 1]].
  pc := pc + descriptor numBytes.
+ nExts := descriptor isExtension ifTrue: [nExts + 1] ifFalse: [extA := extB := 0].
- descriptor isExtension
- ifTrue: [nExts := nExts + 1]
- ifFalse: [nExts := extA := extB := 0].
  prevBCDescriptor := descriptor].
  ^numBlocks!