1 /* 2 * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 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.core.phases; 24 25 import static org.graalvm.compiler.core.common.GraalOptions.ConditionalElimination; 26 import static org.graalvm.compiler.core.common.GraalOptions.ImmutableCode; 27 import static org.graalvm.compiler.core.common.GraalOptions.OptDeoptimizationGrouping; 28 import static org.graalvm.compiler.core.common.GraalOptions.OptEliminatePartiallyRedundantGuards; 29 import static org.graalvm.compiler.core.common.GraalOptions.OptFloatingReads; 30 import static org.graalvm.compiler.core.common.GraalOptions.OptPushThroughPi; 31 import static org.graalvm.compiler.core.common.GraalOptions.OptReadElimination; 32 import static org.graalvm.compiler.core.common.GraalOptions.ReassociateInvariants; 33 import static org.graalvm.compiler.core.common.GraalOptions.UseGraalInstrumentation; 34 import static org.graalvm.compiler.core.common.GraalOptions.VerifyHeapAtReturn; 35 36 import org.graalvm.compiler.loop.phases.LoopSafepointEliminationPhase; 37 import org.graalvm.compiler.loop.phases.ReassociateInvariantPhase; 38 import org.graalvm.compiler.nodes.spi.LoweringTool; 39 import org.graalvm.compiler.phases.PhaseSuite; 40 import org.graalvm.compiler.phases.common.CanonicalizerPhase; 41 import org.graalvm.compiler.phases.common.DeoptimizationGroupingPhase; 42 import org.graalvm.compiler.phases.common.FloatingReadPhase; 43 import org.graalvm.compiler.phases.common.FrameStateAssignmentPhase; 44 import org.graalvm.compiler.phases.common.GuardLoweringPhase; 45 import org.graalvm.compiler.phases.common.IncrementalCanonicalizerPhase; 46 import org.graalvm.compiler.phases.common.IterativeConditionalEliminationPhase; 47 import org.graalvm.compiler.phases.common.LockEliminationPhase; 48 import org.graalvm.compiler.phases.common.LoopSafepointInsertionPhase; 49 import org.graalvm.compiler.phases.common.LoweringPhase; 50 import org.graalvm.compiler.phases.common.OptimizeGuardAnchorsPhase; 51 import org.graalvm.compiler.phases.common.PushThroughPiPhase; 52 import org.graalvm.compiler.phases.common.RemoveValueProxyPhase; 53 import org.graalvm.compiler.phases.common.ValueAnchorCleanupPhase; 54 import org.graalvm.compiler.phases.common.VerifyHeapAtReturnPhase; 55 import org.graalvm.compiler.phases.common.instrumentation.MidTierReconcileInstrumentationPhase; 56 import org.graalvm.compiler.phases.tiers.MidTierContext; 57 import org.graalvm.compiler.virtual.phases.ea.EarlyReadEliminationPhase; 58 59 public class MidTier extends PhaseSuite<MidTierContext> { 60 61 public MidTier() { 62 CanonicalizerPhase canonicalizer = new CanonicalizerPhase(); 63 if (ImmutableCode.getValue()) { 64 canonicalizer.disableReadCanonicalization(); 65 } 66 67 if (OptPushThroughPi.getValue()) { 68 appendPhase(new PushThroughPiPhase()); 69 } 70 71 appendPhase(canonicalizer); 72 73 appendPhase(new ValueAnchorCleanupPhase()); 74 appendPhase(new LockEliminationPhase()); 75 76 if (OptReadElimination.getValue()) { 77 appendPhase(new EarlyReadEliminationPhase(canonicalizer)); 78 } 79 80 if (OptFloatingReads.getValue()) { 81 appendPhase(new IncrementalCanonicalizerPhase<>(canonicalizer, new FloatingReadPhase())); 82 } 83 appendPhase(new RemoveValueProxyPhase()); 84 85 appendPhase(canonicalizer); 86 87 if (OptEliminatePartiallyRedundantGuards.getValue()) { 88 appendPhase(new OptimizeGuardAnchorsPhase()); 89 } 90 91 if (ConditionalElimination.getValue()) { 92 appendPhase(new IterativeConditionalEliminationPhase(canonicalizer, true)); 93 } 94 95 if (OptEliminatePartiallyRedundantGuards.getValue()) { 96 appendPhase(new OptimizeGuardAnchorsPhase()); 97 } 98 99 appendPhase(canonicalizer); 100 101 appendPhase(new IncrementalCanonicalizerPhase<>(canonicalizer, new LoopSafepointEliminationPhase())); 102 103 appendPhase(new LoopSafepointInsertionPhase()); 104 105 appendPhase(new IncrementalCanonicalizerPhase<>(canonicalizer, new GuardLoweringPhase())); 106 107 if (VerifyHeapAtReturn.getValue()) { 108 appendPhase(new VerifyHeapAtReturnPhase()); 109 } 110 111 appendPhase(new LoweringPhase(canonicalizer, LoweringTool.StandardLoweringStage.MID_TIER)); 112 if (UseGraalInstrumentation.getValue()) { 113 appendPhase(new MidTierReconcileInstrumentationPhase()); 114 } 115 116 appendPhase(new FrameStateAssignmentPhase()); 117 118 if (ReassociateInvariants.getValue()) { 119 appendPhase(new ReassociateInvariantPhase()); 120 } 121 122 if (OptDeoptimizationGrouping.getValue()) { 123 appendPhase(new DeoptimizationGroupingPhase()); 124 } 125 126 appendPhase(canonicalizer); 127 } 128 }