public override Access AllocLocal(bool escape) { if (escape) { Access ret = new InFrame(this, Offset); Offset -= WSize; return(ret); } else { return(new InReg()); } }
private void RewriteProgram(HashSet <Node> spilledNodes) { HashSet <Node> newTemps = new HashSet <Node>(); foreach (Node v in spilledNodes) { InFrame a = (InFrame)Frame.AllocLocal(true); foreach (BasicBlock b in Blocks) { for (int i = 0; i < b.List.Count; i++) { TExp inst = b.List[i]; if (inst.LivenessNode == null) { continue; } if (inst.LivenessNode.Use.Contains(v.Temp)) { Temp.Temp p = new Temp.Temp(); newTemps.Add(GetNodeByTemp(p)); GetNodeByTemp(p).IsNew = true; b.List.Insert(i, new Load(Frame.FP(), a.Offset, p)); b.List[++i].ReplaceUse(v.Temp, p); } if (inst.LivenessNode.Def.Contains(v.Temp)) { Temp.Temp p = new Temp.Temp(); newTemps.Add(GetNodeByTemp(p)); GetNodeByTemp(p).IsNew = true; b.List.Insert(i + 1, new Store(Frame.FP(), a.Offset, p)); b.List[i++].ReplaceDef(v.Temp, p); } } } } spilledNodes.Clear(); Initial = newTemps; Initial.UnionWith(ColoredNodes); Initial.UnionWith(CoalescedNodes); ColoredNodes.Clear(); CoalescedNodes.Clear(); }