src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceBuilderPhase.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceBuilderPhase.java

Print this page




  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package org.graalvm.compiler.lir.alloc.trace;
  24 
  25 import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.isTrivialTrace;
  26 
  27 import java.util.ArrayList;
  28 
  29 import org.graalvm.compiler.core.common.alloc.BiDirectionalTraceBuilder;
  30 import org.graalvm.compiler.core.common.alloc.SingleBlockTraceBuilder;
  31 import org.graalvm.compiler.core.common.alloc.Trace;
  32 import org.graalvm.compiler.core.common.alloc.TraceBuilderResult;
  33 import org.graalvm.compiler.core.common.alloc.TraceBuilderResult.TrivialTracePredicate;
  34 import org.graalvm.compiler.core.common.alloc.TraceStatisticsPrinter;
  35 import org.graalvm.compiler.core.common.alloc.UniDirectionalTraceBuilder;
  36 import org.graalvm.compiler.core.common.cfg.AbstractBlockBase;
  37 import org.graalvm.compiler.debug.Debug;
  38 import org.graalvm.compiler.debug.GraalError;
  39 import org.graalvm.compiler.lir.LIR;
  40 import org.graalvm.compiler.lir.gen.LIRGenerationResult;
  41 import org.graalvm.compiler.lir.phases.AllocationPhase;
  42 import org.graalvm.compiler.options.EnumOptionKey;
  43 import org.graalvm.compiler.options.Option;

  44 import org.graalvm.compiler.options.OptionType;
  45 import org.graalvm.compiler.options.OptionValues;
  46 import org.graalvm.compiler.options.OptionKey;
  47 
  48 import jdk.vm.ci.code.TargetDescription;
  49 
  50 public class TraceBuilderPhase extends AllocationPhase {
  51 
  52     public enum TraceBuilder {
  53         UniDirectional,
  54         BiDirectional,
  55         SingleBlock
  56     }
  57 
  58     public static class Options {
  59         // @formatter:off
  60         @Option(help = "Trace building algorithm.", type = OptionType.Debug)
  61         public static final EnumOptionKey<TraceBuilder> TraceBuilding = new EnumOptionKey<>(TraceBuilder.UniDirectional);
  62         @Option(help = "Schedule trivial traces as early as possible.", type = OptionType.Debug)
  63         public static final OptionKey<Boolean> TraceRAScheduleTrivialTracesEarly = new OptionKey<>(true);
  64         // @formatter:on
  65     }
  66 
  67     @Override
  68     protected void run(TargetDescription target, LIRGenerationResult lirGenRes, AllocationContext context) {
  69         AbstractBlockBase<?>[] linearScanOrder = lirGenRes.getLIR().linearScanOrder();
  70         AbstractBlockBase<?> startBlock = linearScanOrder[0];
  71         LIR lir = lirGenRes.getLIR();
  72         assert startBlock.equals(lir.getControlFlowGraph().getStartBlock());
  73 
  74         final TraceBuilderResult traceBuilderResult = getTraceBuilderResult(lir, startBlock, linearScanOrder);
  75 
  76         if (Debug.isLogEnabled(Debug.BASIC_LEVEL)) {

  77             ArrayList<Trace> traces = traceBuilderResult.getTraces();
  78             for (int i = 0; i < traces.size(); i++) {
  79                 Trace trace = traces.get(i);
  80                 Debug.log(Debug.BASIC_LEVEL, "Trace %5d: %s%s", i, trace, isTrivialTrace(lirGenRes.getLIR(), trace) ? " (trivial)" : "");
  81             }
  82         }
  83         TraceStatisticsPrinter.printTraceStatistics(traceBuilderResult, lirGenRes.getCompilationUnitName());
  84         Debug.dump(Debug.VERBOSE_LEVEL, traceBuilderResult, "TraceBuilderResult");
  85         context.contextAdd(traceBuilderResult);
  86     }
  87 
  88     private static TraceBuilderResult getTraceBuilderResult(LIR lir, AbstractBlockBase<?> startBlock, AbstractBlockBase<?>[] linearScanOrder) {
  89         TraceBuilderResult.TrivialTracePredicate pred = getTrivialTracePredicate(lir);
  90 
  91         OptionValues options = lir.getOptions();
  92         TraceBuilder selectedTraceBuilder = Options.TraceBuilding.getValue(options);
  93         Debug.log(Debug.BASIC_LEVEL, "Building Traces using %s", selectedTraceBuilder);

  94         switch (Options.TraceBuilding.getValue(options)) {
  95             case SingleBlock:
  96                 return SingleBlockTraceBuilder.computeTraces(startBlock, linearScanOrder, pred);
  97             case BiDirectional:
  98                 return BiDirectionalTraceBuilder.computeTraces(startBlock, linearScanOrder, pred);
  99             case UniDirectional:
 100                 return UniDirectionalTraceBuilder.computeTraces(startBlock, linearScanOrder, pred);
 101         }
 102         throw GraalError.shouldNotReachHere("Unknown trace building algorithm: " + Options.TraceBuilding.getValue(options));
 103     }
 104 
 105     public static TraceBuilderResult.TrivialTracePredicate getTrivialTracePredicate(LIR lir) {
 106         if (!Options.TraceRAScheduleTrivialTracesEarly.getValue(lir.getOptions())) {
 107             return null;
 108         }
 109         return new TrivialTracePredicate() {
 110             @Override
 111             public boolean isTrivialTrace(Trace trace) {
 112                 return TraceUtil.isTrivialTrace(lir, trace);
 113             }
 114         };
 115     }
 116 }


  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 package org.graalvm.compiler.lir.alloc.trace;
  24 
  25 import static org.graalvm.compiler.lir.alloc.trace.TraceUtil.isTrivialTrace;
  26 
  27 import java.util.ArrayList;
  28 
  29 import org.graalvm.compiler.core.common.alloc.BiDirectionalTraceBuilder;
  30 import org.graalvm.compiler.core.common.alloc.SingleBlockTraceBuilder;
  31 import org.graalvm.compiler.core.common.alloc.Trace;
  32 import org.graalvm.compiler.core.common.alloc.TraceBuilderResult;
  33 import org.graalvm.compiler.core.common.alloc.TraceBuilderResult.TrivialTracePredicate;
  34 import org.graalvm.compiler.core.common.alloc.TraceStatisticsPrinter;
  35 import org.graalvm.compiler.core.common.alloc.UniDirectionalTraceBuilder;
  36 import org.graalvm.compiler.core.common.cfg.AbstractBlockBase;
  37 import org.graalvm.compiler.debug.DebugContext;
  38 import org.graalvm.compiler.debug.GraalError;
  39 import org.graalvm.compiler.lir.LIR;
  40 import org.graalvm.compiler.lir.gen.LIRGenerationResult;
  41 import org.graalvm.compiler.lir.phases.AllocationPhase;
  42 import org.graalvm.compiler.options.EnumOptionKey;
  43 import org.graalvm.compiler.options.Option;
  44 import org.graalvm.compiler.options.OptionKey;
  45 import org.graalvm.compiler.options.OptionType;
  46 import org.graalvm.compiler.options.OptionValues;

  47 
  48 import jdk.vm.ci.code.TargetDescription;
  49 
  50 public class TraceBuilderPhase extends AllocationPhase {
  51 
  52     public enum TraceBuilder {
  53         UniDirectional,
  54         BiDirectional,
  55         SingleBlock
  56     }
  57 
  58     public static class Options {
  59         // @formatter:off
  60         @Option(help = "Trace building algorithm.", type = OptionType.Debug)
  61         public static final EnumOptionKey<TraceBuilder> TraceBuilding = new EnumOptionKey<>(TraceBuilder.UniDirectional);
  62         @Option(help = "Schedule trivial traces as early as possible.", type = OptionType.Debug)
  63         public static final OptionKey<Boolean> TraceRAScheduleTrivialTracesEarly = new OptionKey<>(true);
  64         // @formatter:on
  65     }
  66 
  67     @Override
  68     protected void run(TargetDescription target, LIRGenerationResult lirGenRes, AllocationContext context) {
  69         AbstractBlockBase<?>[] linearScanOrder = lirGenRes.getLIR().linearScanOrder();
  70         AbstractBlockBase<?> startBlock = linearScanOrder[0];
  71         LIR lir = lirGenRes.getLIR();
  72         assert startBlock.equals(lir.getControlFlowGraph().getStartBlock());
  73 
  74         final TraceBuilderResult traceBuilderResult = getTraceBuilderResult(lir, startBlock, linearScanOrder);
  75 
  76         DebugContext debug = lir.getDebug();
  77         if (debug.isLogEnabled(DebugContext.BASIC_LEVEL)) {
  78             ArrayList<Trace> traces = traceBuilderResult.getTraces();
  79             for (int i = 0; i < traces.size(); i++) {
  80                 Trace trace = traces.get(i);
  81                 debug.log(DebugContext.BASIC_LEVEL, "Trace %5d: %s%s", i, trace, isTrivialTrace(lirGenRes.getLIR(), trace) ? " (trivial)" : "");
  82             }
  83         }
  84         TraceStatisticsPrinter.printTraceStatistics(debug, traceBuilderResult, lirGenRes.getCompilationUnitName());
  85         debug.dump(DebugContext.VERBOSE_LEVEL, traceBuilderResult, "TraceBuilderResult");
  86         context.contextAdd(traceBuilderResult);
  87     }
  88 
  89     private static TraceBuilderResult getTraceBuilderResult(LIR lir, AbstractBlockBase<?> startBlock, AbstractBlockBase<?>[] linearScanOrder) {
  90         TraceBuilderResult.TrivialTracePredicate pred = getTrivialTracePredicate(lir);
  91 
  92         OptionValues options = lir.getOptions();
  93         TraceBuilder selectedTraceBuilder = Options.TraceBuilding.getValue(options);
  94         DebugContext debug = lir.getDebug();
  95         debug.log(DebugContext.BASIC_LEVEL, "Building Traces using %s", selectedTraceBuilder);
  96         switch (Options.TraceBuilding.getValue(options)) {
  97             case SingleBlock:
  98                 return SingleBlockTraceBuilder.computeTraces(debug, startBlock, linearScanOrder, pred);
  99             case BiDirectional:
 100                 return BiDirectionalTraceBuilder.computeTraces(debug, startBlock, linearScanOrder, pred);
 101             case UniDirectional:
 102                 return UniDirectionalTraceBuilder.computeTraces(debug, startBlock, linearScanOrder, pred);
 103         }
 104         throw GraalError.shouldNotReachHere("Unknown trace building algorithm: " + Options.TraceBuilding.getValue(options));
 105     }
 106 
 107     public static TraceBuilderResult.TrivialTracePredicate getTrivialTracePredicate(LIR lir) {
 108         if (!Options.TraceRAScheduleTrivialTracesEarly.getValue(lir.getOptions())) {
 109             return null;
 110         }
 111         return new TrivialTracePredicate() {
 112             @Override
 113             public boolean isTrivialTrace(Trace trace) {
 114                 return TraceUtil.isTrivialTrace(lir, trace);
 115             }
 116         };
 117     }
 118 }
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.lir/src/org/graalvm/compiler/lir/alloc/trace/TraceBuilderPhase.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File