Mercurial > hg > graal-jvmci-8
changeset 20923:0e5a0403729c
lifted register allocation retry under RegisterPressure to GraalCompiler.emitLIR to account for a register allocator that modifies the LIR
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Tue, 14 Apr 2015 11:58:56 +0200 |
parents | 10766b486cbb |
children | 03520505cbf1 |
files | graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/LinearScanPhase.java |
diffstat | 2 files changed, 21 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Tue Apr 14 11:57:27 2015 +0200 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/GraalCompiler.java Tue Apr 14 11:58:56 2015 +0200 @@ -23,6 +23,8 @@ package com.oracle.graal.compiler; import static com.oracle.graal.compiler.GraalCompiler.Options.*; +import static com.oracle.graal.compiler.common.GraalOptions.*; +import static com.oracle.graal.compiler.common.alloc.RegisterAllocationConfig.*; import static com.oracle.graal.phases.common.DeadCodeEliminationPhase.Optionality.*; import java.util.*; @@ -38,6 +40,7 @@ import com.oracle.graal.debug.*; import com.oracle.graal.debug.Debug.Scope; import com.oracle.graal.lir.*; +import com.oracle.graal.lir.alloc.lsra.*; import com.oracle.graal.lir.asm.*; import com.oracle.graal.lir.framemap.*; import com.oracle.graal.lir.gen.*; @@ -49,6 +52,7 @@ import com.oracle.graal.nodes.cfg.*; import com.oracle.graal.nodes.spi.*; import com.oracle.graal.options.*; +import com.oracle.graal.options.OptionValue.*; import com.oracle.graal.phases.*; import com.oracle.graal.phases.common.*; import com.oracle.graal.phases.schedule.*; @@ -241,6 +245,22 @@ public static LIRGenerationResult emitLIR(Backend backend, TargetDescription target, SchedulePhase schedule, StructuredGraph graph, Object stub, CallingConvention cc, RegisterConfig registerConfig, LIRSuites lirSuites) { + try { + return emitLIR0(backend, target, schedule, graph, stub, cc, registerConfig, lirSuites); + } catch (OutOfRegistersException e) { + if (RegisterPressure.getValue() != null && !RegisterPressure.getValue().equals(ALL_REGISTERS)) { + try (OverrideScope s = OptionValue.override(RegisterPressure, ALL_REGISTERS)) { + // retry with default register set + return emitLIR0(backend, target, schedule, graph, stub, cc, registerConfig, lirSuites); + } + } else { + throw e; + } + } + } + + private static LIRGenerationResult emitLIR0(Backend backend, TargetDescription target, SchedulePhase schedule, StructuredGraph graph, Object stub, CallingConvention cc, + RegisterConfig registerConfig, LIRSuites lirSuites) { try (Scope ds = Debug.scope("EmitLIR"); DebugCloseable a = EmitLIR.start()) { List<Block> blocks = schedule.getCFG().getBlocks(); Block startBlock = schedule.getCFG().getStartBlock();
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/LinearScanPhase.java Tue Apr 14 11:57:27 2015 +0200 +++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/alloc/lsra/LinearScanPhase.java Tue Apr 14 11:58:56 2015 +0200 @@ -22,8 +22,6 @@ */ package com.oracle.graal.lir.alloc.lsra; -import static com.oracle.graal.compiler.common.GraalOptions.*; - import java.util.*; import com.oracle.graal.api.code.*; @@ -32,25 +30,12 @@ import com.oracle.graal.lir.gen.*; import com.oracle.graal.lir.gen.LIRGeneratorTool.SpillMoveFactory; import com.oracle.graal.lir.phases.*; -import com.oracle.graal.options.*; -import com.oracle.graal.options.OptionValue.OverrideScope; public final class LinearScanPhase extends AllocationPhase { @Override protected <B extends AbstractBlockBase<B>> void run(TargetDescription target, LIRGenerationResult lirGenRes, List<B> codeEmittingOrder, List<B> linearScanOrder, SpillMoveFactory spillMoveFactory) { - try { - new LinearScan(target, lirGenRes, spillMoveFactory, new RegisterAllocationConfig(lirGenRes.getFrameMapBuilder().getRegisterConfig())).allocate(); - } catch (OutOfRegistersException e) { - if (RegisterPressure.getValue() != null) { - try (OverrideScope s = OptionValue.override(RegisterPressure, RegisterAllocationConfig.ALL_REGISTERS)) { - // retry with default register set - new LinearScan(target, lirGenRes, spillMoveFactory, new RegisterAllocationConfig(lirGenRes.getFrameMapBuilder().getRegisterConfig())).allocate(); - } - } else { - throw e; - } - } + new LinearScan(target, lirGenRes, spillMoveFactory, new RegisterAllocationConfig(lirGenRes.getFrameMapBuilder().getRegisterConfig())).allocate(); } }