private List<int> colorFunction(FunctionBlock<SparcInstruction> f) { var uncolorableRegs = new List<int>(); var dg = allDepGraphs[f]; var map = colorMapping[f.Name]; var stack = new Stack<NodeAndEdges>(numRegs); var notConstrained = Enumerable.Range(0, numRegs).Where(r => !isConstrained(r, dg[r])).ToList(); var constrained = Enumerable.Range(0, numRegs).Where(r => isConstrained(r, dg[r])).ToList(); var constrainedAndUncolorable = new List<int>(constrained); //Push all unconstrained nodes first foreach (var r in notConstrained) { var bits = dg[r]; stack.Push(new NodeAndEdges() { Reg = r, Edges = new BitArray(bits) }); removeEdges(dg, r, bits); } //Console.WriteLine("\t{0}:{1} reg constr", f.Name, constrained.Count); //While there still exists constrained registers while (constrained.Count != 0) { var constrainedNdx = constrained.MaxIndex(r => dg[r].NumberOfBitsSet()); var reg = constrained[constrainedNdx]; var bits = dg[reg]; stack.Push(new NodeAndEdges() { Reg = reg, Edges = new BitArray(bits) }); removeEdges(dg, reg, bits); constrained.Remove(reg); } while (stack.Count != 0) { var val = stack.Pop(); var bits = val.Edges; SparcRegister reg = getSparcRegister(val.Reg); if (reg == null) { var cans = new BitArray(candidateColors); for (int i = 0; i < bits.Length; i++) { if (bits[i]) cans[map[i].IntVal] = false; } reg = virtToSparc[cans.FirstTrueIndex()]; } if (reg == null) { break; } constrainedAndUncolorable.Remove(val.Reg); map[val.Reg] = reg; addEdges(dg, val.Reg, bits); } constrainedAndUncolorable.Sort((r1, r2) => compareConstrainedness(dg, r1, r2)); return constrainedAndUncolorable; }