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

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

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

Name: VMMaker.oscog-eem.2529
Author: eem
Time: 13 March 2019, 11:54:28.516707 am
UUID: 0f0801c0-ef39-4573-ad13-b3e08bc86f12
Ancestors: VMMaker.oscog-eem.2528

Slang: Fix bug in dead-code elimination.  In checking whether a name is defined at compile-time or not we have to deal with both TDefineNode and TVarableNode, and so must use nameOrValue, not just value.  This affects finalizeReference: which was having variables used in a "cppIf: PharoVM ifTrue: ..." arm deleted since the code generator incorresctly assessed the arm as dead code.

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

Item was changed:
  ----- Method: CCodeGenerator>>nilOrBooleanConditionFor: (in category 'utilities') -----
  nilOrBooleanConditionFor: nodeOrNil
  "If nodeOrNil is one of the conditional sends for which we do translation-time dead code elimination
  (i.e. cppIf:ifTrue: et al or ifTrue: et al) and the conditional does evaluate to a translation-time
  boolean constant, answer that constant, otherwise answer nil.  Used to prune dead code,
  either for code generaton or dead variable elimination."
  generateDeadCode ifTrue: [^nil].
  nodeOrNil ifNil:
  nodeOrNil isSend ifFalse:
  (#(ifTrue: ifFalse: ifTrue:ifFalse: ifFalse:ifTrue:) includes: nodeOrNil selector) ifTrue:
  [^self nilOrBooleanConstantReceiverOf: nodeOrNil receiver].
  (#(and: or:) includes: nodeOrNil selector) ifTrue:
  [^self nilOrBooleanConstantReceiverOf: nodeOrNil].
  (#(cppIf:ifTrue: cppIf:ifTrue:ifFalse:) includes: nodeOrNil selector) ifTrue:
+ [| maybeName |
+ maybeName := nodeOrNil args first isConstant ifTrue:
+ [nodeOrNil args first nameOrValue].
+ (vmClass notNil
- [(vmClass notNil
  and: [nodeOrNil args first isConstant
+ and: [maybeName isSymbol
+ and: [(vmClass defineAtCompileTime: maybeName) not
+ and: [(vmClass bindingOf: maybeName) notNil]]]]) ifTrue:
- and: [nodeOrNil args first value isSymbol
- and: [((vmClass ifNil: [VMBasicConstants]) defineAtCompileTime: nodeOrNil args first value) not
- and: [(vmClass bindingOf: nodeOrNil args first value) notNil]]]]) ifTrue:
  [self logger
  nextPutAll: 'Warning: cppIf: reference to ';
+ store: maybeName;
- store: nodeOrNil args first value;
  nextPutAll: ' when variable of same name exists.'; cr].
+ (optionsDictionary notNil
- ^(optionsDictionary notNil
    and: [nodeOrNil args first isConstant
+   and: [(#(true false) includes: (optionsDictionary at: maybeName ifAbsent: [nil]))
+   and: [((vmClass ifNil: [VMBasicConstants]) defineAtCompileTime: maybeName) not]]]) ifTrue:
+ [^optionsDictionary at: maybeName]].
-   and: [#(true false) includes: (optionsDictionary at: nodeOrNil args first name ifAbsent: [nil])]]) ifTrue:
- [optionsDictionary at: nodeOrNil args first name]].

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveSmallFloatTruncated (in category 'arithmetic float primitives') -----
  <option: #Spur64BitMemoryManager>
  | rcvr trunc |
  <var: #rcvr type: #double>
  <var: #trunc type: #double>
  rcvr := objectMemory smallFloatValueOf: self stackTop.
  self cCode: [self mod: rcvr f: (self addressOf: trunc)]
  inSmalltalk: [trunc := rcvr truncated].
+ ((trunc between: objectMemory minSmallInteger asFloat and: objectMemory maxSmallInteger asFloat)
+ and: [objectMemory isIntegerValue: trunc asInteger])
- (trunc between: objectMemory minSmallInteger asFloat and: objectMemory maxSmallInteger asFloat)
  ifTrue: [self stackTopPut: (objectMemory integerObjectOf: trunc asInteger)]
  ifFalse: [self primitiveFail]!