|  | @@ -10,7 +10,7 @@ fn: function (aNode){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  |  var $1,$2,$3,$4,$5,$6;
 | 
	
		
			
				|  |  |  var variable;
 | 
	
		
			
				|  |  | -$1=smalltalk.send(aNode,"_isValueNode",[]);
 | 
	
		
			
				|  |  | +$1=smalltalk.send(aNode,"_isImmutable",[]);
 | 
	
		
			
				|  |  |  if(smalltalk.assert($1)){
 | 
	
		
			
				|  |  |  $2=smalltalk.send(self,"_visit_",[aNode]);
 | 
	
		
			
				|  |  |  return $2;
 | 
	
	
		
			
				|  | @@ -28,8 +28,8 @@ smalltalk.send(smalltalk.send(smalltalk.send(self,"_method",[]),"_internalVariab
 | 
	
		
			
				|  |  |  return variable;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["aNode"],
 | 
	
		
			
				|  |  | -source: "alias: aNode\x0a\x09| variable |\x0a\x0a\x09aNode isValueNode ifTrue: [ ^ self visit: aNode ].\x0a\x0a\x09variable := IRVariable new \x0a\x09\x09variable: (AliasVar new name: '$', self nextAlias); \x0a\x09\x09yourself.\x0a\x0a\x09self sequence add: (IRAssignment new\x0a\x09\x09add: variable;\x0a\x09\x09add: (self visit: aNode);\x0a\x09\x09yourself).\x0a\x0a\x09self method internalVariables add: variable.\x0a\x0a\x09^ variable",
 | 
	
		
			
				|  |  | -messageSends: ["ifTrue:", "visit:", "isValueNode", "variable:", "name:", ",", "nextAlias", "new", "yourself", "add:", "sequence", "internalVariables", "method"],
 | 
	
		
			
				|  |  | +source: "alias: aNode\x0a\x09| variable |\x0a\x0a\x09aNode isImmutable ifTrue: [ ^ self visit: aNode ].\x0a\x0a\x09variable := IRVariable new \x0a\x09\x09variable: (AliasVar new name: '$', self nextAlias); \x0a\x09\x09yourself.\x0a\x0a\x09self sequence add: (IRAssignment new\x0a\x09\x09add: variable;\x0a\x09\x09add: (self visit: aNode);\x0a\x09\x09yourself).\x0a\x0a\x09self method internalVariables add: variable.\x0a\x0a\x09^ variable",
 | 
	
		
			
				|  |  | +messageSends: ["ifTrue:", "visit:", "isImmutable", "variable:", "name:", ",", "nextAlias", "new", "yourself", "add:", "sequence", "internalVariables", "method"],
 | 
	
		
			
				|  |  |  referencedClasses: ["AliasVar", "IRVariable", "IRAssignment"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRASTTranslator);
 | 
	
	
		
			
				|  | @@ -155,6 +155,45 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRASTTranslator);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +"_temporallyDependentList_",
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "temporallyDependentList:",
 | 
	
		
			
				|  |  | +category: 'visiting',
 | 
	
		
			
				|  |  | +fn: function (nodes){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +var $1,$3,$2;
 | 
	
		
			
				|  |  | +var threshold;
 | 
	
		
			
				|  |  | +var result;
 | 
	
		
			
				|  |  | +threshold=(0);
 | 
	
		
			
				|  |  | +smalltalk.send(nodes,"_withIndexDo_",[(function(each,i){
 | 
	
		
			
				|  |  | +$1=smalltalk.send(smalltalk.send(each,"_shouldBeInlined",[]),"_or_",[(function(){
 | 
	
		
			
				|  |  | +return smalltalk.send(each,"_shouldBeAliased",[]);
 | 
	
		
			
				|  |  | +})]);
 | 
	
		
			
				|  |  | +if(smalltalk.assert($1)){
 | 
	
		
			
				|  |  | +threshold=i;
 | 
	
		
			
				|  |  | +return threshold;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +})]);
 | 
	
		
			
				|  |  | +result=smalltalk.send((smalltalk.OrderedCollection || OrderedCollection),"_new",[]);
 | 
	
		
			
				|  |  | +smalltalk.send(nodes,"_withIndexDo_",[(function(each,i){
 | 
	
		
			
				|  |  | +$3=smalltalk.send(i,"__lt_eq",[threshold]);
 | 
	
		
			
				|  |  | +if(smalltalk.assert($3)){
 | 
	
		
			
				|  |  | +$2=smalltalk.send(self,"_alias_",[each]);
 | 
	
		
			
				|  |  | +} else {
 | 
	
		
			
				|  |  | +$2=smalltalk.send(self,"_visit_",[each]);
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +return smalltalk.send(result,"_add_",[$2]);
 | 
	
		
			
				|  |  | +})]);
 | 
	
		
			
				|  |  | +return result;
 | 
	
		
			
				|  |  | +},
 | 
	
		
			
				|  |  | +args: ["nodes"],
 | 
	
		
			
				|  |  | +source: "temporallyDependentList: nodes\x0a\x09| threshold result |\x0a    threshold := 0.\x0a    \x0a    nodes withIndexDo: [ :each :i |\x0a        (each shouldBeInlined or: [ each shouldBeAliased ])\x0a\x09\x09    ifTrue: [ threshold := i ]].\x0a\x0a\x09result := OrderedCollection new.\x0a\x09nodes withIndexDo: [ :each :i | \x0a\x09\x09result add: (i <= threshold\x0a\x09\x09\x09ifTrue: [ self alias: each ]\x0a\x09\x09\x09ifFalse: [ self visit: each ])].\x0a\x0a    ^result\x0a",
 | 
	
		
			
				|  |  | +messageSends: ["withIndexDo:", "ifTrue:", "or:", "shouldBeAliased", "shouldBeInlined", "new", "add:", "ifTrue:ifFalse:", "alias:", "visit:", "<="],
 | 
	
		
			
				|  |  | +referencedClasses: ["OrderedCollection"]
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +smalltalk.IRASTTranslator);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  "_theClass",
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
	
		
			
				|  | @@ -288,7 +327,7 @@ fn: function (aNode){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  |  var $1,$2;
 | 
	
		
			
				|  |  |  var alias;
 | 
	
		
			
				|  |  | -$1=smalltalk.send(smalltalk.send(aNode,"_receiver",[]),"_isValueNode",[]);
 | 
	
		
			
				|  |  | +$1=smalltalk.send(smalltalk.send(aNode,"_receiver",[]),"_isImmutable",[]);
 | 
	
		
			
				|  |  |  if(! smalltalk.assert($1)){
 | 
	
		
			
				|  |  |  alias=smalltalk.send(self,"_alias_",[smalltalk.send(aNode,"_receiver",[])]);
 | 
	
		
			
				|  |  |  alias;
 | 
	
	
		
			
				|  | @@ -303,8 +342,8 @@ $2=smalltalk.send(self,"_alias_",[smalltalk.send(smalltalk.send(aNode,"_nodes",[
 | 
	
		
			
				|  |  |  return $2;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["aNode"],
 | 
	
		
			
				|  |  | -source: "visitCascadeNode: aNode\x0a\x09| alias |\x0a\x0a\x09aNode receiver isValueNode ifFalse: [ \x0a\x09\x09alias := self alias: aNode receiver.\x0a\x09\x09aNode nodes do: [ :each |\x0a\x09\x09\x09each receiver: (VariableNode new binding: alias variable) ]].\x0a\x0a\x09aNode nodes allButLast do: [ :each |\x0a\x09\x09self sequence add: (self visit: each) ].\x0a\x0a\x09^ self alias: aNode nodes last",
 | 
	
		
			
				|  |  | -messageSends: ["ifFalse:", "alias:", "receiver", "do:", "receiver:", "binding:", "variable", "new", "nodes", "isValueNode", "add:", "visit:", "sequence", "allButLast", "last"],
 | 
	
		
			
				|  |  | +source: "visitCascadeNode: aNode\x0a\x09| alias |\x0a\x0a\x09aNode receiver isImmutable ifFalse: [ \x0a\x09\x09alias := self alias: aNode receiver.\x0a\x09\x09aNode nodes do: [ :each |\x0a\x09\x09\x09each receiver: (VariableNode new binding: alias variable) ]].\x0a\x0a\x09aNode nodes allButLast do: [ :each |\x0a\x09\x09self sequence add: (self visit: each) ].\x0a\x0a\x09^ self alias: aNode nodes last",
 | 
	
		
			
				|  |  | +messageSends: ["ifFalse:", "alias:", "receiver", "do:", "receiver:", "binding:", "variable", "new", "nodes", "isImmutable", "add:", "visit:", "sequence", "allButLast", "last"],
 | 
	
		
			
				|  |  |  referencedClasses: ["VariableNode"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRASTTranslator);
 | 
	
	
		
			
				|  | @@ -450,8 +489,9 @@ selector: "visitSendNode:",
 | 
	
		
			
				|  |  |  category: 'visiting',
 | 
	
		
			
				|  |  |  fn: function (aNode){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  | -var $1,$2,$3,$4;
 | 
	
		
			
				|  |  | +var $1,$2;
 | 
	
		
			
				|  |  |  var send;
 | 
	
		
			
				|  |  | +var all;
 | 
	
		
			
				|  |  |  var receiver;
 | 
	
		
			
				|  |  |  var arguments;
 | 
	
		
			
				|  |  |  send=smalltalk.send((smalltalk.IRSend || IRSend),"_new",[]);
 | 
	
	
		
			
				|  | @@ -461,22 +501,9 @@ $2=smalltalk.send(aNode,"_superSend",[]);
 | 
	
		
			
				|  |  |  if(smalltalk.assert($2)){
 | 
	
		
			
				|  |  |  smalltalk.send(send,"_classSend_",[smalltalk.send(smalltalk.send(self,"_theClass",[]),"_superclass",[])]);
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  | -$3=smalltalk.send(smalltalk.send(smalltalk.send(aNode,"_receiver",[]),"_shouldBeInlined",[]),"_or_",[(function(){
 | 
	
		
			
				|  |  | -return smalltalk.send(smalltalk.send(aNode,"_receiver",[]),"_shouldBeAliased",[]);
 | 
	
		
			
				|  |  | -})]);
 | 
	
		
			
				|  |  | -if(smalltalk.assert($3)){
 | 
	
		
			
				|  |  | -receiver=smalltalk.send(self,"_alias_",[smalltalk.send(aNode,"_receiver",[])]);
 | 
	
		
			
				|  |  | -} else {
 | 
	
		
			
				|  |  | -receiver=smalltalk.send(self,"_visit_",[smalltalk.send(aNode,"_receiver",[])]);
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | -arguments=smalltalk.send(smalltalk.send(aNode,"_arguments",[]),"_collect_",[(function(each){
 | 
	
		
			
				|  |  | -$4=smalltalk.send(each,"_shouldBeInlined",[]);
 | 
	
		
			
				|  |  | -if(smalltalk.assert($4)){
 | 
	
		
			
				|  |  | -return smalltalk.send(self,"_alias_",[each]);
 | 
	
		
			
				|  |  | -} else {
 | 
	
		
			
				|  |  | -return smalltalk.send(self,"_visit_",[each]);
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | -})]);
 | 
	
		
			
				|  |  | +all=smalltalk.send(self,"_temporallyDependentList_",[smalltalk.send([smalltalk.send(aNode,"_receiver",[])],"__comma",[smalltalk.send(aNode,"_arguments",[])])]);
 | 
	
		
			
				|  |  | +receiver=smalltalk.send(all,"_first",[]);
 | 
	
		
			
				|  |  | +arguments=smalltalk.send(all,"_allButFirst",[]);
 | 
	
		
			
				|  |  |  smalltalk.send(send,"_add_",[receiver]);
 | 
	
		
			
				|  |  |  smalltalk.send(arguments,"_do_",[(function(each){
 | 
	
		
			
				|  |  |  return smalltalk.send(send,"_add_",[each]);
 | 
	
	
		
			
				|  | @@ -484,8 +511,8 @@ return smalltalk.send(send,"_add_",[each]);
 | 
	
		
			
				|  |  |  return send;
 | 
	
		
			
				|  |  |  },
 | 
	
		
			
				|  |  |  args: ["aNode"],
 | 
	
		
			
				|  |  | -source: "visitSendNode: aNode\x0a\x09| send receiver arguments |\x0a\x09send := IRSend new.\x0a\x09send \x0a\x09\x09selector: aNode selector;\x0a\x09\x09index: aNode index.\x0a\x09aNode superSend ifTrue: [ send classSend: self theClass superclass ].\x0a\x0a\x09receiver := (aNode receiver shouldBeInlined or: [ aNode receiver shouldBeAliased ])\x0a\x09\x09ifTrue: [ self alias: aNode receiver ]\x0a\x09\x09ifFalse: [ self visit: aNode receiver ].\x0a\x0a\x09arguments := aNode arguments collect: [ :each | \x0a\x09\x09each shouldBeInlined\x0a\x09\x09\x09ifTrue: [ self alias: each ]\x0a\x09\x09\x09ifFalse: [ self visit: each ]].\x0a\x0a\x09send add: receiver.\x0a\x09arguments do: [ :each | send add: each ].\x0a\x0a\x09^ send",
 | 
	
		
			
				|  |  | -messageSends: ["new", "selector:", "selector", "index:", "index", "ifTrue:", "classSend:", "superclass", "theClass", "superSend", "ifTrue:ifFalse:", "alias:", "receiver", "visit:", "or:", "shouldBeAliased", "shouldBeInlined", "collect:", "arguments", "add:", "do:"],
 | 
	
		
			
				|  |  | +source: "visitSendNode: aNode\x0a\x09| send all receiver arguments |\x0a\x09send := IRSend new.\x0a\x09send \x0a\x09\x09selector: aNode selector;\x0a\x09\x09index: aNode index.\x0a\x09aNode superSend ifTrue: [ send classSend: self theClass superclass ].\x0a    \x0a    all := self temporallyDependentList: { aNode receiver }, aNode arguments.\x0a\x09receiver := all first.\x0a\x09arguments := all allButFirst.\x0a\x0a\x09send add: receiver.\x0a\x09arguments do: [ :each | send add: each ].\x0a\x0a\x09^ send\x0a",
 | 
	
		
			
				|  |  | +messageSends: ["new", "selector:", "selector", "index:", "index", "ifTrue:", "classSend:", "superclass", "theClass", "superSend", "temporallyDependentList:", ",", "arguments", "receiver", "first", "allButFirst", "add:", "do:"],
 | 
	
		
			
				|  |  |  referencedClasses: ["IRSend"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  smalltalk.IRASTTranslator);
 |