Esempio n. 1
0
  public void allocateRegisters(MethodReader method, Program program) {
    insertJointArgumentsCopies(program);
    insertPhiArgumentsCopies(program);
    InterferenceGraphBuilder interferenceBuilder = new InterferenceGraphBuilder();
    LivenessAnalyzer liveness = new LivenessAnalyzer();
    liveness.analyze(program);
    List<MutableGraphNode> interferenceGraph =
        interferenceBuilder.build(program, method.parameterCount(), liveness);
    DisjointSet congruenceClasses = buildPhiCongruenceClasses(program);
    joinClassNodes(interferenceGraph, congruenceClasses);
    removeRedundantCopies(program, interferenceGraph, congruenceClasses);
    int[] classArray = congruenceClasses.pack(program.variableCount());
    renameVariables(program, classArray);
    int[] colors = new int[program.variableCount()];
    Arrays.fill(colors, -1);
    for (int i = 0; i <= method.parameterCount(); ++i) {
      colors[i] = i;
    }
    renameInterferenceGraph(interferenceGraph, congruenceClasses, classArray);
    GraphColorer colorer = new GraphColorer();

    int maxClass = 0;
    for (int cls : classArray) {
      maxClass = Math.max(maxClass, cls + 1);
    }
    int[] categories = getVariableCategories(program, method.getReference());
    int[] classCategories = new int[maxClass];
    for (int i = 0; i < categories.length; ++i) {
      classCategories[classArray[i]] = categories[i];
    }
    colorer.colorize(interferenceGraph, colors, classCategories);
    for (int i = 0; i < colors.length; ++i) {
      program.variableAt(i).setRegister(colors[i]);
    }

    for (int i = 0; i < program.basicBlockCount(); ++i) {
      program.basicBlockAt(i).getPhis().clear();
      program.basicBlockAt(i).getTryCatchJoints().clear();
    }
  }