Mercurial > hg > truffle
annotate graal/com.oracle.graal.lir/src/com/oracle/graal/lir/EdgeMoveOptimizer.java @ 19208:81358265e0e0
Make LowLevelLowTierPhase generic.
author | Josef Eisl <josef.eisl@jku.at> |
---|---|
date | Fri, 06 Feb 2015 19:43:08 +0100 |
parents | 16903af7d05c |
children | 1e3b5204776f |
rev | line source |
---|---|
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1 /* |
4207
e2578f3e8ab2
Allow an arbitary number of output operands for LIR instructions
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4142
diff
changeset
|
2 * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
4 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
5 * This code is free software; you can redistribute it and/or modify it |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
6 * under the terms of the GNU General Public License version 2 only, as |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
7 * published by the Free Software Foundation. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
8 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
12 * version 2 for more details (a copy is included in the LICENSE file that |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
13 * accompanied this code). |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
14 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
15 * You should have received a copy of the GNU General Public License version |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
16 * 2 along with this work; if not, write to the Free Software Foundation, |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
18 * |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
21 * questions. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
22 */ |
6336
b34b2e874948
Move EdgeMoveOptimizer from compiler.alloc to graal.lir
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
6317
diff
changeset
|
23 package com.oracle.graal.lir; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
24 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
25 import java.util.*; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
26 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
27 import com.oracle.graal.api.code.*; |
15192
644dfe49c0f4
Move packages com.oracle.graal.cfg to com.oracle.graal.compiler.common.cfg.
Josef Eisl <josef.eisl@jku.at>
parents:
15157
diff
changeset
|
28 import com.oracle.graal.compiler.common.cfg.*; |
12688
76a6070f7164
LIRGenerator: don't create end-of-block JumpOps for blocks that end in a FallThroughOp with a target
Lukas Stadler <lukas.stadler@jku.at>
parents:
10816
diff
changeset
|
29 import com.oracle.graal.lir.StandardOp.MoveOp; |
19199
751489b93b2c
emitLIR: only pass LIRGenerationResult to LocationMarker, EdgeMoveOptimizer, RedundantMoveElimination, NullCheckOptimizer.
Josef Eisl <josef.eisl@jku.at>
parents:
15192
diff
changeset
|
30 import com.oracle.graal.lir.gen.*; |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
31 import com.oracle.graal.lir.phases.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
32 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
33 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
34 * This class optimizes moves, particularly those that result from eliminating SSA form. |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
35 * <p> |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7499
diff
changeset
|
36 * When a block has more than one predecessor, and all predecessors end with the |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
37 * {@linkplain Optimizer#same(LIRInstruction, LIRInstruction) same} sequence of {@linkplain MoveOp |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
38 * move} instructions, then these sequences can be replaced with a single copy of the sequence at |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
39 * the beginning of the block. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
40 * <p> |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7499
diff
changeset
|
41 * Similarly, when a block has more than one successor, then same sequences of moves at the |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7499
diff
changeset
|
42 * beginning of the successors can be placed once at the end of the block. But because the moves |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7499
diff
changeset
|
43 * must be inserted before all branch instructions, this works only when there is exactly one |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7499
diff
changeset
|
44 * conditional branch at the end of the block (because the moves must be inserted before all |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
45 * branches, but after all compares). |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
46 * <p> |
14906 | 47 * This optimization affects all kind of moves (reg->reg, reg->stack and stack->reg). |
48 * Because this optimization works best when a block contains only a few moves, it has a huge impact | |
49 * on the number of blocks that are totally empty. | |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
50 */ |
19208
81358265e0e0
Make LowLevelLowTierPhase generic.
Josef Eisl <josef.eisl@jku.at>
parents:
19204
diff
changeset
|
51 public final class EdgeMoveOptimizer<B extends AbstractBlock<B>> extends LowLevelLowTierPhase<B> { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
52 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
53 @Override |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
54 protected void run(TargetDescription target, LIRGenerationResult lirGenRes) { |
19199
751489b93b2c
emitLIR: only pass LIRGenerationResult to LocationMarker, EdgeMoveOptimizer, RedundantMoveElimination, NullCheckOptimizer.
Josef Eisl <josef.eisl@jku.at>
parents:
15192
diff
changeset
|
55 LIR ir = lirGenRes.getLIR(); |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
56 Optimizer optimizer = new Optimizer(ir); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
57 |
14786
a6595f1b55b0
Make LIR use AbstractBlock. (errors)
Josef Eisl <josef.eisl@jku.at>
parents:
13268
diff
changeset
|
58 List<? extends AbstractBlock<?>> blockList = ir.linearScanOrder(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
59 // ignore the first block in the list (index 0 is not processed) |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
60 for (int i = blockList.size() - 1; i >= 1; i--) { |
14786
a6595f1b55b0
Make LIR use AbstractBlock. (errors)
Josef Eisl <josef.eisl@jku.at>
parents:
13268
diff
changeset
|
61 AbstractBlock<?> block = blockList.get(i); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
62 |
7497
0f8c6dbf68be
Code clean up and documentation for ComputeBlockOrder class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
6529
diff
changeset
|
63 if (block.getPredecessorCount() > 1) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
64 optimizer.optimizeMovesAtBlockEnd(block); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
65 } |
7497
0f8c6dbf68be
Code clean up and documentation for ComputeBlockOrder class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
6529
diff
changeset
|
66 if (block.getSuccessorCount() == 2) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
67 optimizer.optimizeMovesAtBlockBegin(block); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
68 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
69 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
70 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
71 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
72 private static final class Optimizer { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
73 private final List<List<LIRInstruction>> edgeInstructionSeqences; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
74 private LIR ir; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
75 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
76 public Optimizer(LIR ir) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
77 this.ir = ir; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
78 edgeInstructionSeqences = new ArrayList<>(4); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
79 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
80 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
81 /** |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
82 * Determines if two operations are both {@linkplain MoveOp moves} that have the same |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
83 * {@linkplain MoveOp#getInput() source} and {@linkplain MoveOp#getResult() destination} |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
84 * operands. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
85 * |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
86 * @param op1 the first instruction to compare |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
87 * @param op2 the second instruction to compare |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
88 * @return {@code true} if {@code op1} and {@code op2} are the same by the above algorithm |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
89 */ |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
90 private static boolean same(LIRInstruction op1, LIRInstruction op2) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
91 assert op1 != null; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
92 assert op2 != null; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
93 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
94 if (op1 instanceof MoveOp && op2 instanceof MoveOp) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
95 MoveOp move1 = (MoveOp) op1; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
96 MoveOp move2 = (MoveOp) op2; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
97 if (move1.getInput().equals(move2.getInput()) && move1.getResult().equals(move2.getResult())) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
98 // these moves are exactly equal and can be optimized |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
99 return true; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
100 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
101 } |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
102 return false; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
103 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
104 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
105 /** |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
106 * Moves the longest {@linkplain #same common} subsequence at the end all predecessors of |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
107 * {@code block} to the start of {@code block}. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
108 */ |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
109 private void optimizeMovesAtBlockEnd(AbstractBlock<?> block) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
110 for (AbstractBlock<?> pred : block.getPredecessors()) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
111 if (pred == block) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
112 // currently we can't handle this correctly. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
113 return; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
114 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
115 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
116 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
117 // clear all internal data structures |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
118 edgeInstructionSeqences.clear(); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
119 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
120 int numPreds = block.getPredecessorCount(); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
121 assert numPreds > 1 : "do not call otherwise"; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
122 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
123 // setup a list with the LIR instructions of all predecessors |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
124 for (AbstractBlock<?> pred : block.getPredecessors()) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
125 assert pred != null; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
126 assert ir.getLIRforBlock(pred) != null; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
127 List<LIRInstruction> predInstructions = ir.getLIRforBlock(pred); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
128 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
129 if (pred.getSuccessorCount() != 1) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
130 // this can happen with switch-statements where multiple edges are between |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
131 // the same blocks. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
132 return; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
133 } |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
134 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
135 assert pred.getSuccessors().iterator().next() == block : "invalid control flow"; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
136 assert predInstructions.get(predInstructions.size() - 1) instanceof StandardOp.JumpOp : "block must end with unconditional jump"; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
137 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
138 if (predInstructions.get(predInstructions.size() - 1).hasState()) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
139 // can not optimize instructions that have debug info |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
140 return; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
141 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
142 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
143 // ignore the unconditional branch at the end of the block |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
144 List<LIRInstruction> seq = predInstructions.subList(0, predInstructions.size() - 1); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
145 edgeInstructionSeqences.add(seq); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
146 } |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
147 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
148 // process lir-instructions while all predecessors end with the same instruction |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
149 while (true) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
150 List<LIRInstruction> seq = edgeInstructionSeqences.get(0); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
151 if (seq.isEmpty()) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
152 return; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
153 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
154 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
155 LIRInstruction op = last(seq); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
156 for (int i = 1; i < numPreds; ++i) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
157 List<LIRInstruction> otherSeq = edgeInstructionSeqences.get(i); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
158 if (otherSeq.isEmpty() || !same(op, last(otherSeq))) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
159 return; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
160 } |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
161 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
162 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
163 // insert the instruction at the beginning of the current block |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
164 ir.getLIRforBlock(block).add(1, op); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
165 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
166 // delete the instruction at the end of all predecessors |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
167 for (int i = 0; i < numPreds; i++) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
168 seq = edgeInstructionSeqences.get(i); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
169 removeLast(seq); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
170 } |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
171 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
172 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
173 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
174 /** |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
175 * Moves the longest {@linkplain #same common} subsequence at the start of all successors of |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
176 * {@code block} to the end of {@code block} just prior to the branch instruction ending |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
177 * {@code block}. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
178 */ |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
179 private void optimizeMovesAtBlockBegin(AbstractBlock<?> block) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
180 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
181 edgeInstructionSeqences.clear(); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
182 int numSux = block.getSuccessorCount(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
183 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
184 List<LIRInstruction> instructions = ir.getLIRforBlock(block); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
185 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
186 assert numSux == 2 : "method should not be called otherwise"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
187 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
188 LIRInstruction lastInstruction = instructions.get(instructions.size() - 1); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
189 if (lastInstruction.hasState()) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
190 // cannot optimize instructions when debug info is needed |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
191 return; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
192 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
193 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
194 LIRInstruction branch = lastInstruction; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
195 if (!(branch instanceof StandardOp.BranchOp) || branch.hasOperands()) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
196 // Only blocks that end with a conditional branch are optimized. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
197 // In addition, a conditional branch with operands (including state) cannot |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
198 // be optimized. Moving a successor instruction before such a branch may |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
199 // interfere with the operands of the branch. For example, a successive move |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
200 // instruction may redefine an input operand of the branch. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
201 return; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
202 } |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
203 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
204 // Now it is guaranteed that the block ends with a conditional branch. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
205 // The instructions are inserted at the end of the block before the branch. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
206 int insertIdx = instructions.size() - 1; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
207 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
208 // setup a list with the lir-instructions of all successors |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
209 for (AbstractBlock<?> sux : block.getSuccessors()) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
210 List<LIRInstruction> suxInstructions = ir.getLIRforBlock(sux); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
211 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
212 assert suxInstructions.get(0) instanceof StandardOp.LabelOp : "block must start with label"; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
213 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
214 if (sux.getPredecessorCount() != 1) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
215 // this can happen with switch-statements where multiple edges are between |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
216 // the same blocks. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
217 return; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
218 } |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
219 assert sux.getPredecessors().iterator().next() == block : "invalid control flow"; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
220 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
221 // ignore the label at the beginning of the block |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
222 List<LIRInstruction> seq = suxInstructions.subList(1, suxInstructions.size()); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
223 edgeInstructionSeqences.add(seq); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
224 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
225 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
226 // process LIR instructions while all successors begin with the same instruction |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
227 while (true) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
228 List<LIRInstruction> seq = edgeInstructionSeqences.get(0); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
229 if (seq.isEmpty()) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
230 return; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
231 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
232 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
233 LIRInstruction op = first(seq); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
234 for (int i = 1; i < numSux; i++) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
235 List<LIRInstruction> otherSeq = edgeInstructionSeqences.get(i); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
236 if (otherSeq.isEmpty() || !same(op, first(otherSeq))) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
237 // these instructions are different and cannot be optimized . |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
238 // no further optimization possible |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
239 return; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
240 } |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
241 } |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
242 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
243 // insert instruction at end of current block |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
244 ir.getLIRforBlock(block).add(insertIdx, op); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
245 insertIdx++; |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
246 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
247 // delete the instructions at the beginning of all successors |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
248 for (int i = 0; i < numSux; i++) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
249 seq = edgeInstructionSeqences.get(i); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
250 removeFirst(seq); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
251 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
252 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
253 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
254 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
255 /** |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
256 * Gets the first element from a LIR instruction sequence. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
257 */ |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
258 private static LIRInstruction first(List<LIRInstruction> seq) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
259 return seq.get(0); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
260 } |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
261 |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
262 /** |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
263 * Gets the last element from a LIR instruction sequence. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
264 */ |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
265 private static LIRInstruction last(List<LIRInstruction> seq) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
266 return seq.get(seq.size() - 1); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
267 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
268 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
269 /** |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
270 * Removes the first element from a LIR instruction sequence. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
271 */ |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
272 private static void removeFirst(List<LIRInstruction> seq) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
273 seq.remove(0); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
274 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
275 |
19204
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
276 /** |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
277 * Removes the last element from a LIR instruction sequence. |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
278 */ |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
279 private static void removeLast(List<LIRInstruction> seq) { |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
280 seq.remove(seq.size() - 1); |
16903af7d05c
Make EdgeMoveOptimizer a LowLevelLowTierPhase.
Josef Eisl <josef.eisl@jku.at>
parents:
19199
diff
changeset
|
281 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
282 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
283 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
284 } |