private static void specialize(final BloatContext context) {

		final CallGraph cg = context.getCallGraph();

		final Set liveMethods = new TreeSet(new MemberRefComparator());
		liveMethods.addAll(cg.liveMethods());

		// Specialize all possible methods
		final InlineStats stats = context.getInlineStats();

		if (BloatBenchmark.statsFile != null) {
			Specialize.STATS = true;
			stats.setConfigName("BloatBenchmark");
		}

		if (BloatBenchmark.MORPH != -1) {
			Specialize.MAX_MORPH = BloatBenchmark.MORPH;
		}
		final Specialize spec = new Specialize(context);

		if (Specialize.STATS) {
			stats.noteLiveMethods(liveMethods.size());
			stats.noteLiveClasses(cg.liveClasses().size());
		}

		BloatBenchmark.tr("Specializing live methods");
		final Iterator iter = liveMethods.iterator();

		for (int count = 0; iter.hasNext(); count++) {
			try {
				final MethodEditor live = context.editMethod((MemberRef) iter
						.next());

				if (context.ignoreMethod(live.memberRef())) {
					// Don't display ignored methods, it's misleading.
					continue;
				}

				BloatBenchmark.tr("  " + count + ") "
						+ live.declaringClass().name() + "." + live.name()
						+ live.type());

				spec.specialize(live);

			} catch (final NoSuchMethodException ex2) {
				BloatBenchmark.err.println("** Could not find method "
						+ ex2.getMessage());
				System.exit(1);
			}
		}
	}