VM Maker: VMMaker.oscog-eem.2279.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.2279.mcz

Eliot Miranda uploaded a new version of VMMaker to project VM Maker:

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

Name: VMMaker.oscog-eem.2279
Author: eem
Time: 15 November 2017, 2:26:14.871383 pm
UUID: ec78abc1-3128-47b0-bff8-25bab14bae2d
Ancestors: VMMaker.oscog-eem.2278

VMMaker: Fix bad misinitialization bug where options from a previous translation were not clearedf out.  This caused the recent misgeneration of src/vm/cogit.c

Slang: Back out of the inlining optimization used in the logging methods that are now unused.  Better format a method.

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

Item was changed:
  ----- Method: BraceNode>>asTranslatorNodeIn: (in category '*VMMaker-C translation') -----
  asTranslatorNodeIn: aTMethod
  "make a CCodeGenerator equivalent of me."
  "This is for case statements"
+ (elements allSatisfy: [:elem| elem isMessageNode and: [elem selector key = #->]]) ifTrue:
- (elements allSatisfy:
- [:elem|
- elem isMessageNode
- and: [elem selector key = #->]]) ifTrue:
  [self assert: (elements allSatisfy:
  elem receiver isBlockNode
  and: [elem arguments first isBlockNode
  and: [elem receiver isPotentialCCaseLabelIn: aTMethod]]]).
  ^TBraceCaseNode new
  caseLabels: (elements collect: [:elem| elem receiver asTranslatorNodeIn: aTMethod]);
  cases: (elements collect: [:elem| elem arguments first asTranslatorNodeIn: aTMethod]);
  comment: comment].
  "This is for varargs selectors (variants of printf:)"
  ^elements collect: [:elem| elem asTranslatorNodeIn: aTMethod]!

Item was changed:
  ----- Method: TMethod>>inlineSend:directReturn:exitVar:in: (in category 'inlining') -----
  inlineSend: aSendNode directReturn: directReturn exitVar: exitVar in: aCodeGen
  "Answer a collection of statements to replace the given send.  directReturn indicates
  that the send is the expression in a return statement, so returns can be left in the
  body of the inlined method. If exitVar is nil, the value returned by the send is not
  used; thus, returns need not assign to the output variable.
  Types are propagated to as-yet-untyped variables when inlining a send that is assigned,
  otherwise the assignee variable type must match the return type of the inlinee.  Return
  types are not propagated."
+ | sel meth methArgs exitLabel inlineStmts label exitType elidedArgs |
- | sel meth methArgs exitLabel inlineStmts exitType elidedArgs argAssignments conditional |
  sel := aSendNode selector.
  meth := aCodeGen methodNamed: sel.
  methArgs := meth args.
  "convenient for debugging..."
  aCodeGen maybeBreakForInlineOf: aSendNode in: self.
  elidedArgs := #().
  (methArgs notEmpty and: [methArgs first beginsWith: 'self_in_'])
  ifTrue: "If the first arg is not used we can and should elide it."
  [| varNode |
  varNode := TVariableNode new setName: methArgs first.
  (meth parseTree noneSatisfy: [:node| varNode isSameAs: node]) ifTrue:
  [elidedArgs := {methArgs first}].
  methArgs := methArgs allButFirst].
  methArgs size = aSendNode args size ifFalse:
  meth := meth copy.
  (meth statements size > 1
  and: [meth statements first isSend
  and: [meth statements first selector == #flag:]]) ifTrue:
  [meth statements removeFirst].
  "Propagate the return type of an inlined method"
  (directReturn or: [exitVar notNil]) ifTrue:
  [exitType := directReturn
  ifTrue: [returnType]
  ifFalse: [(self typeFor: exitVar in: aCodeGen) ifNil: [#sqInt]].
  (exitType = #void or: [exitType = meth returnType]) ifFalse:
  [meth propagateReturnIn: aCodeGen]].
  "Propagate any unusual argument types to untyped argument variables"
  with: aSendNode args
  do: [:formal :actual|
  (meth declarationAt: formal ifAbsent: nil) ifNil:
  [(self typeFor: actual in: aCodeGen) ifNotNil:
  type ~= #sqInt ifTrue:
  [meth declarationAt: formal put: (type last = $* ifTrue: [type, formal] ifFalse: [type, ' ', formal])]]]].
  meth renameVarsForInliningInto: self except: elidedArgs in: aCodeGen.
  meth renameLabelsForInliningInto: self.
  self addVarsDeclarationsAndLabelsOf: meth except: elidedArgs.
  meth hasReturn ifTrue:
  [directReturn ifFalse:
  [exitLabel := self unusedLabelForInliningInto: self.
  (meth exitVar: exitVar label: exitLabel) "is label used?"
  ifTrue: [ labels add: exitLabel ]
  ifFalse: [ exitLabel := nil ]]].
  (inlineStmts := OrderedCollection new: meth statements size + meth args size + 2)
+ add: (label := TLabeledCommentNode new setComment: 'begin ', sel);
+ addAll: (self argAssignmentsFor: meth send: aSendNode except: elidedArgs in: aCodeGen);
+ addAll: meth statements.  "method body"
- add: (TLabeledCommentNode new setComment: 'begin ', sel).
- argAssignments := self argAssignmentsFor: meth send: aSendNode except: elidedArgs in: aCodeGen.
- "If the method being inlined is of the form
- guard ifTrue: [...]
- and the argument assignments have no side effects,
- and guard does not refer to the arguments,
- push the argument assignments past the guard into the block so that they too are guarded."
- (meth statements size = 1
- and: [(conditional := meth statements first) isConditionalSend
- and: [conditional numArgs = 1
- and: [(argAssignments noneSatisfy: [:assign| assign expression hasSideEffect])
- and: [conditional receiver noneSatisfy: [:node| node isVariable and: [methArgs includes: node name]]]]]])
- ifTrue: [conditional args first statements addAllFirst: argAssignments]
- ifFalse: [inlineStmts addAll: argAssignments].
- inlineStmts addAll: meth statements.  "method body"
  directReturn ifTrue:
  [meth endsWithReturn
  [exitVar ifNotNil: "don't remove the returns if being invoked in the context of a return"
  [inlineStmts at: inlineStmts size put: inlineStmts last copyWithoutReturn]]
  [inlineStmts add:
  (TReturnNode new setExpression: (TVariableNode new setName: 'nil'))]].
  exitLabel ifNotNil:
  [inlineStmts add:
  (TLabeledCommentNode new setLabel:
  exitLabel comment: 'end ', meth selector)].
  inlineStmts size = 1 ifTrue: "Nuke empty methods; e.g. override of flushAtCache"
  [self assert: inlineStmts first isComment.
  inlineStmts removeFirst].

Item was changed:
  ----- Method: VMMaker>>options: (in category 'initialize') -----
  options: anArrayOfPairs
+ optionsDictionary removeAll.
  self assert: anArrayOfPairs size even.
  1 to: anArrayOfPairs size by: 2 do:
  [:i| | key |
  key := anArrayOfPairs at: i.
  self assert: key isSymbol.
  optionsDictionary at: key put: (anArrayOfPairs at: i + 1)]!