Eliot Miranda uploaded a new version of Compiler to project The Trunk:
http://source.squeak.org/trunk/Compiler-eem.317.mcz ==================== Summary ==================== Name: Compiler-eem.317 Author: eem Time: 21 November 2015, 3:20:26.817 pm UUID: 956bcba6-bf0a-463c-aaef-90903732fb85 Ancestors: Compiler-nice.316 Small improvement to compiler performance. There is no need to scan for an assignment to the limit in a to:[by:]do: when the to: argument is known to be an argument, because arguments are not written to. =============== Diff against Compiler-nice.316 =============== Item was changed: ----- Method: MessageNode>>transformToDo: (in category 'macro transformations') ----- transformToDo: encoder " var := rcvr. L1: [var <= arg1] Bfp(L2) [block body. var := var + inc] Jmp(L1) L2: " + | limit increment block initStmt test incStmt limitInit blockVar myRange blockRange | - | limit increment block initStmt test incStmt limitInit blockVar myRange blockRange limitIsAssignedTo | block := arguments last. "First check for valid arguments" (block notNil and: [block isBlockNode and: [block numberOfArguments = 1 and: [block firstArgument isVariableReference "As with debugger remote vars"]]]) ifFalse: [^false]. arguments size = 3 ifTrue: [increment := arguments at: 2. (increment isConstantNumber and: [increment literalValue ~= 0]) ifFalse: [^false]] ifFalse: [increment := encoder encodeLiteral: 1]. (limit := arguments at: 1) isVariableReference ifTrue: + [| shouldScanForAssignment | + shouldScanForAssignment := limit isArg not + or: [limit isBlockArg and: [Scanner allowBlockArgumentAssignment]]. + shouldScanForAssignment ifTrue: + [block nodesDo: + [:node| + (node isAssignmentNode and: [node variable = limit]) ifTrue: + [^false]]]]. - [limitIsAssignedTo := false. - block nodesDo: - [:node| - (node isAssignmentNode and: [node variable = limit]) ifTrue: - [limitIsAssignedTo := true]]. - limitIsAssignedTo ifTrue: - [^false]]. arguments size < 3 ifTrue: "transform to full form" [selector := SelectorNode new key: #to:by:do: code: #macro]. "Now generate auxiliary structures" myRange := encoder rawSourceRanges at: self ifAbsent: [1 to: 0]. blockRange := encoder rawSourceRanges at: block ifAbsent: [1 to: 0]. blockVar := block firstArgument. initStmt := AssignmentNode new variable: blockVar value: receiver. + (limit isVariableReference or: [limit isConstantNumber]) - limit isVariableReference | limit isConstantNumber ifTrue: [limitInit := nil] ifFalse: "Need to store limit in a var" [limit := encoder bindBlockArg: blockVar key, 'LimiT' within: block. limit scope: -2. "Already done parsing block; flag so it won't print" block addArgument: limit. limitInit := AssignmentNode new variable: limit value: arguments first]. test := MessageNode new receiver: blockVar selector: (increment key > 0 ifTrue: [#<=] ifFalse: [#>=]) arguments: {limit} precedence: precedence from: encoder sourceRange: (myRange first to: blockRange first). incStmt := AssignmentNode new variable: blockVar value: (MessageNode new receiver: blockVar selector: #+ arguments: {increment} precedence: precedence from: encoder sourceRange: (myRange last to: (myRange last max: blockRange last))) from: encoder sourceRange: (myRange last to: (myRange last max: blockRange last)). arguments := {limit. increment. block. initStmt. test. incStmt. limitInit}. block noteOptimizedIn: self. ^true! |
Free forum by Nabble | Edit this page |