Mercurial > hg > truffle
annotate graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/alloc/LinearScan.java @ 17285:3a834111a632
Make [Instruction]ValueProcedure and [Instruction]ValueConsumer a FunctionalInterface.
author | Josef Eisl <josef.eisl@jku.at> |
---|---|
date | Thu, 25 Sep 2014 17:04:52 +0200 |
parents | d21962ea9617 |
children | 182062f9739d |
rev | line source |
---|---|
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1 /* |
16094
c0b8d395368b
Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents:
15927
diff
changeset
|
2 * Copyright (c) 2009, 2014, 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 */ |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
23 package com.oracle.graal.compiler.alloc; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
24 |
5547
b6617d13ea44
Dropping Ci* prefixes. Some additional renamings in the api.code interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5542
diff
changeset
|
25 import static com.oracle.graal.api.code.CodeUtil.*; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5711
diff
changeset
|
26 import static com.oracle.graal.api.code.ValueUtil.*; |
9855
6898d8995866
converted more options from GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9632
diff
changeset
|
27 import static com.oracle.graal.compiler.GraalDebugConfig.*; |
16505
45f92700119f
Move AbstractBlock.{dominates, isDominatedBy} to AbstractControlFlowGraph.
Josef Eisl <josef.eisl@jku.at>
parents:
16380
diff
changeset
|
28 import static com.oracle.graal.compiler.common.cfg.AbstractControlFlowGraph.*; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5711
diff
changeset
|
29 import static com.oracle.graal.lir.LIRValueUtil.*; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5711
diff
changeset
|
30 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
31 import java.util.*; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
32 |
6317
3ee3eb48e683
Clean up ComputeLinearScanOrder. Rename to ComputeBlockOrder.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5733
diff
changeset
|
33 import com.oracle.graal.alloc.*; |
5510
426c605c9d3c
Move cri.ci to api.code.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5507
diff
changeset
|
34 import com.oracle.graal.api.code.*; |
5507
dc71b06d09f8
Moving classes from cri.ri to api.meta.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5506
diff
changeset
|
35 import com.oracle.graal.api.meta.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
36 import com.oracle.graal.compiler.alloc.Interval.RegisterBinding; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
37 import com.oracle.graal.compiler.alloc.Interval.RegisterPriority; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
38 import com.oracle.graal.compiler.alloc.Interval.SpillState; |
15193
96bb07a5d667
Spit up and move GraalInternalError.
Josef Eisl <josef.eisl@jku.at>
parents:
15192
diff
changeset
|
39 import com.oracle.graal.compiler.common.*; |
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
|
40 import com.oracle.graal.compiler.common.cfg.*; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
41 import com.oracle.graal.compiler.gen.*; |
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
42 import com.oracle.graal.debug.*; |
13197
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
12785
diff
changeset
|
43 import com.oracle.graal.debug.Debug.Scope; |
5060
4ed4295ce15f
Update import statements.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5059
diff
changeset
|
44 import com.oracle.graal.lir.*; |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5711
diff
changeset
|
45 import com.oracle.graal.lir.LIRInstruction.OperandFlag; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5711
diff
changeset
|
46 import com.oracle.graal.lir.LIRInstruction.OperandMode; |
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5711
diff
changeset
|
47 import com.oracle.graal.lir.StandardOp.MoveOp; |
14070
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
48 import com.oracle.graal.nodes.*; |
16362
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
49 import com.oracle.graal.options.*; |
6525
2c913b643422
rename packages in graal.phases to match project name
Doug Simon <doug.simon@oracle.com>
parents:
6500
diff
changeset
|
50 import com.oracle.graal.phases.util.*; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
51 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
52 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
53 * An implementation of the linear scan register allocator algorithm described in <a |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
54 * href="http://doi.acm.org/10.1145/1064979.1064998" |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
55 * >"Optimized Interval Splitting in a Linear Scan Register Allocator"</a> by Christian Wimmer and |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
56 * Hanspeter Moessenboeck. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
57 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
58 public final class LinearScan { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
59 |
5547
b6617d13ea44
Dropping Ci* prefixes. Some additional renamings in the api.code interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5542
diff
changeset
|
60 final TargetDescription target; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
61 final LIR ir; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
62 final FrameMap frameMap; |
5547
b6617d13ea44
Dropping Ci* prefixes. Some additional renamings in the api.code interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5542
diff
changeset
|
63 final RegisterAttributes[] registerAttributes; |
b6617d13ea44
Dropping Ci* prefixes. Some additional renamings in the api.code interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5542
diff
changeset
|
64 final Register[] registers; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
65 |
10961 | 66 boolean callKillsRegisters; |
67 | |
16380
8057279ec60e
LSRA spill optimization: use DOMINATOR_SPILL_MOVE_ID to mark moves.
Josef Eisl <josef.eisl@jku.at>
parents:
16379
diff
changeset
|
68 public static final int DOMINATOR_SPILL_MOVE_ID = -2; |
15885
4d18c6bb6b3a
LinearScan: Improve initialization and resizing of intervals array.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15884
diff
changeset
|
69 private static final int SPLIT_INTERVALS_CAPACITY_RIGHT_SHIFT = 1; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
70 |
16362
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
71 public static class Options { |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
72 // @formatter:off |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
73 @Option(help = "Enable spill position optimization") |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
74 public static final OptionValue<Boolean> LSRAOptimizeSpillPosition = new OptionValue<>(true); |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
75 // @formatter:on |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
76 } |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
77 |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
78 public static class BlockData { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
79 |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
80 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
81 * Bit map specifying which operands are live upon entry to this block. These are values |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
82 * used in this block or any of its successors where such value are not defined in this |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
83 * block. The bit index of an operand is its {@linkplain LinearScan#operandNumber(Value) |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
84 * operand number}. |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
85 */ |
5541
b4c406861c33
More renamings to drop Ri* prefix completely. Deleted graph.BitMap class and replaced with java.util.BitSet.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5540
diff
changeset
|
86 public BitSet liveIn; |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
87 |
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
88 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
89 * Bit map specifying which operands are live upon exit from this block. These are values |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
90 * used in a successor block that are either defined in this block or were live upon entry |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
91 * to this block. The bit index of an operand is its |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
92 * {@linkplain LinearScan#operandNumber(Value) operand number}. |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
93 */ |
5541
b4c406861c33
More renamings to drop Ri* prefix completely. Deleted graph.BitMap class and replaced with java.util.BitSet.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5540
diff
changeset
|
94 public BitSet liveOut; |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
95 |
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
96 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
97 * Bit map specifying which operands are used (before being defined) in this block. That is, |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
98 * these are the values that are live upon entry to the block. The bit index of an operand |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
99 * is its {@linkplain LinearScan#operandNumber(Value) operand number}. |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
100 */ |
5541
b4c406861c33
More renamings to drop Ri* prefix completely. Deleted graph.BitMap class and replaced with java.util.BitSet.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5540
diff
changeset
|
101 public BitSet liveGen; |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
102 |
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
103 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
104 * Bit map specifying which operands are defined/overwritten in this block. The bit index of |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
105 * an operand is its {@linkplain LinearScan#operandNumber(Value) operand number}. |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
106 */ |
5541
b4c406861c33
More renamings to drop Ri* prefix completely. Deleted graph.BitMap class and replaced with java.util.BitSet.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5540
diff
changeset
|
107 public BitSet liveKill; |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
108 } |
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
109 |
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
110 public final BlockMap<BlockData> blockData; |
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
111 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
112 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
113 * List of blocks in linear-scan order. This is only correct as long as the CFG does not change. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
114 */ |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
115 final List<? extends AbstractBlock<?>> sortedBlocks; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
116 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
117 /** |
5539
bc647d8b0080
Renaming RiValue => Value.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5536
diff
changeset
|
118 * Map from {@linkplain #operandNumber(Value) operand numbers} to intervals. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
119 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
120 Interval[] intervals; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
121 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
122 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
123 * The number of valid entries in {@link #intervals}. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
124 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
125 int intervalsSize; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
126 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
127 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
128 * The index of the first entry in {@link #intervals} for a |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
129 * {@linkplain #createDerivedInterval(Interval) derived interval}. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
130 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
131 int firstDerivedIntervalIndex = -1; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
132 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
133 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
134 * Intervals sorted by {@link Interval#from()}. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
135 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
136 Interval[] sortedIntervals; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
137 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
138 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
139 * Map from an instruction {@linkplain LIRInstruction#id id} to the instruction. Entries should |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
140 * be retrieved with {@link #instructionForId(int)} as the id is not simply an index into this |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
141 * array. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
142 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
143 LIRInstruction[] opIdToInstructionMap; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
144 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
145 /** |
14789
1596a21c4194
Move remaining Block references in LinearScan to AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14152
diff
changeset
|
146 * Map from an instruction {@linkplain LIRInstruction#id id} to the {@linkplain AbstractBlock |
1596a21c4194
Move remaining Block references in LinearScan to AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14152
diff
changeset
|
147 * block} containing the instruction. Entries should be retrieved with {@link #blockForId(int)} |
1596a21c4194
Move remaining Block references in LinearScan to AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14152
diff
changeset
|
148 * as the id is not simply an index into this array. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
149 */ |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
150 AbstractBlock<?>[] opIdToBlockMap; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
151 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
152 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
153 * Bit set for each variable that is contained in each loop. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
154 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
155 BitMap2D intervalInLoop; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
156 |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
157 /** |
5711
4d7175cf3526
enabled Eclipse/JDT javadoc checking and fixed resulting warnings
Doug Simon <doug.simon@oracle.com>
parents:
5552
diff
changeset
|
158 * The {@linkplain #operandNumber(Value) number} of the first variable operand allocated. |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
159 */ |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
160 private final int firstVariableNumber; |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
161 |
14070
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
162 public LinearScan(TargetDescription target, LIR ir, FrameMap frameMap) { |
4265
4643ccd37dac
* removed CiStatistics
Lukas Stadler <lukas.stadler@jku.at>
parents:
4262
diff
changeset
|
163 this.target = target; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
164 this.ir = ir; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
165 this.frameMap = frameMap; |
7501
799dd373fcb6
Remove caching of sorted blocks in LSRA.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7499
diff
changeset
|
166 this.sortedBlocks = ir.linearScanOrder(); |
4265
4643ccd37dac
* removed CiStatistics
Lukas Stadler <lukas.stadler@jku.at>
parents:
4262
diff
changeset
|
167 this.registerAttributes = frameMap.registerConfig.getAttributesMap(); |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
168 |
6582
cc32ce37eddc
deleted Architecture.twoOperandMode() and encapsulated all public fields in Architecture with getters
Doug Simon <doug.simon@oracle.com>
parents:
6581
diff
changeset
|
169 this.registers = target.arch.getRegisters(); |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
170 this.firstVariableNumber = registers.length; |
14145
4ff08c0366ae
Encapsulate LIR class fields.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
14142
diff
changeset
|
171 this.blockData = new BlockMap<>(ir.getControlFlowGraph()); |
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 |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
174 public int getFirstLirInstructionId(AbstractBlock<?> block) { |
14806
a8723f1ff542
LIR renamed setter and getter functions.
Josef Eisl <josef.eisl@jku.at>
parents:
14789
diff
changeset
|
175 int result = ir.getLIRforBlock(block).get(0).id(); |
6411
c5afcc2ebd3d
change of project structure: separate compiler and LIR, put EA into separate project
Lukas Stadler <lukas.stadler@jku.at>
parents:
6352
diff
changeset
|
176 assert result >= 0; |
c5afcc2ebd3d
change of project structure: separate compiler and LIR, put EA into separate project
Lukas Stadler <lukas.stadler@jku.at>
parents:
6352
diff
changeset
|
177 return result; |
c5afcc2ebd3d
change of project structure: separate compiler and LIR, put EA into separate project
Lukas Stadler <lukas.stadler@jku.at>
parents:
6352
diff
changeset
|
178 } |
c5afcc2ebd3d
change of project structure: separate compiler and LIR, put EA into separate project
Lukas Stadler <lukas.stadler@jku.at>
parents:
6352
diff
changeset
|
179 |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
180 public int getLastLirInstructionId(AbstractBlock<?> block) { |
14806
a8723f1ff542
LIR renamed setter and getter functions.
Josef Eisl <josef.eisl@jku.at>
parents:
14789
diff
changeset
|
181 List<LIRInstruction> instructions = ir.getLIRforBlock(block); |
6411
c5afcc2ebd3d
change of project structure: separate compiler and LIR, put EA into separate project
Lukas Stadler <lukas.stadler@jku.at>
parents:
6352
diff
changeset
|
182 int result = instructions.get(instructions.size() - 1).id(); |
c5afcc2ebd3d
change of project structure: separate compiler and LIR, put EA into separate project
Lukas Stadler <lukas.stadler@jku.at>
parents:
6352
diff
changeset
|
183 assert result >= 0; |
c5afcc2ebd3d
change of project structure: separate compiler and LIR, put EA into separate project
Lukas Stadler <lukas.stadler@jku.at>
parents:
6352
diff
changeset
|
184 return result; |
c5afcc2ebd3d
change of project structure: separate compiler and LIR, put EA into separate project
Lukas Stadler <lukas.stadler@jku.at>
parents:
6352
diff
changeset
|
185 } |
c5afcc2ebd3d
change of project structure: separate compiler and LIR, put EA into separate project
Lukas Stadler <lukas.stadler@jku.at>
parents:
6352
diff
changeset
|
186 |
5539
bc647d8b0080
Renaming RiValue => Value.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5536
diff
changeset
|
187 public static boolean isVariableOrRegister(Value value) { |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
188 return isVariable(value) || isRegister(value); |
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
189 } |
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
190 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
191 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
192 * Converts an operand (variable or register) to an index in a flat address space covering all |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
193 * the {@linkplain Variable variables} and {@linkplain RegisterValue registers} being processed |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
194 * by this allocator. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
195 */ |
5539
bc647d8b0080
Renaming RiValue => Value.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5536
diff
changeset
|
196 private int operandNumber(Value operand) { |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
197 if (isRegister(operand)) { |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
198 int number = asRegister(operand).number; |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
199 assert number < firstVariableNumber; |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
200 return number; |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
201 } |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
202 assert isVariable(operand) : operand; |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
203 return firstVariableNumber + ((Variable) operand).index; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
204 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
205 |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
206 /** |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
207 * Gets the number of operands. This value will increase by 1 for new variable. |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
208 */ |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
209 private int operandSize() { |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
210 return firstVariableNumber + ir.numVariables(); |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
211 } |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
212 |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
213 /** |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
214 * Gets the highest operand number for a register operand. This value will never change. |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
215 */ |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
216 public int maxRegisterNumber() { |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
217 return firstVariableNumber - 1; |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
218 } |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
219 |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
220 static final IntervalPredicate IS_PRECOLORED_INTERVAL = new IntervalPredicate() { |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
221 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
222 @Override |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
223 public boolean apply(Interval i) { |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
224 return isRegister(i.operand); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
225 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
226 }; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
227 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
228 static final IntervalPredicate IS_VARIABLE_INTERVAL = new IntervalPredicate() { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
229 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
230 @Override |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
231 public boolean apply(Interval i) { |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
232 return isVariable(i.operand); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
233 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
234 }; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
235 |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
236 static final IntervalPredicate IS_STACK_INTERVAL = new IntervalPredicate() { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
237 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
238 @Override |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
239 public boolean apply(Interval i) { |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
240 return !isRegister(i.operand); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
241 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
242 }; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
243 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
244 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
245 * Gets an object describing the attributes of a given register according to this register |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
246 * configuration. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
247 */ |
5547
b6617d13ea44
Dropping Ci* prefixes. Some additional renamings in the api.code interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5542
diff
changeset
|
248 RegisterAttributes attributes(Register reg) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
249 return registerAttributes[reg.number]; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
250 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
251 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
252 void assignSpillSlot(Interval interval) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
253 // assign the canonical spill slot of the parent (if a part of the interval |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
254 // is already spilled) or allocate a new spill slot |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
255 if (interval.canMaterialize()) { |
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
256 interval.assignLocation(Value.ILLEGAL); |
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
257 } else if (interval.spillSlot() != null) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
258 interval.assignLocation(interval.spillSlot()); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
259 } else { |
5547
b6617d13ea44
Dropping Ci* prefixes. Some additional renamings in the api.code interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5542
diff
changeset
|
260 StackSlot slot = frameMap.allocateSpillSlot(interval.kind()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
261 interval.setSpillSlot(slot); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
262 interval.assignLocation(slot); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
263 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
264 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
265 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
266 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
267 * Creates a new interval. |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
268 * |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
269 * @param operand the operand for the interval |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
270 * @return the created interval |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
271 */ |
9297
a5f2b9012865
Interval locations can only be AllocatableValues.
Roland Schatz <roland.schatz@oracle.com>
parents:
8402
diff
changeset
|
272 Interval createInterval(AllocatableValue operand) { |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
273 assert isLegal(operand); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
274 int operandNumber = operandNumber(operand); |
4352
5a84f5548fc4
More work on new debug infrastructure.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4350
diff
changeset
|
275 Interval interval = new Interval(operand, operandNumber); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
276 assert operandNumber < intervalsSize; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
277 assert intervals[operandNumber] == null; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
278 intervals[operandNumber] = interval; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
279 return interval; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
280 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
281 |
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 * Creates an interval as a result of splitting or spilling another interval. |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
284 * |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
285 * @param source an interval being split of spilled |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
286 * @return a new interval derived from {@code source} |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
287 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
288 Interval createDerivedInterval(Interval source) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
289 if (firstDerivedIntervalIndex == -1) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
290 firstDerivedIntervalIndex = intervalsSize; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
291 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
292 if (intervalsSize == intervals.length) { |
15885
4d18c6bb6b3a
LinearScan: Improve initialization and resizing of intervals array.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15884
diff
changeset
|
293 intervals = Arrays.copyOf(intervals, intervals.length + (intervals.length >> SPLIT_INTERVALS_CAPACITY_RIGHT_SHIFT)); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
294 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
295 intervalsSize++; |
9425
3ec29630cfb4
Use register categories instead of register flags.
Roland Schatz <roland.schatz@oracle.com>
parents:
9422
diff
changeset
|
296 Variable variable = new Variable(source.kind(), ir.nextVariable()); |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
297 |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
298 Interval interval = createInterval(variable); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
299 assert intervals[intervalsSize - 1] == interval; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
300 return interval; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
301 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
302 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
303 // access to block list (sorted in linear scan order) |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
304 int blockCount() { |
7501
799dd373fcb6
Remove caching of sorted blocks in LSRA.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7499
diff
changeset
|
305 return sortedBlocks.size(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
306 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
307 |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
308 AbstractBlock<?> blockAt(int index) { |
7501
799dd373fcb6
Remove caching of sorted blocks in LSRA.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7499
diff
changeset
|
309 return sortedBlocks.get(index); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
310 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
311 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
312 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
313 * Gets the size of the {@link BlockData#liveIn} and {@link BlockData#liveOut} sets for a basic |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
314 * block. These sets do not include any operands allocated as a result of creating |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
315 * {@linkplain #createDerivedInterval(Interval) derived intervals}. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
316 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
317 int liveSetSize() { |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
318 return firstDerivedIntervalIndex == -1 ? operandSize() : firstDerivedIntervalIndex; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
319 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
320 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
321 int numLoops() { |
15107 | 322 return ir.getControlFlowGraph().getLoops().size(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
323 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
324 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
325 boolean isIntervalInLoop(int interval, int loop) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
326 return intervalInLoop.at(interval, loop); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
327 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
328 |
15884
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
329 Interval intervalFor(int operandNumber) { |
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
330 return intervals[operandNumber]; |
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
331 } |
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
332 |
5539
bc647d8b0080
Renaming RiValue => Value.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5536
diff
changeset
|
333 Interval intervalFor(Value operand) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
334 int operandNumber = operandNumber(operand); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
335 assert operandNumber < intervalsSize; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
336 return intervals[operandNumber]; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
337 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
338 |
9297
a5f2b9012865
Interval locations can only be AllocatableValues.
Roland Schatz <roland.schatz@oracle.com>
parents:
8402
diff
changeset
|
339 Interval getOrCreateInterval(AllocatableValue operand) { |
8220
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
340 Interval ret = intervalFor(operand); |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
341 if (ret == null) { |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
342 return createInterval(operand); |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
343 } else { |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
344 return ret; |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
345 } |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
346 } |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
347 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
348 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
349 * Gets the highest instruction id allocated by this object. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
350 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
351 int maxOpId() { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
352 assert opIdToInstructionMap.length > 0 : "no operations"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
353 return (opIdToInstructionMap.length - 1) << 1; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
354 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
355 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
356 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
357 * Converts an {@linkplain LIRInstruction#id instruction id} to an instruction index. All LIR |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
358 * instructions in a method have an index one greater than their linear-scan order predecesor |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
359 * with the first instruction having an index of 0. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
360 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
361 static int opIdToIndex(int opId) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
362 return opId >> 1; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
363 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
364 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
365 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
366 * Retrieves the {@link LIRInstruction} based on its {@linkplain LIRInstruction#id id}. |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
367 * |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
368 * @param opId an instruction {@linkplain LIRInstruction#id id} |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
369 * @return the instruction whose {@linkplain LIRInstruction#id} {@code == id} |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
370 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
371 LIRInstruction instructionForId(int opId) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
372 assert isEven(opId) : "opId not even"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
373 LIRInstruction instr = opIdToInstructionMap[opIdToIndex(opId)]; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
374 assert instr.id() == opId; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
375 return instr; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
376 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
377 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
378 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
379 * Gets the block containing a given instruction. |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
380 * |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
381 * @param opId an instruction {@linkplain LIRInstruction#id id} |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
382 * @return the block containing the instruction denoted by {@code opId} |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
383 */ |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
384 AbstractBlock<?> blockForId(int opId) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
385 assert opIdToBlockMap.length > 0 && opId >= 0 && opId <= maxOpId() + 1 : "opId out of range"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
386 return opIdToBlockMap[opIdToIndex(opId)]; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
387 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
388 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
389 boolean isBlockBegin(int opId) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
390 return opId == 0 || blockForId(opId) != blockForId(opId - 1); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
391 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
392 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
393 boolean coversBlockBegin(int opId1, int opId2) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
394 return blockForId(opId1) != blockForId(opId2); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
395 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
396 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
397 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
398 * Determines if an {@link LIRInstruction} destroys all caller saved registers. |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
399 * |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
400 * @param opId an instruction {@linkplain LIRInstruction#id id} |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
401 * @return {@code true} if the instruction denoted by {@code id} destroys all caller saved |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
402 * registers. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
403 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
404 boolean hasCall(int opId) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
405 assert isEven(opId) : "opId not even"; |
9454
85a836bcd796
renaming for improved clarity: hasCall -> destroysCallerSavedRegisters
Doug Simon <doug.simon@oracle.com>
parents:
9425
diff
changeset
|
406 return instructionForId(opId).destroysCallerSavedRegisters(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
407 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
408 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
409 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
410 * Eliminates moves from register to stack if the stack slot is known to be correct. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
411 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
412 void changeSpillDefinitionPos(Interval interval, int defPos) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
413 assert interval.isSplitParent() : "can only be called for split parents"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
414 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
415 switch (interval.spillState()) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
416 case NoDefinitionFound: |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
417 assert interval.spillDefinitionPos() == -1 : "must no be set before"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
418 interval.setSpillDefinitionPos(defPos); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
419 interval.setSpillState(SpillState.NoSpillStore); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
420 break; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
421 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
422 case NoSpillStore: |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
423 assert defPos <= interval.spillDefinitionPos() : "positions are processed in reverse order when intervals are created"; |
6462 | 424 if (defPos < interval.spillDefinitionPos() - 2) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
425 // second definition found, so no spill optimization possible for this interval |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
426 interval.setSpillState(SpillState.NoOptimization); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
427 } else { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
428 // two consecutive definitions (because of two-operand LIR form) |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
429 assert blockForId(defPos) == blockForId(interval.spillDefinitionPos()) : "block must be equal"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
430 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
431 break; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
432 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
433 case NoOptimization: |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
434 // nothing to do |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
435 break; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
436 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
437 default: |
5547
b6617d13ea44
Dropping Ci* prefixes. Some additional renamings in the api.code interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5542
diff
changeset
|
438 throw new BailoutException("other states not allowed at this time"); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
439 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
440 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
441 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
442 // called during register allocation |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
443 void changeSpillState(Interval interval, int spillPos) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
444 switch (interval.spillState()) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
445 case NoSpillStore: { |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
446 int defLoopDepth = blockForId(interval.spillDefinitionPos()).getLoopDepth(); |
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
447 int spillLoopDepth = blockForId(spillPos).getLoopDepth(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
448 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
449 if (defLoopDepth < spillLoopDepth) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
450 // the loop depth of the spilling position is higher then the loop depth |
16360
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
451 // at the definition of the interval . move write to memory out of loop. |
16362
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
452 if (Options.LSRAOptimizeSpillPosition.getValue()) { |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
453 // find best spill position in dominator the tree |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
454 interval.setSpillState(SpillState.SpillInDominator); |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
455 } else { |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
456 // store at definition of the interval |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
457 interval.setSpillState(SpillState.StoreAtDefinition); |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
458 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
459 } else { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
460 // the interval is currently spilled only once, so for now there is no |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
461 // reason to store the interval at the definition |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
462 interval.setSpillState(SpillState.OneSpillStore); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
463 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
464 break; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
465 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
466 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
467 case OneSpillStore: { |
16362
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
468 if (Options.LSRAOptimizeSpillPosition.getValue()) { |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
469 // the interval is spilled more then once |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
470 interval.setSpillState(SpillState.SpillInDominator); |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
471 } else { |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
472 // it is better to store it to |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
473 // memory at the definition |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
474 interval.setSpillState(SpillState.StoreAtDefinition); |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
475 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
476 break; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
477 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
478 |
16359
f686fae77383
LSRA spill optimization: rename SpillInDominator.MultipleSpills to SpillState.SpillInDominator.
Josef Eisl <josef.eisl@jku.at>
parents:
16358
diff
changeset
|
479 case SpillInDominator: |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
480 case StoreAtDefinition: |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
481 case StartInMemory: |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
482 case NoOptimization: |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
483 case NoDefinitionFound: |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
484 // nothing to do |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
485 break; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
486 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
487 default: |
5547
b6617d13ea44
Dropping Ci* prefixes. Some additional renamings in the api.code interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5542
diff
changeset
|
488 throw new BailoutException("other states not allowed at this time"); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
489 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
490 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
491 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
492 abstract static class IntervalPredicate { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
493 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
494 abstract boolean apply(Interval i); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
495 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
496 |
16379
c5257d58b71a
LSRA spill optimization: backout changesets obsoleted by eager spill move placement.
Josef Eisl <josef.eisl@jku.at>
parents:
16378
diff
changeset
|
497 private static final IntervalPredicate mustStoreAtDefinition = new IntervalPredicate() { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
498 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
499 @Override |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
500 public boolean apply(Interval i) { |
16379
c5257d58b71a
LSRA spill optimization: backout changesets obsoleted by eager spill move placement.
Josef Eisl <josef.eisl@jku.at>
parents:
16378
diff
changeset
|
501 return i.isSplitParent() && i.spillState() == SpillState.StoreAtDefinition; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
502 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
503 }; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
504 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
505 // called once before assignment of register numbers |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
506 void eliminateSpillMoves() { |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
507 try (Indent indent = Debug.logAndIndent("Eliminating unnecessary spill moves")) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
508 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
509 // collect all intervals that must be stored after their definition. |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
510 // the list is sorted by Interval.spillDefinitionPos |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
511 Interval interval; |
16379
c5257d58b71a
LSRA spill optimization: backout changesets obsoleted by eager spill move placement.
Josef Eisl <josef.eisl@jku.at>
parents:
16378
diff
changeset
|
512 interval = createUnhandledLists(mustStoreAtDefinition, null).first; |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
513 if (DetailedAsserts.getValue()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
514 checkIntervals(interval); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
515 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
516 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
517 LIRInsertionBuffer insertionBuffer = new LIRInsertionBuffer(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
518 for (AbstractBlock<?> block : sortedBlocks) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
519 List<LIRInstruction> instructions = ir.getLIRforBlock(block); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
520 int numInst = instructions.size(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
521 |
16379
c5257d58b71a
LSRA spill optimization: backout changesets obsoleted by eager spill move placement.
Josef Eisl <josef.eisl@jku.at>
parents:
16378
diff
changeset
|
522 // iterate all instructions of the block. skip the first |
c5257d58b71a
LSRA spill optimization: backout changesets obsoleted by eager spill move placement.
Josef Eisl <josef.eisl@jku.at>
parents:
16378
diff
changeset
|
523 // because it is always a label |
c5257d58b71a
LSRA spill optimization: backout changesets obsoleted by eager spill move placement.
Josef Eisl <josef.eisl@jku.at>
parents:
16378
diff
changeset
|
524 for (int j = 1; j < numInst; j++) { |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
525 LIRInstruction op = instructions.get(j); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
526 int opId = op.id(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
527 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
528 if (opId == -1) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
529 MoveOp move = (MoveOp) op; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
530 // remove move from register to stack if the stack slot is guaranteed to be |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
531 // correct. |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
532 // only moves that have been inserted by LinearScan can be removed. |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
533 assert isVariable(move.getResult()) : "LinearScan inserts only moves to variables"; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
534 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
535 Interval curInterval = intervalFor(move.getResult()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
536 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
537 if (!isRegister(curInterval.location()) && curInterval.alwaysInMemory()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
538 // move target is a stack slot that is always correct, so eliminate |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
539 // instruction |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
540 if (Debug.isLogEnabled()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
541 Debug.log("eliminating move from interval %d to %d", operandNumber(move.getInput()), operandNumber(move.getResult())); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
542 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
543 // null-instructions are deleted by assignRegNum |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
544 instructions.set(j, null); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
545 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
546 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
547 } else { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
548 // insert move from register to stack just after |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
549 // the beginning of the interval |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
550 assert interval == Interval.EndMarker || interval.spillDefinitionPos() >= opId : "invalid order"; |
16379
c5257d58b71a
LSRA spill optimization: backout changesets obsoleted by eager spill move placement.
Josef Eisl <josef.eisl@jku.at>
parents:
16378
diff
changeset
|
551 assert interval == Interval.EndMarker || (interval.isSplitParent() && interval.spillState() == SpillState.StoreAtDefinition) : "invalid interval"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
552 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
553 while (interval != Interval.EndMarker && interval.spillDefinitionPos() == opId) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
554 if (!interval.canMaterialize()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
555 if (!insertionBuffer.initialized()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
556 // prepare insertion buffer (appended when all instructions in |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
557 // the block are processed) |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
558 insertionBuffer.init(instructions); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
559 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
560 |
16379
c5257d58b71a
LSRA spill optimization: backout changesets obsoleted by eager spill move placement.
Josef Eisl <josef.eisl@jku.at>
parents:
16378
diff
changeset
|
561 AllocatableValue fromLocation = interval.location(); |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
562 AllocatableValue toLocation = canonicalSpillOpr(interval); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
563 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
564 assert isRegister(fromLocation) : "from operand must be a register but is: " + fromLocation + " toLocation=" + toLocation + " spillState=" + interval.spillState(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
565 assert isStackSlot(toLocation) : "to operand must be a stack slot"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
566 |
16379
c5257d58b71a
LSRA spill optimization: backout changesets obsoleted by eager spill move placement.
Josef Eisl <josef.eisl@jku.at>
parents:
16378
diff
changeset
|
567 insertionBuffer.append(j + 1, ir.getSpillMoveFactory().createMove(toLocation, fromLocation)); |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
568 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
569 Debug.log("inserting move after definition of interval %d to stack slot %s at opId %d", interval.operandNumber, interval.spillSlot(), opId); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
570 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
571 interval = interval.next; |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
572 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
573 } |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
574 } // end of instruction iteration |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
575 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
576 if (insertionBuffer.initialized()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
577 insertionBuffer.finish(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
578 } |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
579 } // end of block iteration |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
580 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
581 assert interval == Interval.EndMarker : "missed an interval"; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
582 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
583 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
584 |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
585 private static void checkIntervals(Interval interval) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
586 Interval prev = null; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
587 Interval temp = interval; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
588 while (temp != Interval.EndMarker) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
589 assert temp.spillDefinitionPos() > 0 : "invalid spill definition pos"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
590 if (prev != null) { |
16379
c5257d58b71a
LSRA spill optimization: backout changesets obsoleted by eager spill move placement.
Josef Eisl <josef.eisl@jku.at>
parents:
16378
diff
changeset
|
591 assert temp.from() >= prev.from() : "intervals not sorted"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
592 assert temp.spillDefinitionPos() >= prev.spillDefinitionPos() : "when intervals are sorted by from : then they must also be sorted by spillDefinitionPos"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
593 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
594 |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
595 assert temp.spillSlot() != null || temp.canMaterialize() : "interval has no spill slot assigned"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
596 assert temp.spillDefinitionPos() >= temp.from() : "invalid order"; |
16379
c5257d58b71a
LSRA spill optimization: backout changesets obsoleted by eager spill move placement.
Josef Eisl <josef.eisl@jku.at>
parents:
16378
diff
changeset
|
597 assert temp.spillDefinitionPos() <= temp.from() + 2 : "only intervals defined once at their start-pos can be optimized"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
598 |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
599 Debug.log("interval %d (from %d to %d) must be stored at %d", temp.operandNumber, temp.from(), temp.to(), temp.spillDefinitionPos()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
600 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
601 prev = temp; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
602 temp = temp.next; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
603 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
604 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
605 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
606 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
607 * Numbers all instructions in all blocks. The numbering follows the |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
608 * {@linkplain ComputeBlockOrder linear scan order}. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
609 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
610 void numberInstructions() { |
15884
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
611 |
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
612 intervalsSize = operandSize(); |
15885
4d18c6bb6b3a
LinearScan: Improve initialization and resizing of intervals array.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15884
diff
changeset
|
613 intervals = new Interval[intervalsSize + (intervalsSize >> SPLIT_INTERVALS_CAPACITY_RIGHT_SHIFT)]; |
15884
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
614 |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
615 ValueConsumer setVariableConsumer = new ValueConsumer() { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
616 |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
617 @Override |
17284
d21962ea9617
Remove ValueConsumer.visitValue(Value).
Josef Eisl <josef.eisl@jku.at>
parents:
17283
diff
changeset
|
618 public void visitValue(Value value, OperandMode mode, EnumSet<OperandFlag> flags) { |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
619 if (isVariable(value)) { |
15884
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
620 getOrCreateInterval(asVariable(value)); |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
621 } |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
622 } |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
623 }; |
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
624 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
625 // Assign IDs to LIR nodes and build a mapping, lirOps, from ID to LIRInstruction node. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
626 int numInstructions = 0; |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
627 for (AbstractBlock<?> block : sortedBlocks) { |
14806
a8723f1ff542
LIR renamed setter and getter functions.
Josef Eisl <josef.eisl@jku.at>
parents:
14789
diff
changeset
|
628 numInstructions += ir.getLIRforBlock(block).size(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
629 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
630 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
631 // initialize with correct length |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
632 opIdToInstructionMap = new LIRInstruction[numInstructions]; |
14789
1596a21c4194
Move remaining Block references in LinearScan to AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14152
diff
changeset
|
633 opIdToBlockMap = new AbstractBlock<?>[numInstructions]; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
634 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
635 int opId = 0; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
636 int index = 0; |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
637 for (AbstractBlock<?> block : sortedBlocks) { |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
638 blockData.put(block, new BlockData()); |
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
639 |
14806
a8723f1ff542
LIR renamed setter and getter functions.
Josef Eisl <josef.eisl@jku.at>
parents:
14789
diff
changeset
|
640 List<LIRInstruction> instructions = ir.getLIRforBlock(block); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
641 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
642 int numInst = instructions.size(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
643 for (int j = 0; j < numInst; j++) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
644 LIRInstruction op = instructions.get(j); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
645 op.setId(opId); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
646 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
647 opIdToInstructionMap[index] = op; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
648 opIdToBlockMap[index] = block; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
649 assert instructionForId(opId) == op : "must match"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
650 |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
651 op.visitEachTemp(setVariableConsumer); |
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
652 op.visitEachOutput(setVariableConsumer); |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
653 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
654 index++; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
655 opId += 2; // numbering of lirOps by two |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
656 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
657 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
658 assert index == numInstructions : "must match"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
659 assert (index << 1) == opId : "must match: " + (index << 1); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
660 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
661 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
662 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
663 * Computes local live sets (i.e. {@link BlockData#liveGen} and {@link BlockData#liveKill}) |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
664 * separately for each block. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
665 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
666 void computeLocalLiveSets() { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
667 int liveSize = liveSetSize(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
668 |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
669 intervalInLoop = new BitMap2D(operandSize(), numLoops()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
670 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
671 // iterate all blocks |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
672 for (final AbstractBlock<?> block : sortedBlocks) { |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
673 try (Indent indent = Debug.logAndIndent("compute local live sets for block %d", block.getId())) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
674 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
675 final BitSet liveGen = new BitSet(liveSize); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
676 final BitSet liveKill = new BitSet(liveSize); |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
677 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
678 List<LIRInstruction> instructions = ir.getLIRforBlock(block); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
679 int numInst = instructions.size(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
680 |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
681 ValueConsumer useConsumer = new ValueConsumer() { |
15887
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
682 |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
683 @Override |
17284
d21962ea9617
Remove ValueConsumer.visitValue(Value).
Josef Eisl <josef.eisl@jku.at>
parents:
17283
diff
changeset
|
684 public void visitValue(Value operand, OperandMode mode, EnumSet<OperandFlag> flags) { |
15887
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
685 if (isVariable(operand)) { |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
686 int operandNum = operandNumber(operand); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
687 if (!liveKill.get(operandNum)) { |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
688 liveGen.set(operandNum); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
689 Debug.log("liveGen for operand %d", operandNum); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
690 } |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
691 if (block.getLoop() != null) { |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
692 intervalInLoop.setBit(operandNum, block.getLoop().getIndex()); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
693 } |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
694 } |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
695 |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
696 if (DetailedAsserts.getValue()) { |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
697 verifyInput(block, liveKill, operand); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
698 } |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
699 } |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
700 }; |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
701 ValueConsumer stateConsumer = new ValueConsumer() { |
15887
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
702 |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
703 @Override |
17284
d21962ea9617
Remove ValueConsumer.visitValue(Value).
Josef Eisl <josef.eisl@jku.at>
parents:
17283
diff
changeset
|
704 public void visitValue(Value operand, OperandMode mode, EnumSet<OperandFlag> flags) { |
15887
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
705 int operandNum = operandNumber(operand); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
706 if (!liveKill.get(operandNum)) { |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
707 liveGen.set(operandNum); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
708 Debug.log("liveGen in state for operand %d", operandNum); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
709 } |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
710 } |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
711 }; |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
712 ValueConsumer defConsumer = new ValueConsumer() { |
15887
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
713 |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
714 @Override |
17284
d21962ea9617
Remove ValueConsumer.visitValue(Value).
Josef Eisl <josef.eisl@jku.at>
parents:
17283
diff
changeset
|
715 public void visitValue(Value operand, OperandMode mode, EnumSet<OperandFlag> flags) { |
15887
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
716 if (isVariable(operand)) { |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
717 int varNum = operandNumber(operand); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
718 liveKill.set(varNum); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
719 Debug.log("liveKill for operand %d", varNum); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
720 if (block.getLoop() != null) { |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
721 intervalInLoop.setBit(varNum, block.getLoop().getIndex()); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
722 } |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
723 } |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
724 |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
725 if (DetailedAsserts.getValue()) { |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
726 // fixed intervals are never live at block boundaries, so |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
727 // they need not be processed in live sets |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
728 // process them only in debug mode so that this can be checked |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
729 verifyTemp(liveKill, operand); |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
730 } |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
731 } |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
732 }; |
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
733 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
734 // iterate all instructions of the block |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
735 for (int j = 0; j < numInst; j++) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
736 final LIRInstruction op = instructions.get(j); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
737 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
738 try (Indent indent2 = Debug.logAndIndent("handle op %d", op.id())) { |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
739 op.visitEachInput(useConsumer); |
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
740 op.visitEachAlive(useConsumer); |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
741 // Add uses of live locals from interpreter's point of view for proper debug |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
742 // information generation |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
743 op.visitEachState(stateConsumer); |
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
744 op.visitEachTemp(defConsumer); |
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
745 op.visitEachOutput(defConsumer); |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
746 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
747 } // end of instruction iteration |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
748 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
749 BlockData blockSets = blockData.get(block); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
750 blockSets.liveGen = liveGen; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
751 blockSets.liveKill = liveKill; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
752 blockSets.liveIn = new BitSet(liveSize); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
753 blockSets.liveOut = new BitSet(liveSize); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
754 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
755 Debug.log("liveGen B%d %s", block.getId(), blockSets.liveGen); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
756 Debug.log("liveKill B%d %s", block.getId(), blockSets.liveKill); |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
757 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
758 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
759 } // end of block iteration |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
760 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
761 |
5541
b4c406861c33
More renamings to drop Ri* prefix completely. Deleted graph.BitMap class and replaced with java.util.BitSet.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5540
diff
changeset
|
762 private void verifyTemp(BitSet liveKill, Value operand) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
763 // fixed intervals are never live at block boundaries, so |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
764 // they need not be processed in live sets |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
765 // process them only in debug mode so that this can be checked |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
766 if (isRegister(operand)) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
767 if (isProcessed(operand)) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
768 liveKill.set(operandNumber(operand)); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
769 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
770 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
771 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
772 |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
773 private void verifyInput(AbstractBlock<?> block, BitSet liveKill, Value operand) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
774 // fixed intervals are never live at block boundaries, so |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
775 // they need not be processed in live sets. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
776 // this is checked by these assertions to be sure about it. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
777 // the entry block may have incoming |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
778 // values in registers, which is ok. |
14145
4ff08c0366ae
Encapsulate LIR class fields.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
14142
diff
changeset
|
779 if (isRegister(operand) && block != ir.getControlFlowGraph().getStartBlock()) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
780 if (isProcessed(operand)) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
781 assert liveKill.get(operandNumber(operand)) : "using fixed register that is not defined in this block"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
782 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
783 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
784 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
785 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
786 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
787 * Performs a backward dataflow analysis to compute global live sets (i.e. |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
788 * {@link BlockData#liveIn} and {@link BlockData#liveOut}) for each block. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
789 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
790 void computeGlobalLiveSets() { |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
791 try (Indent indent = Debug.logAndIndent("compute global live sets")) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
792 int numBlocks = blockCount(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
793 boolean changeOccurred; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
794 boolean changeOccurredInBlock; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
795 int iterationCount = 0; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
796 BitSet liveOut = new BitSet(liveSetSize()); // scratch set for calculations |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
797 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
798 // Perform a backward dataflow analysis to compute liveOut and liveIn for each block. |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
799 // The loop is executed until a fixpoint is reached (no changes in an iteration) |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
800 do { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
801 changeOccurred = false; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
802 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
803 try (Indent indent2 = Debug.logAndIndent("new iteration %d", iterationCount)) { |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
804 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
805 // iterate all blocks in reverse order |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
806 for (int i = numBlocks - 1; i >= 0; i--) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
807 AbstractBlock<?> block = blockAt(i); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
808 BlockData blockSets = blockData.get(block); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
809 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
810 changeOccurredInBlock = false; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
811 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
812 // liveOut(block) is the union of liveIn(sux), for successors sux of block |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
813 int n = block.getSuccessorCount(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
814 if (n > 0) { |
15850
9ce2ca72efef
small cleanup in LinearScan
Lukas Stadler <lukas.stadler@oracle.com>
parents:
15534
diff
changeset
|
815 liveOut.clear(); |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
816 // block has successors |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
817 if (n > 0) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
818 for (AbstractBlock<?> successor : block.getSuccessors()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
819 liveOut.or(blockData.get(successor).liveIn); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
820 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
821 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
822 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
823 if (!blockSets.liveOut.equals(liveOut)) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
824 // A change occurred. Swap the old and new live out |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
825 // sets to avoid copying. |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
826 BitSet temp = blockSets.liveOut; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
827 blockSets.liveOut = liveOut; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
828 liveOut = temp; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
829 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
830 changeOccurred = true; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
831 changeOccurredInBlock = true; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
832 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
833 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
834 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
835 if (iterationCount == 0 || changeOccurredInBlock) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
836 // liveIn(block) is the union of liveGen(block) with (liveOut(block) & |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
837 // !liveKill(block)) |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
838 // note: liveIn has to be computed only in first iteration |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
839 // or if liveOut has changed! |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
840 BitSet liveIn = blockSets.liveIn; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
841 liveIn.clear(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
842 liveIn.or(blockSets.liveOut); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
843 liveIn.andNot(blockSets.liveKill); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
844 liveIn.or(blockSets.liveGen); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
845 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
846 Debug.log("block %d: livein = %s, liveout = %s", block.getId(), liveIn, blockSets.liveOut); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
847 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
848 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
849 iterationCount++; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
850 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
851 if (changeOccurred && iterationCount > 50) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
852 throw new BailoutException("too many iterations in computeGlobalLiveSets"); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
853 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
854 } |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
855 } while (changeOccurred); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
856 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
857 if (DetailedAsserts.getValue()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
858 verifyLiveness(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
859 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
860 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
861 // check that the liveIn set of the first block is empty |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
862 AbstractBlock<?> startBlock = ir.getControlFlowGraph().getStartBlock(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
863 if (blockData.get(startBlock).liveIn.cardinality() != 0) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
864 if (DetailedAsserts.getValue()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
865 reportFailure(numBlocks); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
866 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
867 // bailout if this occurs in product mode. |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
868 throw new GraalInternalError("liveIn set of first block must be empty: " + blockData.get(startBlock).liveIn); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
869 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
870 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
871 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
872 |
14888
f6630873316b
Rename NodeLIRGenerator (and related classes and interfaces) to NodeLIRBuilder.
Josef Eisl <josef.eisl@jku.at>
parents:
14871
diff
changeset
|
873 private static NodeLIRBuilder getNodeLIRGeneratorFromDebugContext() { |
14070
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
874 if (Debug.isEnabled()) { |
14888
f6630873316b
Rename NodeLIRGenerator (and related classes and interfaces) to NodeLIRBuilder.
Josef Eisl <josef.eisl@jku.at>
parents:
14871
diff
changeset
|
875 NodeLIRBuilder lirGen = Debug.contextLookup(NodeLIRBuilder.class); |
15026 | 876 assert lirGen != null; |
14070
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
877 return lirGen; |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
878 } |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
879 return null; |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
880 } |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
881 |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
882 private static ValueNode getValueForOperandFromDebugContext(Value value) { |
14888
f6630873316b
Rename NodeLIRGenerator (and related classes and interfaces) to NodeLIRBuilder.
Josef Eisl <josef.eisl@jku.at>
parents:
14871
diff
changeset
|
883 NodeLIRBuilder gen = getNodeLIRGeneratorFromDebugContext(); |
14070
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
884 if (gen != null) { |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
885 return gen.valueForOperand(value); |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
886 } |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
887 return null; |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
888 } |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
889 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
890 private void reportFailure(int numBlocks) { |
14109
85969b1aba78
Use a forceLog scope for LinearScan.reportFailure. Remove @SuppressWarnings on DebugScope.scope
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
14070
diff
changeset
|
891 try (Scope s = Debug.forceLog()) { |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
892 try (Indent indent = Debug.logAndIndent("report failure")) { |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
893 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
894 BitSet startBlockLiveIn = blockData.get(ir.getControlFlowGraph().getStartBlock()).liveIn; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
895 try (Indent indent2 = Debug.logAndIndent("Error: liveIn set of first block must be empty (when this fails, variables are used before they are defined):")) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
896 for (int operandNum = startBlockLiveIn.nextSetBit(0); operandNum >= 0; operandNum = startBlockLiveIn.nextSetBit(operandNum + 1)) { |
17070
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
897 Interval interval = intervalFor(operandNum); |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
898 if (interval != null) { |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
899 Value operand = interval.operand; |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
900 Debug.log("var %d; operand=%s; node=%s", operandNum, operand, getValueForOperandFromDebugContext(operand)); |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
901 } else { |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
902 Debug.log("var %d; missing operand", operandNum); |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
903 } |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
904 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
905 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
906 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
907 // print some additional information to simplify debugging |
14109
85969b1aba78
Use a forceLog scope for LinearScan.reportFailure. Remove @SuppressWarnings on DebugScope.scope
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
14070
diff
changeset
|
908 for (int operandNum = startBlockLiveIn.nextSetBit(0); operandNum >= 0; operandNum = startBlockLiveIn.nextSetBit(operandNum + 1)) { |
17070
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
909 Interval interval = intervalFor(operandNum); |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
910 Value operand = null; |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
911 ValueNode valueForOperandFromDebugContext = null; |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
912 if (interval != null) { |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
913 operand = interval.operand; |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
914 valueForOperandFromDebugContext = getValueForOperandFromDebugContext(operand); |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
915 } |
6e45ae59781c
Let linear scan DetailedAsserts deal with missing intervals
Tom Rodriguez <tom.rodriguez@oracle.com>
parents:
16801
diff
changeset
|
916 try (Indent indent2 = Debug.logAndIndent("---- Detailed information for var %d; operand=%s; node=%s ----", operandNum, operand, valueForOperandFromDebugContext)) { |
14109
85969b1aba78
Use a forceLog scope for LinearScan.reportFailure. Remove @SuppressWarnings on DebugScope.scope
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
14070
diff
changeset
|
917 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
918 Deque<AbstractBlock<?>> definedIn = new ArrayDeque<>(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
919 HashSet<AbstractBlock<?>> usedIn = new HashSet<>(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
920 for (AbstractBlock<?> block : sortedBlocks) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
921 if (blockData.get(block).liveGen.get(operandNum)) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
922 usedIn.add(block); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
923 try (Indent indent3 = Debug.logAndIndent("used in block B%d", block.getId())) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
924 for (LIRInstruction ins : ir.getLIRforBlock(block)) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
925 try (Indent indent4 = Debug.logAndIndent("%d: %s", ins.id(), ins)) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
926 ins.forEachState(new ValueProcedure() { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
927 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
928 @Override |
17282
0578dc1c1a62
Remove ValueProcedure.doValue(Value value).
Josef Eisl <josef.eisl@jku.at>
parents:
17281
diff
changeset
|
929 public Value doValue(Value liveStateOperand, OperandMode mode, EnumSet<OperandFlag> flags) { |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
930 Debug.log("operand=%s", liveStateOperand); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
931 return liveStateOperand; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
932 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
933 }); |
14109
85969b1aba78
Use a forceLog scope for LinearScan.reportFailure. Remove @SuppressWarnings on DebugScope.scope
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
14070
diff
changeset
|
934 } |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
935 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
936 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
937 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
938 if (blockData.get(block).liveKill.get(operandNum)) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
939 definedIn.add(block); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
940 try (Indent indent3 = Debug.logAndIndent("defined in block B%d", block.getId())) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
941 for (LIRInstruction ins : ir.getLIRforBlock(block)) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
942 Debug.log("%d: %s", ins.id(), ins); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
943 } |
14109
85969b1aba78
Use a forceLog scope for LinearScan.reportFailure. Remove @SuppressWarnings on DebugScope.scope
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
14070
diff
changeset
|
944 } |
85969b1aba78
Use a forceLog scope for LinearScan.reportFailure. Remove @SuppressWarnings on DebugScope.scope
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
14070
diff
changeset
|
945 } |
85969b1aba78
Use a forceLog scope for LinearScan.reportFailure. Remove @SuppressWarnings on DebugScope.scope
Gilles Duboscq <duboscq@ssw.jku.at>
parents:
14070
diff
changeset
|
946 } |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
947 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
948 int[] hitCount = new int[numBlocks]; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
949 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
950 while (!definedIn.isEmpty()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
951 AbstractBlock<?> block = definedIn.removeFirst(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
952 usedIn.remove(block); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
953 for (AbstractBlock<?> successor : block.getSuccessors()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
954 if (successor.isLoopHeader()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
955 if (!block.isLoopEnd()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
956 definedIn.add(successor); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
957 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
958 } else { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
959 if (++hitCount[successor.getId()] == successor.getPredecessorCount()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
960 definedIn.add(successor); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
961 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
962 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
963 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
964 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
965 try (Indent indent3 = Debug.logAndIndent("**** offending usages are in: ")) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
966 for (AbstractBlock<?> block : usedIn) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
967 Debug.log("B%d", block.getId()); |
12569
1c8d5a0891b5
improved error reporting in LSRA
Doug Simon <doug.simon@oracle.com>
parents:
11537
diff
changeset
|
968 } |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
969 } |
12569
1c8d5a0891b5
improved error reporting in LSRA
Doug Simon <doug.simon@oracle.com>
parents:
11537
diff
changeset
|
970 } |
1c8d5a0891b5
improved error reporting in LSRA
Doug Simon <doug.simon@oracle.com>
parents:
11537
diff
changeset
|
971 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
972 } |
17211
1ac6b4879443
Enforce catch-blocks for Debug.Scopes with context objects.
Josef Eisl <josef.eisl@jku.at>
parents:
17195
diff
changeset
|
973 } catch (Throwable e) { |
1ac6b4879443
Enforce catch-blocks for Debug.Scopes with context objects.
Josef Eisl <josef.eisl@jku.at>
parents:
17195
diff
changeset
|
974 throw Debug.handle(e); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
975 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
976 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
977 |
7501
799dd373fcb6
Remove caching of sorted blocks in LSRA.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7499
diff
changeset
|
978 private void verifyLiveness() { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
979 // check that fixed intervals are not live at block boundaries |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
980 // (live set must be empty at fixed intervals) |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
981 for (AbstractBlock<?> block : sortedBlocks) { |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
982 for (int j = 0; j <= maxRegisterNumber(); j++) { |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
983 assert !blockData.get(block).liveIn.get(j) : "liveIn set of fixed register must be empty"; |
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
984 assert !blockData.get(block).liveOut.get(j) : "liveOut set of fixed register must be empty"; |
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
985 assert !blockData.get(block).liveGen.get(j) : "liveGen set of fixed register must be empty"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
986 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
987 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
988 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
989 |
16094
c0b8d395368b
Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents:
15927
diff
changeset
|
990 void addUse(AllocatableValue operand, int from, int to, RegisterPriority registerPriority, LIRKind kind) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
991 if (!isProcessed(operand)) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
992 return; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
993 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
994 |
8220
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
995 Interval interval = getOrCreateInterval(operand); |
16118
5cbaad0b7387
Verify usage of equals method in LIRKind.
Roland Schatz <roland.schatz@oracle.com>
parents:
16094
diff
changeset
|
996 if (!kind.equals(LIRKind.Illegal)) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
997 interval.setKind(kind); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
998 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
999 |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
1000 interval.addRange(from, to); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1001 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1002 // Register use position at even instruction id. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1003 interval.addUsePos(to & ~1, registerPriority); |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1004 |
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1005 Debug.log("add use: %s, from %d to %d (%s)", interval, from, to, registerPriority.name()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1006 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1007 |
16094
c0b8d395368b
Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents:
15927
diff
changeset
|
1008 void addTemp(AllocatableValue operand, int tempPos, RegisterPriority registerPriority, LIRKind kind) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1009 if (!isProcessed(operand)) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1010 return; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1011 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1012 |
8220
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1013 Interval interval = getOrCreateInterval(operand); |
16118
5cbaad0b7387
Verify usage of equals method in LIRKind.
Roland Schatz <roland.schatz@oracle.com>
parents:
16094
diff
changeset
|
1014 if (!kind.equals(LIRKind.Illegal)) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1015 interval.setKind(kind); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1016 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1017 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1018 interval.addRange(tempPos, tempPos + 1); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1019 interval.addUsePos(tempPos, registerPriority); |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1020 interval.addMaterializationValue(null); |
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1021 |
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1022 Debug.log("add temp: %s tempPos %d (%s)", interval, tempPos, RegisterPriority.MustHaveRegister.name()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1023 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1024 |
5539
bc647d8b0080
Renaming RiValue => Value.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5536
diff
changeset
|
1025 boolean isProcessed(Value operand) { |
5552
69a8969dbf40
Reduce public fields in api.code project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5547
diff
changeset
|
1026 return !isRegister(operand) || attributes(asRegister(operand)).isAllocatable(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1027 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1028 |
16094
c0b8d395368b
Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents:
15927
diff
changeset
|
1029 void addDef(AllocatableValue operand, LIRInstruction op, RegisterPriority registerPriority, LIRKind kind) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1030 if (!isProcessed(operand)) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1031 return; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1032 } |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1033 int defPos = op.id(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1034 |
8220
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1035 Interval interval = getOrCreateInterval(operand); |
16118
5cbaad0b7387
Verify usage of equals method in LIRKind.
Roland Schatz <roland.schatz@oracle.com>
parents:
16094
diff
changeset
|
1036 if (!kind.equals(LIRKind.Illegal)) { |
8220
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1037 interval.setKind(kind); |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1038 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1039 |
8220
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1040 Range r = interval.first(); |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1041 if (r.from <= defPos) { |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1042 // Update the starting point (when a range is first created for a use, its |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1043 // start is the beginning of the current block until a def is encountered.) |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1044 r.from = defPos; |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1045 interval.addUsePos(defPos, registerPriority); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1046 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1047 } else { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1048 // Dead value - make vacuous interval |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1049 // also add register priority for dead intervals |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1050 interval.addRange(defPos, defPos + 1); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1051 interval.addUsePos(defPos, registerPriority); |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1052 Debug.log("Warning: def of operand %s at %d occurs without use", operand, defPos); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1053 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1054 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1055 changeSpillDefinitionPos(interval, defPos); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1056 if (registerPriority == RegisterPriority.None && interval.spillState().ordinal() <= SpillState.StartInMemory.ordinal()) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1057 // detection of method-parameters and roundfp-results |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1058 interval.setSpillState(SpillState.StartInMemory); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1059 } |
14070
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
1060 interval.addMaterializationValue(LinearScan.getMaterializedValue(op, operand, interval)); |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1061 |
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1062 Debug.log("add def: %s defPos %d (%s)", interval, defPos, registerPriority.name()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1063 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1064 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1065 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1066 * Determines the register priority for an instruction's output/result operand. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1067 */ |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
1068 static RegisterPriority registerPriorityOfOutputOperand(LIRInstruction op) { |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4265
diff
changeset
|
1069 if (op instanceof MoveOp) { |
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4265
diff
changeset
|
1070 MoveOp move = (MoveOp) op; |
8353
98b90a7bb764
Only stack slots in caller frame are method arguments. Also optimize object arguments when the runtime supports it.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
8222
diff
changeset
|
1071 if (optimizeMethodArgument(move.getInput())) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1072 return RegisterPriority.None; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1073 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1074 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1075 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1076 // all other operands require a register |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1077 return RegisterPriority.MustHaveRegister; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1078 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1079 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1080 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
1081 * Determines the priority which with an instruction's input operand will be allocated a |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
1082 * register. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1083 */ |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
1084 static RegisterPriority registerPriorityOfInputOperand(EnumSet<OperandFlag> flags) { |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5711
diff
changeset
|
1085 if (flags.contains(OperandFlag.STACK)) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1086 return RegisterPriority.ShouldHaveRegister; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1087 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1088 // all other operands require a register |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1089 return RegisterPriority.MustHaveRegister; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1090 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1091 |
8353
98b90a7bb764
Only stack slots in caller frame are method arguments. Also optimize object arguments when the runtime supports it.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
8222
diff
changeset
|
1092 private static boolean optimizeMethodArgument(Value value) { |
8402
c0db24536e97
Remove flag and optimization for object method arguments in the register allocator. Needs more investigation of GC impact on HotSpot
Christian Wimmer <christian.wimmer@oracle.com>
parents:
8353
diff
changeset
|
1093 /* |
c0db24536e97
Remove flag and optimization for object method arguments in the register allocator. Needs more investigation of GC impact on HotSpot
Christian Wimmer <christian.wimmer@oracle.com>
parents:
8353
diff
changeset
|
1094 * Object method arguments that are passed on the stack are currently not optimized because |
c0db24536e97
Remove flag and optimization for object method arguments in the register allocator. Needs more investigation of GC impact on HotSpot
Christian Wimmer <christian.wimmer@oracle.com>
parents:
8353
diff
changeset
|
1095 * this requires that the runtime visits method arguments during stack walking. |
c0db24536e97
Remove flag and optimization for object method arguments in the register allocator. Needs more investigation of GC impact on HotSpot
Christian Wimmer <christian.wimmer@oracle.com>
parents:
8353
diff
changeset
|
1096 */ |
c0db24536e97
Remove flag and optimization for object method arguments in the register allocator. Needs more investigation of GC impact on HotSpot
Christian Wimmer <christian.wimmer@oracle.com>
parents:
8353
diff
changeset
|
1097 return isStackSlot(value) && asStackSlot(value).isInCallerFrame() && value.getKind() != Kind.Object; |
8353
98b90a7bb764
Only stack slots in caller frame are method arguments. Also optimize object arguments when the runtime supports it.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
8222
diff
changeset
|
1098 } |
98b90a7bb764
Only stack slots in caller frame are method arguments. Also optimize object arguments when the runtime supports it.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
8222
diff
changeset
|
1099 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1100 /** |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
1101 * Optimizes moves related to incoming stack based arguments. The interval for the destination |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
1102 * of such moves is assigned the stack slot (which is in the caller's frame) as its spill slot. |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1103 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1104 void handleMethodArguments(LIRInstruction op) { |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4265
diff
changeset
|
1105 if (op instanceof MoveOp) { |
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4265
diff
changeset
|
1106 MoveOp move = (MoveOp) op; |
8353
98b90a7bb764
Only stack slots in caller frame are method arguments. Also optimize object arguments when the runtime supports it.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
8222
diff
changeset
|
1107 if (optimizeMethodArgument(move.getInput())) { |
98b90a7bb764
Only stack slots in caller frame are method arguments. Also optimize object arguments when the runtime supports it.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
8222
diff
changeset
|
1108 StackSlot slot = asStackSlot(move.getInput()); |
9855
6898d8995866
converted more options from GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9632
diff
changeset
|
1109 if (DetailedAsserts.getValue()) { |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4265
diff
changeset
|
1110 assert op.id() > 0 : "invalid id"; |
7497
0f8c6dbf68be
Code clean up and documentation for ComputeBlockOrder class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
6582
diff
changeset
|
1111 assert blockForId(op.id()).getPredecessorCount() == 0 : "move from stack must be in first block"; |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4265
diff
changeset
|
1112 assert isVariable(move.getResult()) : "result of move must be a variable"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1113 |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1114 Debug.log("found move from stack slot %s to %s", slot, move.getResult()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1115 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1116 |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4265
diff
changeset
|
1117 Interval interval = intervalFor(move.getResult()); |
4213
e4cfa571d8c4
Do not emit stack-to-stack moves.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4207
diff
changeset
|
1118 interval.setSpillSlot(slot); |
e4cfa571d8c4
Do not emit stack-to-stack moves.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4207
diff
changeset
|
1119 interval.assignLocation(slot); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1120 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1121 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1122 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1123 |
8220
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1124 void addRegisterHint(final LIRInstruction op, final Value targetValue, OperandMode mode, EnumSet<OperandFlag> flags, final boolean hintAtDef) { |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5711
diff
changeset
|
1125 if (flags.contains(OperandFlag.HINT) && isVariableOrRegister(targetValue)) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1126 |
4262
744dade427b8
another batch of work towards GraalCompilation removal:
Lukas Stadler <lukas.stadler@jku.at>
parents:
4260
diff
changeset
|
1127 op.forEachRegisterHint(targetValue, mode, new ValueProcedure() { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
1128 |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
1129 @Override |
17282
0578dc1c1a62
Remove ValueProcedure.doValue(Value value).
Josef Eisl <josef.eisl@jku.at>
parents:
17281
diff
changeset
|
1130 public Value doValue(Value registerHint, OperandMode valueMode, EnumSet<OperandFlag> valueFlags) { |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
1131 if (isVariableOrRegister(registerHint)) { |
9297
a5f2b9012865
Interval locations can only be AllocatableValues.
Roland Schatz <roland.schatz@oracle.com>
parents:
8402
diff
changeset
|
1132 Interval from = getOrCreateInterval((AllocatableValue) registerHint); |
a5f2b9012865
Interval locations can only be AllocatableValues.
Roland Schatz <roland.schatz@oracle.com>
parents:
8402
diff
changeset
|
1133 Interval to = getOrCreateInterval((AllocatableValue) targetValue); |
8220
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1134 |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1135 // hints always point from def to use |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1136 if (hintAtDef) { |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
1137 to.setLocationHint(from); |
8220
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1138 } else { |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1139 from.setLocationHint(to); |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
1140 } |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1141 Debug.log("operation at opId %d: added hint from interval %d to %d", op.id(), from.operandNumber, to.operandNumber); |
8220
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1142 |
2c5df42999dd
Fix hinting in register allocator.
Roland Schatz <roland.schatz@oracle.com>
parents:
7648
diff
changeset
|
1143 return registerHint; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1144 } |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
1145 return null; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1146 } |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
1147 }); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1148 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1149 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1150 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1151 void buildIntervals() { |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1152 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1153 try (Indent indent = Debug.logAndIndent("build intervals")) { |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1154 InstructionValueConsumer outputConsumer = new InstructionValueConsumer() { |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1155 |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1156 @Override |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1157 public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet<OperandFlag> flags) { |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1158 if (isVariableOrRegister(operand)) { |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1159 addDef((AllocatableValue) operand, op, registerPriorityOfOutputOperand(op), operand.getLIRKind()); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1160 addRegisterHint(op, operand, mode, flags, true); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1161 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1162 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1163 }; |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1164 |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1165 InstructionValueConsumer tempConsumer = new InstructionValueConsumer() { |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1166 |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1167 @Override |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1168 public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet<OperandFlag> flags) { |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1169 if (isVariableOrRegister(operand)) { |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1170 addTemp((AllocatableValue) operand, op.id(), RegisterPriority.MustHaveRegister, operand.getLIRKind()); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1171 addRegisterHint(op, operand, mode, flags, false); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1172 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1173 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1174 }; |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1175 |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1176 InstructionValueConsumer aliveConsumer = new InstructionValueConsumer() { |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1177 |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1178 @Override |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1179 public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet<OperandFlag> flags) { |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1180 if (isVariableOrRegister(operand)) { |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1181 RegisterPriority p = registerPriorityOfInputOperand(flags); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1182 final int opId = op.id(); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1183 final int blockFrom = getFirstLirInstructionId((blockForId(opId))); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1184 addUse((AllocatableValue) operand, blockFrom, opId + 1, p, operand.getLIRKind()); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1185 addRegisterHint(op, operand, mode, flags, false); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1186 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1187 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1188 }; |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1189 |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1190 InstructionValueConsumer inputConsumer = new InstructionValueConsumer() { |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1191 |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1192 @Override |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1193 public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet<OperandFlag> flags) { |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1194 if (isVariableOrRegister(operand)) { |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1195 final int opId = op.id(); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1196 final int blockFrom = getFirstLirInstructionId((blockForId(opId))); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1197 RegisterPriority p = registerPriorityOfInputOperand(flags); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1198 addUse((AllocatableValue) operand, blockFrom, opId, p, operand.getLIRKind()); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1199 addRegisterHint(op, operand, mode, flags, false); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1200 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1201 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1202 }; |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1203 |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1204 InstructionValueConsumer stateProc = new InstructionValueConsumer() { |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1205 |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1206 @Override |
17283
e8b80721524d
Remove InstructionValueConsumer.visitValue(LIRInstruction, Value).
Josef Eisl <josef.eisl@jku.at>
parents:
17282
diff
changeset
|
1207 public void visitValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet<OperandFlag> flags) { |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1208 final int opId = op.id(); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1209 final int blockFrom = getFirstLirInstructionId((blockForId(opId))); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1210 addUse((AllocatableValue) operand, blockFrom, opId + 1, RegisterPriority.None, operand.getLIRKind()); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1211 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1212 }; |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1213 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1214 // create a list with all caller-save registers (cpu, fpu, xmm) |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1215 Register[] callerSaveRegs = frameMap.registerConfig.getCallerSaveRegisters(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1216 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1217 // iterate all blocks in reverse order |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1218 for (int i = blockCount() - 1; i >= 0; i--) { |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1219 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1220 AbstractBlock<?> block = blockAt(i); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1221 try (Indent indent2 = Debug.logAndIndent("handle block %d", block.getId())) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1222 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1223 List<LIRInstruction> instructions = ir.getLIRforBlock(block); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1224 final int blockFrom = getFirstLirInstructionId(block); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1225 int blockTo = getLastLirInstructionId(block); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1226 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1227 assert blockFrom == instructions.get(0).id(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1228 assert blockTo == instructions.get(instructions.size() - 1).id(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1229 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1230 // Update intervals for operands live at the end of this block; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1231 BitSet live = blockData.get(block).liveOut; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1232 for (int operandNum = live.nextSetBit(0); operandNum >= 0; operandNum = live.nextSetBit(operandNum + 1)) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1233 assert live.get(operandNum) : "should not stop here otherwise"; |
15884
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
1234 AllocatableValue operand = intervalFor(operandNum).operand; |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1235 Debug.log("live in %d: %s", operandNum, operand); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1236 |
16094
c0b8d395368b
Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents:
15927
diff
changeset
|
1237 addUse(operand, blockFrom, blockTo + 2, RegisterPriority.None, LIRKind.Illegal); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1238 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1239 // add special use positions for loop-end blocks when the |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1240 // interval is used anywhere inside this loop. It's possible |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1241 // that the block was part of a non-natural loop, so it might |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1242 // have an invalid loop index. |
15534
4bd6ad45ee0a
Encapsulate members of Loop.
Josef Eisl <josef.eisl@jku.at>
parents:
15193
diff
changeset
|
1243 if (block.isLoopEnd() && block.getLoop() != null && isIntervalInLoop(operandNum, block.getLoop().getIndex())) { |
15887
839ea165f816
LinearScan: Small cleanup.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15886
diff
changeset
|
1244 intervalFor(operandNum).addUsePos(blockTo + 1, RegisterPriority.LiveAtLoopEnd); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1245 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1246 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1247 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1248 // iterate all instructions of the block in reverse order. |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1249 // definitions of intervals are processed before uses |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1250 for (int j = instructions.size() - 1; j >= 0; j--) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1251 final LIRInstruction op = instructions.get(j); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1252 final int opId = op.id(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1253 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1254 try (Indent indent3 = Debug.logAndIndent("handle inst %d: %s", opId, op)) { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
1255 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1256 // add a temp range for each register if operation destroys |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1257 // caller-save registers |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1258 if (op.destroysCallerSavedRegisters()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1259 for (Register r : callerSaveRegs) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1260 if (attributes(r).isAllocatable()) { |
16094
c0b8d395368b
Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents:
15927
diff
changeset
|
1261 addTemp(r.asValue(), opId, RegisterPriority.None, LIRKind.Illegal); |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1262 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1263 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1264 Debug.log("operation destroys all caller-save registers"); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1265 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1266 |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1267 op.visitEachOutput(outputConsumer); |
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1268 op.visitEachTemp(tempConsumer); |
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1269 op.visitEachAlive(aliveConsumer); |
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1270 op.visitEachInput(inputConsumer); |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
1271 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1272 // Add uses of live locals from interpreter's point of view for proper |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1273 // debug information generation |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1274 // Treat these operands as temp values (if the live range is extended |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1275 // to a call site, the value would be in a register at |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1276 // the call otherwise) |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
1277 op.visitEachState(stateProc); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1278 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1279 // special steps for some instructions (especially moves) |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1280 handleMethodArguments(op); |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1281 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1282 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1283 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1284 } // end of instruction iteration |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1285 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1286 } // end of block iteration |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1287 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1288 // add the range [0, 1] to all fixed intervals. |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1289 // the register allocator need not handle unhandled fixed intervals |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1290 for (Interval interval : intervals) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1291 if (interval != null && isRegister(interval.operand)) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1292 interval.addRange(0, 1); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1293 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1294 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1295 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1296 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1297 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1298 // * Phase 5: actual register allocation |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1299 |
4142
bc8527f3071c
Adjust code base to new level of warnings.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
3733
diff
changeset
|
1300 private static boolean isSorted(Interval[] intervals) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1301 int from = -1; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1302 for (Interval interval : intervals) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1303 assert interval != null; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1304 assert from <= interval.from(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1305 from = interval.from(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1306 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1307 return true; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1308 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1309 |
4142
bc8527f3071c
Adjust code base to new level of warnings.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
3733
diff
changeset
|
1310 static Interval addToList(Interval first, Interval prev, Interval interval) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1311 Interval newFirst = first; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1312 if (prev != null) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1313 prev.next = interval; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1314 } else { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1315 newFirst = interval; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1316 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1317 return newFirst; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1318 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1319 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1320 Interval.Pair createUnhandledLists(IntervalPredicate isList1, IntervalPredicate isList2) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1321 assert isSorted(sortedIntervals) : "interval list is not sorted"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1322 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1323 Interval list1 = Interval.EndMarker; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1324 Interval list2 = Interval.EndMarker; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1325 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1326 Interval list1Prev = null; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1327 Interval list2Prev = null; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1328 Interval v; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1329 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1330 int n = sortedIntervals.length; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1331 for (int i = 0; i < n; i++) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1332 v = sortedIntervals[i]; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1333 if (v == null) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1334 continue; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1335 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1336 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1337 if (isList1.apply(v)) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1338 list1 = addToList(list1, list1Prev, v); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1339 list1Prev = v; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1340 } else if (isList2 == null || isList2.apply(v)) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1341 list2 = addToList(list2, list2Prev, v); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1342 list2Prev = v; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1343 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1344 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1345 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1346 if (list1Prev != null) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1347 list1Prev.next = Interval.EndMarker; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1348 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1349 if (list2Prev != null) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1350 list2Prev.next = Interval.EndMarker; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1351 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1352 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1353 assert list1Prev == null || list1Prev.next == Interval.EndMarker : "linear list ends not with sentinel"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1354 assert list2Prev == null || list2Prev.next == Interval.EndMarker : "linear list ends not with sentinel"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1355 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1356 return new Interval.Pair(list1, list2); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1357 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1358 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1359 void sortIntervalsBeforeAllocation() { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1360 int sortedLen = 0; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1361 for (Interval interval : intervals) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1362 if (interval != null) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1363 sortedLen++; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1364 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1365 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1366 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1367 Interval[] sortedList = new Interval[sortedLen]; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1368 int sortedIdx = 0; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1369 int sortedFromMax = -1; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1370 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1371 // special sorting algorithm: the original interval-list is almost sorted, |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1372 // only some intervals are swapped. So this is much faster than a complete QuickSort |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1373 for (Interval interval : intervals) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1374 if (interval != null) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1375 int from = interval.from(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1376 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1377 if (sortedFromMax <= from) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1378 sortedList[sortedIdx++] = interval; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1379 sortedFromMax = interval.from(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1380 } else { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1381 // the assumption that the intervals are already sorted failed, |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1382 // so this interval must be sorted in manually |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1383 int j; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1384 for (j = sortedIdx - 1; j >= 0 && from < sortedList[j].from(); j--) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1385 sortedList[j + 1] = sortedList[j]; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1386 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1387 sortedList[j + 1] = interval; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1388 sortedIdx++; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1389 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1390 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1391 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1392 sortedIntervals = sortedList; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1393 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1394 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1395 void sortIntervalsAfterAllocation() { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1396 if (firstDerivedIntervalIndex == -1) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1397 // no intervals have been added during allocation, so sorted list is already up to date |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1398 return; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1399 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1400 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1401 Interval[] oldList = sortedIntervals; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1402 Interval[] newList = Arrays.copyOfRange(intervals, firstDerivedIntervalIndex, intervalsSize); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1403 int oldLen = oldList.length; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1404 int newLen = newList.length; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1405 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1406 // conventional sort-algorithm for new intervals |
15886
e5e7d9dfff1a
LinearScan: Clean up interval comparator and replace with lambda form.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15885
diff
changeset
|
1407 Arrays.sort(newList, (Interval a, Interval b) -> a.from() - b.from()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1408 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1409 // merge old and new list (both already sorted) into one combined list |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1410 Interval[] combinedList = new Interval[oldLen + newLen]; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1411 int oldIdx = 0; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1412 int newIdx = 0; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1413 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1414 while (oldIdx + newIdx < combinedList.length) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1415 if (newIdx >= newLen || (oldIdx < oldLen && oldList[oldIdx].from() <= newList[newIdx].from())) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1416 combinedList[oldIdx + newIdx] = oldList[oldIdx]; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1417 oldIdx++; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1418 } else { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1419 combinedList[oldIdx + newIdx] = newList[newIdx]; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1420 newIdx++; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1421 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1422 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1423 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1424 sortedIntervals = combinedList; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1425 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1426 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1427 public void allocateRegisters() { |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1428 try (Indent indent = Debug.logAndIndent("allocate registers")) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1429 Interval precoloredIntervals; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1430 Interval notPrecoloredIntervals; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1431 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1432 Interval.Pair result = createUnhandledLists(IS_PRECOLORED_INTERVAL, IS_VARIABLE_INTERVAL); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1433 precoloredIntervals = result.first; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1434 notPrecoloredIntervals = result.second; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1435 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1436 // allocate cpu registers |
15927
96229f219351
LSRA: add OptimizingLinearScanWalker.
Josef Eisl <josef.eisl@jku.at>
parents:
15920
diff
changeset
|
1437 LinearScanWalker lsw; |
96229f219351
LSRA: add OptimizingLinearScanWalker.
Josef Eisl <josef.eisl@jku.at>
parents:
15920
diff
changeset
|
1438 if (OptimizingLinearScanWalker.Options.LSRAOptimization.getValue()) { |
96229f219351
LSRA: add OptimizingLinearScanWalker.
Josef Eisl <josef.eisl@jku.at>
parents:
15920
diff
changeset
|
1439 lsw = new OptimizingLinearScanWalker(this, precoloredIntervals, notPrecoloredIntervals); |
96229f219351
LSRA: add OptimizingLinearScanWalker.
Josef Eisl <josef.eisl@jku.at>
parents:
15920
diff
changeset
|
1440 } else { |
96229f219351
LSRA: add OptimizingLinearScanWalker.
Josef Eisl <josef.eisl@jku.at>
parents:
15920
diff
changeset
|
1441 lsw = new LinearScanWalker(this, precoloredIntervals, notPrecoloredIntervals); |
96229f219351
LSRA: add OptimizingLinearScanWalker.
Josef Eisl <josef.eisl@jku.at>
parents:
15920
diff
changeset
|
1442 } |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1443 lsw.walk(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1444 lsw.finishAllocation(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1445 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1446 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1447 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1448 // * Phase 6: resolve data flow |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1449 // (insert moves at edges between blocks if intervals have been split) |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1450 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1451 // wrapper for Interval.splitChildAtOpId that performs a bailout in product mode |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1452 // instead of returning null |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1453 Interval splitChildAtOpId(Interval interval, int opId, LIRInstruction.OperandMode mode) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1454 Interval result = interval.getSplitChildAtOpId(opId, mode, this); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1455 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1456 if (result != null) { |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1457 Debug.log("Split child at pos %d of interval %s is %s", opId, interval, result); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1458 return result; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1459 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1460 |
5547
b6617d13ea44
Dropping Ci* prefixes. Some additional renamings in the api.code interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5542
diff
changeset
|
1461 throw new BailoutException("LinearScan: interval is null"); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1462 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1463 |
15884
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
1464 Interval intervalAtBlockBegin(AbstractBlock<?> block, int operandNumber) { |
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
1465 return splitChildAtOpId(intervalFor(operandNumber), getFirstLirInstructionId(block), LIRInstruction.OperandMode.DEF); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1466 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1467 |
15884
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
1468 Interval intervalAtBlockEnd(AbstractBlock<?> block, int operandNumber) { |
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
1469 return splitChildAtOpId(intervalFor(operandNumber), getLastLirInstructionId(block) + 1, LIRInstruction.OperandMode.DEF); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1470 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1471 |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
1472 void resolveCollectMappings(AbstractBlock<?> fromBlock, AbstractBlock<?> toBlock, MoveResolver moveResolver) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1473 assert moveResolver.checkEmpty(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1474 |
4206
430b5db3e6f8
Remove CiVariable from the CRI
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4199
diff
changeset
|
1475 int numOperands = operandSize(); |
5541
b4c406861c33
More renamings to drop Ri* prefix completely. Deleted graph.BitMap class and replaced with java.util.BitSet.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5540
diff
changeset
|
1476 BitSet liveAtEdge = blockData.get(toBlock).liveIn; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1477 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1478 // visit all variables for which the liveAtEdge bit is set |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1479 for (int operandNum = liveAtEdge.nextSetBit(0); operandNum >= 0; operandNum = liveAtEdge.nextSetBit(operandNum + 1)) { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1480 assert operandNum < numOperands : "live information set for not exisiting interval"; |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
1481 assert blockData.get(fromBlock).liveOut.get(operandNum) && blockData.get(toBlock).liveIn.get(operandNum) : "interval not live at this edge"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1482 |
15884
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
1483 Interval fromInterval = intervalAtBlockEnd(fromBlock, operandNum); |
0e6f83eeb0ab
Clean up in LinearScan: Remove the need for a mapping of variable index to variable object.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
15850
diff
changeset
|
1484 Interval toInterval = intervalAtBlockBegin(toBlock, operandNum); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1485 |
9632
97db51025787
Value: use `equals()' instead of object equality
Bernhard Urban <bernhard.urban@jku.at>
parents:
9628
diff
changeset
|
1486 if (fromInterval != toInterval && !fromInterval.location().equals(toInterval.location())) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1487 // need to insert move instruction |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1488 moveResolver.addMapping(fromInterval, toInterval); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1489 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1490 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1491 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1492 |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
1493 void resolveFindInsertPos(AbstractBlock<?> fromBlock, AbstractBlock<?> toBlock, MoveResolver moveResolver) { |
7497
0f8c6dbf68be
Code clean up and documentation for ComputeBlockOrder class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
6582
diff
changeset
|
1494 if (fromBlock.getSuccessorCount() <= 1) { |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1495 Debug.log("inserting moves at end of fromBlock B%d", fromBlock.getId()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1496 |
14806
a8723f1ff542
LIR renamed setter and getter functions.
Josef Eisl <josef.eisl@jku.at>
parents:
14789
diff
changeset
|
1497 List<LIRInstruction> instructions = ir.getLIRforBlock(fromBlock); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1498 LIRInstruction instr = instructions.get(instructions.size() - 1); |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4265
diff
changeset
|
1499 if (instr instanceof StandardOp.JumpOp) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1500 // insert moves before branch |
6411
c5afcc2ebd3d
change of project structure: separate compiler and LIR, put EA into separate project
Lukas Stadler <lukas.stadler@jku.at>
parents:
6352
diff
changeset
|
1501 moveResolver.setInsertPosition(instructions, instructions.size() - 1); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1502 } else { |
6411
c5afcc2ebd3d
change of project structure: separate compiler and LIR, put EA into separate project
Lukas Stadler <lukas.stadler@jku.at>
parents:
6352
diff
changeset
|
1503 moveResolver.setInsertPosition(instructions, instructions.size()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1504 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1505 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1506 } else { |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1507 Debug.log("inserting moves at beginning of toBlock B%d", toBlock.getId()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1508 |
9855
6898d8995866
converted more options from GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9632
diff
changeset
|
1509 if (DetailedAsserts.getValue()) { |
14806
a8723f1ff542
LIR renamed setter and getter functions.
Josef Eisl <josef.eisl@jku.at>
parents:
14789
diff
changeset
|
1510 assert ir.getLIRforBlock(fromBlock).get(0) instanceof StandardOp.LabelOp : "block does not start with a label"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1511 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1512 // because the number of predecessor edges matches the number of |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1513 // successor edges, blocks which are reached by switch statements |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1514 // may have be more than one predecessor but it will be guaranteed |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1515 // that all predecessors will be the same. |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
1516 for (AbstractBlock<?> predecessor : toBlock.getPredecessors()) { |
7497
0f8c6dbf68be
Code clean up and documentation for ComputeBlockOrder class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
6582
diff
changeset
|
1517 assert fromBlock == predecessor : "all critical edges must be broken"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1518 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1519 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1520 |
14806
a8723f1ff542
LIR renamed setter and getter functions.
Josef Eisl <josef.eisl@jku.at>
parents:
14789
diff
changeset
|
1521 moveResolver.setInsertPosition(ir.getLIRforBlock(toBlock), 1); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1522 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1523 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1524 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1525 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1526 * Inserts necessary moves (spilling or reloading) at edges between blocks for intervals that |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1527 * have been split. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1528 */ |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1529 void resolveDataFlow() { |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1530 try (Indent indent = Debug.logAndIndent("resolve data flow")) { |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1531 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1532 int numBlocks = blockCount(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1533 MoveResolver moveResolver = new MoveResolver(this); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1534 BitSet blockCompleted = new BitSet(numBlocks); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1535 BitSet alreadyResolved = new BitSet(numBlocks); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1536 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1537 for (AbstractBlock<?> block : sortedBlocks) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1538 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1539 // check if block has only one predecessor and only one successor |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1540 if (block.getPredecessorCount() == 1 && block.getSuccessorCount() == 1) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1541 List<LIRInstruction> instructions = ir.getLIRforBlock(block); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1542 assert instructions.get(0) instanceof StandardOp.LabelOp : "block must start with label"; |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1543 assert instructions.get(instructions.size() - 1) instanceof StandardOp.JumpOp : "block with successor must end with unconditional jump"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1544 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1545 // check if block is empty (only label and branch) |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1546 if (instructions.size() == 2) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1547 AbstractBlock<?> pred = block.getPredecessors().iterator().next(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1548 AbstractBlock<?> sux = block.getSuccessors().iterator().next(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1549 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1550 // prevent optimization of two consecutive blocks |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1551 if (!blockCompleted.get(pred.getLinearScanNumber()) && !blockCompleted.get(sux.getLinearScanNumber())) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1552 Debug.log(" optimizing empty block B%d (pred: B%d, sux: B%d)", block.getId(), pred.getId(), sux.getId()); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1553 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1554 blockCompleted.set(block.getLinearScanNumber()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1555 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1556 // directly resolve between pred and sux (without looking |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1557 // at the empty block |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1558 // between) |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1559 resolveCollectMappings(pred, sux, moveResolver); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1560 if (moveResolver.hasMappings()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1561 moveResolver.setInsertPosition(instructions, 1); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1562 moveResolver.resolveAndAppendMoves(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1563 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1564 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1565 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1566 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1567 } |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1568 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1569 for (AbstractBlock<?> fromBlock : sortedBlocks) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1570 if (!blockCompleted.get(fromBlock.getLinearScanNumber())) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1571 alreadyResolved.clear(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1572 alreadyResolved.or(blockCompleted); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1573 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1574 for (AbstractBlock<?> toBlock : fromBlock.getSuccessors()) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1575 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1576 // check for duplicate edges between the same blocks (can happen with switch |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1577 // blocks) |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1578 if (!alreadyResolved.get(toBlock.getLinearScanNumber())) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1579 Debug.log("processing edge between B%d and B%d", fromBlock.getId(), toBlock.getId()); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1580 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1581 alreadyResolved.set(toBlock.getLinearScanNumber()); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1582 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1583 // collect all intervals that have been split between |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1584 // fromBlock and toBlock |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1585 resolveCollectMappings(fromBlock, toBlock, moveResolver); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1586 if (moveResolver.hasMappings()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1587 resolveFindInsertPos(fromBlock, toBlock, moveResolver); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1588 moveResolver.resolveAndAppendMoves(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1589 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1590 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1591 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1592 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1593 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1594 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1595 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1596 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1597 // * Phase 7: assign register numbers back to LIR |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1598 // (includes computation of debug information and oop maps) |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1599 |
5547
b6617d13ea44
Dropping Ci* prefixes. Some additional renamings in the api.code interface.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5542
diff
changeset
|
1600 static StackSlot canonicalSpillOpr(Interval interval) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1601 assert interval.spillSlot() != null : "canonical spill slot not set"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1602 return interval.spillSlot(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1603 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1604 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1605 /** |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1606 * Assigns the allocated location for an LIR instruction operand back into the instruction. |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1607 * |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1608 * @param operand an LIR instruction operand |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1609 * @param opId the id of the LIR instruction using {@code operand} |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1610 * @param mode the usage mode for {@code operand} by the instruction |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1611 * @return the location assigned for the operand |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1612 */ |
5539
bc647d8b0080
Renaming RiValue => Value.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5536
diff
changeset
|
1613 private Value colorLirOperand(Variable operand, int opId, OperandMode mode) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1614 Interval interval = intervalFor(operand); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1615 assert interval != null : "interval must exist"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1616 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1617 if (opId != -1) { |
9855
6898d8995866
converted more options from GraalOptions to new system (GRAAL-27)
Doug Simon <doug.simon@oracle.com>
parents:
9632
diff
changeset
|
1618 if (DetailedAsserts.getValue()) { |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
1619 AbstractBlock<?> block = blockForId(opId); |
7497
0f8c6dbf68be
Code clean up and documentation for ComputeBlockOrder class.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
6582
diff
changeset
|
1620 if (block.getSuccessorCount() <= 1 && opId == getLastLirInstructionId(block)) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1621 // check if spill moves could have been appended at the end of this block, but |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
1622 // before the branch instruction. So the split child information for this branch |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
1623 // would |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1624 // be incorrect. |
14806
a8723f1ff542
LIR renamed setter and getter functions.
Josef Eisl <josef.eisl@jku.at>
parents:
14789
diff
changeset
|
1625 LIRInstruction instr = ir.getLIRforBlock(block).get(ir.getLIRforBlock(block).size() - 1); |
4323
df5547057954
Remove LIROpcode and use non-anonymous subclasses of LIRInstruction
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4265
diff
changeset
|
1626 if (instr instanceof StandardOp.JumpOp) { |
4435
57cb8ec5f6bb
Restructure block and control flow graph data structures
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4394
diff
changeset
|
1627 if (blockData.get(block).liveOut.get(operandNumber(operand))) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1628 assert false : "can't get split child for the last branch of a block because the information would be incorrect (moves are inserted before the branch in resolveDataFlow)"; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1629 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1630 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1631 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1632 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1633 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1634 // operands are not changed when an interval is split during allocation, |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1635 // so search the right interval here |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1636 interval = splitChildAtOpId(interval, opId, mode); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1637 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1638 |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1639 if (isIllegal(interval.location()) && interval.canMaterialize()) { |
13377
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1640 assert mode != OperandMode.DEF; |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1641 return interval.getMaterializedValue(); |
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1642 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1643 return interval.location(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1644 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1645 |
13377
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1646 private boolean isMaterialized(AllocatableValue operand, int opId, OperandMode mode) { |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1647 Interval interval = intervalFor(operand); |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1648 assert interval != null : "interval must exist"; |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1649 |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1650 if (opId != -1) { |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1651 // operands are not changed when an interval is split during allocation, |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1652 // so search the right interval here |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1653 interval = splitChildAtOpId(interval, opId, mode); |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1654 } |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1655 |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1656 return isIllegal(interval.location()) && interval.canMaterialize(); |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1657 } |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1658 |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1659 protected IntervalWalker initIntervalWalker(IntervalPredicate predicate) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1660 // setup lists of potential oops for walking |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1661 Interval oopIntervals; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1662 Interval nonOopIntervals; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1663 |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1664 oopIntervals = createUnhandledLists(predicate, null).first; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1665 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1666 // intervals that have no oops inside need not to be processed. |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1667 // to ensure a walking until the last instruction id, add a dummy interval |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1668 // with a high operation id |
6539
2463eb24b644
Cleanup of Graal API: Rename methods so that it follows the getXxx naming convention and so that they are similar to the names of the java.lang.reflect classes. Remove unused methods.
Christian Wimmer <christian.wimmer@oracle.com>
parents:
6529
diff
changeset
|
1669 nonOopIntervals = new Interval(Value.ILLEGAL, -1); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1670 nonOopIntervals.addRange(Integer.MAX_VALUE - 2, Integer.MAX_VALUE - 1); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1671 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1672 return new IntervalWalker(this, oopIntervals, nonOopIntervals); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1673 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1674 |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1675 /** |
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1676 * Visits all intervals for a frame state. The frame state use this information to build the OOP |
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1677 * maps. |
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1678 */ |
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1679 void markFrameLocations(IntervalWalker iw, LIRInstruction op, LIRFrameState info) { |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1680 Debug.log("creating oop map at opId %d", op.id()); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1681 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1682 // walk before the current operation . intervals that start at |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1683 // the operation (i.e. output operands of the operation) are not |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1684 // included in the oop map |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1685 iw.walkBefore(op.id()); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1686 |
16368
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1687 // TODO(je) we could pass this as parameter |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1688 AbstractBlock<?> block = blockForId(op.id()); |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1689 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1690 // Iterate through active intervals |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1691 for (Interval interval = iw.activeLists.get(RegisterBinding.Fixed); interval != Interval.EndMarker; interval = interval.next) { |
5539
bc647d8b0080
Renaming RiValue => Value.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5536
diff
changeset
|
1692 Value operand = interval.operand; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1693 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1694 assert interval.currentFrom() <= op.id() && op.id() <= interval.currentTo() : "interval should not be active otherwise"; |
4183
9e0c1b4cfef5
Move all isXxx and asXxx out of CiValue and into their own util class.
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4181
diff
changeset
|
1695 assert isVariable(interval.operand) : "fixed interval found"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1696 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1697 // Check if this range covers the instruction. Intervals that |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1698 // start or end at the current operation are not included in the |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1699 // oop map, except in the case of patching moves. For patching |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1700 // moves, any intervals which end at this instruction are included |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1701 // in the oop map since we may safepoint while doing the patch |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1702 // before we've consumed the inputs. |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1703 if (op.id() < interval.currentTo() && !isIllegal(interval.location())) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1704 // caller-save registers must not be included into oop-maps at calls |
9454
85a836bcd796
renaming for improved clarity: hasCall -> destroysCallerSavedRegisters
Doug Simon <doug.simon@oracle.com>
parents:
9425
diff
changeset
|
1705 assert !op.destroysCallerSavedRegisters() || !isRegister(operand) || !isCallerSave(operand) : "interval is in a caller-save register at a call . register will be overwritten"; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1706 |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1707 info.markLocation(interval.location(), frameMap); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1708 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1709 // Spill optimization: when the stack value is guaranteed to be always correct, |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
1710 // then it must be added to the oop map even if the interval is currently in a |
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
1711 // register |
16368
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1712 int spillPos = interval.spillDefinitionPos(); |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1713 if (interval.spillState() != SpillState.SpillInDominator) { |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1714 if (interval.alwaysInMemory() && op.id() > interval.spillDefinitionPos() && !interval.location().equals(interval.spillSlot())) { |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1715 assert interval.spillDefinitionPos() > 0 : "position not set correctly"; |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1716 assert spillPos > 0 : "position not set correctly"; |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1717 assert interval.spillSlot() != null : "no spill slot assigned"; |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1718 assert !isRegister(interval.operand) : "interval is on stack : so stack slot is registered twice"; |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1719 info.markLocation(interval.spillSlot(), frameMap); |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1720 } |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1721 } else { |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1722 AbstractBlock<?> spillBlock = blockForId(spillPos); |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1723 if (interval.alwaysInMemory() && !interval.location().equals(interval.spillSlot())) { |
16505
45f92700119f
Move AbstractBlock.{dominates, isDominatedBy} to AbstractControlFlowGraph.
Josef Eisl <josef.eisl@jku.at>
parents:
16380
diff
changeset
|
1724 if ((spillBlock.equals(block) && op.id() > spillPos) || dominates(spillBlock, block)) { |
16368
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1725 assert spillPos > 0 : "position not set correctly"; |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1726 assert interval.spillSlot() != null : "no spill slot assigned"; |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1727 assert !isRegister(interval.operand) : "interval is on stack : so stack slot is registered twice"; |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1728 info.markLocation(interval.spillSlot(), frameMap); |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1729 } |
ef641ba1fb69
LSRA spill optimization: mark the correct frame locations.
Josef Eisl <josef.eisl@jku.at>
parents:
16367
diff
changeset
|
1730 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1731 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1732 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1733 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1734 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1735 |
5539
bc647d8b0080
Renaming RiValue => Value.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5536
diff
changeset
|
1736 private boolean isCallerSave(Value operand) { |
5552
69a8969dbf40
Reduce public fields in api.code project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
5547
diff
changeset
|
1737 return attributes(asRegister(operand)).isCallerSave(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1738 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1739 |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1740 private InstructionValueProcedure debugInfoProc = new InstructionValueProcedure() { |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1741 |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1742 @Override |
17281
0f299d663944
Remove InstructionValueProcedure.doValue(LIRInstruction, Value).
Josef Eisl <josef.eisl@jku.at>
parents:
17280
diff
changeset
|
1743 public Value doValue(LIRInstruction op, Value operand, OperandMode valueMode, EnumSet<OperandFlag> flags) { |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1744 int tempOpId = op.id(); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1745 OperandMode mode = OperandMode.USE; |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1746 AbstractBlock<?> block = blockForId(tempOpId); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1747 if (block.getSuccessorCount() == 1 && tempOpId == getLastLirInstructionId(block)) { |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1748 // generating debug information for the last instruction of a block. |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1749 // if this instruction is a branch, spill moves are inserted before this branch |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1750 // and so the wrong operand would be returned (spill moves at block boundaries |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1751 // are not |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1752 // considered in the live ranges of intervals) |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1753 // Solution: use the first opId of the branch target block instead. |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1754 final LIRInstruction instr = ir.getLIRforBlock(block).get(ir.getLIRforBlock(block).size() - 1); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1755 if (instr instanceof StandardOp.JumpOp) { |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1756 if (blockData.get(block).liveOut.get(operandNumber(operand))) { |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1757 tempOpId = getFirstLirInstructionId(block.getSuccessors().iterator().next()); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1758 mode = OperandMode.DEF; |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1759 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1760 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1761 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1762 |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1763 // Get current location of operand |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1764 // The operand must be live because debug information is considered when building |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1765 // the intervals |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1766 // if the interval is not live, colorLirOperand will cause an assert on failure |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1767 Value result = colorLirOperand((Variable) operand, tempOpId, mode); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1768 assert !hasCall(tempOpId) || isStackSlot(result) || isConstant(result) || !isCallerSave(result) : "cannot have caller-save register operands at calls"; |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1769 return result; |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1770 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1771 }; |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1772 |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5711
diff
changeset
|
1773 private void computeDebugInfo(IntervalWalker iw, final LIRInstruction op, LIRFrameState info) { |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1774 info.initDebugInfo(frameMap, !op.destroysCallerSavedRegisters() || !callKillsRegisters); |
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1775 markFrameLocations(iw, op, info); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1776 |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1777 info.forEachState(op, debugInfoProc); |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1778 info.finish(op, frameMap); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1779 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1780 |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5711
diff
changeset
|
1781 private void assignLocations(List<LIRInstruction> instructions, final IntervalWalker iw) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1782 int numInst = instructions.size(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1783 boolean hasDead = false; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1784 |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1785 InstructionValueProcedure assignProc = new InstructionValueProcedure() { |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1786 |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1787 @Override |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1788 public Value doValue(LIRInstruction op, Value operand, OperandMode mode, EnumSet<OperandFlag> flags) { |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1789 if (isVariable(operand)) { |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1790 return colorLirOperand((Variable) operand, op.id(), mode); |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1791 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1792 return operand; |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1793 } |
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1794 }; |
16355
eeb911056079
LinearScan: use InstructionStateProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16138
diff
changeset
|
1795 InstructionStateProcedure stateProc = new InstructionStateProcedure() { |
eeb911056079
LinearScan: use InstructionStateProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16138
diff
changeset
|
1796 |
eeb911056079
LinearScan: use InstructionStateProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16138
diff
changeset
|
1797 @Override |
17279
b8516934a9e5
Make InstructionStateProcedure a FunctionalInterface.
Josef Eisl <josef.eisl@jku.at>
parents:
17211
diff
changeset
|
1798 public void doState(LIRInstruction op, LIRFrameState state) { |
16355
eeb911056079
LinearScan: use InstructionStateProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16138
diff
changeset
|
1799 computeDebugInfo(iw, op, state); |
eeb911056079
LinearScan: use InstructionStateProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16138
diff
changeset
|
1800 } |
eeb911056079
LinearScan: use InstructionStateProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16138
diff
changeset
|
1801 }; |
16138
f315b1c0a590
Introduce InstructionValueProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16118
diff
changeset
|
1802 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1803 for (int j = 0; j < numInst; j++) { |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
1804 final LIRInstruction op = instructions.get(j); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1805 if (op == null) { // this can happen when spill-moves are removed in eliminateSpillMoves |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1806 hasDead = true; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1807 continue; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1808 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1809 |
13377
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1810 // remove useless moves |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1811 MoveOp move = null; |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1812 if (op instanceof MoveOp) { |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1813 move = (MoveOp) op; |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1814 AllocatableValue result = move.getResult(); |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1815 if (isVariable(result) && isMaterialized(result, op.id(), OperandMode.DEF)) { |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1816 /* |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1817 * This happens if a materializable interval is originally not spilled but then |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1818 * kicked out in LinearScanWalker.splitForSpilling(). When kicking out such an |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1819 * interval this move operation was already generated. |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1820 */ |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1821 instructions.set(j, null); |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1822 hasDead = true; |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1823 continue; |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1824 } |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1825 } |
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1826 |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
1827 op.forEachInput(assignProc); |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
1828 op.forEachAlive(assignProc); |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
1829 op.forEachTemp(assignProc); |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
1830 op.forEachOutput(assignProc); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1831 |
5733
141b15521a39
use annotated fields for operands of LIR instructions
Christian Wimmer <christian.wimmer@oracle.com>
parents:
5711
diff
changeset
|
1832 // compute reference map and debug information |
16355
eeb911056079
LinearScan: use InstructionStateProcedure.
Josef Eisl <josef.eisl@jku.at>
parents:
16138
diff
changeset
|
1833 op.forEachState(stateProc); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1834 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1835 // remove useless moves |
13377
40530019af02
enable rematerialization of constants in LinearScan, including a bug fix
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13376
diff
changeset
|
1836 if (move != null) { |
9628
8851fabf2265
LinearScan: Can no longer check for object equality after removal of RegisterValue cache.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9614
diff
changeset
|
1837 if (move.getInput().equals(move.getResult())) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1838 instructions.set(j, null); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1839 hasDead = true; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1840 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1841 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1842 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1843 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1844 if (hasDead) { |
6321
9418ff4c9e7c
Clean up ControlFlowOptimizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
6317
diff
changeset
|
1845 // Remove null values from the list. |
9418ff4c9e7c
Clean up ControlFlowOptimizer.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
6317
diff
changeset
|
1846 instructions.removeAll(Collections.singleton(null)); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1847 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1848 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1849 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1850 private void assignLocations() { |
13340
9423a38d6437
added rematerialization of constants in LinearScan, but still disabled
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13339
diff
changeset
|
1851 IntervalWalker iw = initIntervalWalker(IS_STACK_INTERVAL); |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1852 try (Indent indent = Debug.logAndIndent("assign locations")) { |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
1853 for (AbstractBlock<?> block : sortedBlocks) { |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1854 try (Indent indent2 = Debug.logAndIndent("assign locations in block B%d", block.getId())) { |
14806
a8723f1ff542
LIR renamed setter and getter functions.
Josef Eisl <josef.eisl@jku.at>
parents:
14789
diff
changeset
|
1855 assignLocations(ir.getLIRforBlock(block), iw); |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1856 } |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1857 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1858 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1859 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1860 |
17126
7a0bff31df98
Encapsulate creation of LinearScan object
Christian Wimmer <christian.wimmer@oracle.com>
parents:
17070
diff
changeset
|
1861 public static void allocate(TargetDescription target, LIR lir, FrameMap frameMap) { |
7a0bff31df98
Encapsulate creation of LinearScan object
Christian Wimmer <christian.wimmer@oracle.com>
parents:
17070
diff
changeset
|
1862 new LinearScan(target, lir, frameMap).allocate(); |
7a0bff31df98
Encapsulate creation of LinearScan object
Christian Wimmer <christian.wimmer@oracle.com>
parents:
17070
diff
changeset
|
1863 } |
7a0bff31df98
Encapsulate creation of LinearScan object
Christian Wimmer <christian.wimmer@oracle.com>
parents:
17070
diff
changeset
|
1864 |
7a0bff31df98
Encapsulate creation of LinearScan object
Christian Wimmer <christian.wimmer@oracle.com>
parents:
17070
diff
changeset
|
1865 private void allocate() { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1866 |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1867 /* |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1868 * This is the point to enable debug logging for the whole register allocation. |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
1869 */ |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1870 try (Indent indent = Debug.logAndIndent("LinearScan allocate")) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1871 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1872 try (Scope s = Debug.scope("LifetimeAnalysis")) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1873 numberInstructions(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1874 printLir("Before register allocation", true); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1875 computeLocalLiveSets(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1876 computeGlobalLiveSets(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1877 buildIntervals(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1878 sortIntervalsBeforeAllocation(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1879 } catch (Throwable e) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1880 throw Debug.handle(e); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1881 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1882 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1883 try (Scope s = Debug.scope("RegisterAllocation")) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1884 printIntervals("Before register allocation"); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1885 allocateRegisters(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1886 } catch (Throwable e) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1887 throw Debug.handle(e); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1888 } |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
1889 |
16362
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
1890 if (Options.LSRAOptimizeSpillPosition.getValue()) { |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
1891 try (Scope s = Debug.scope("OptimizeSpillPosition")) { |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
1892 optimizeSpillPosition(); |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
1893 } catch (Throwable e) { |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
1894 throw Debug.handle(e); |
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
1895 } |
16357
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1896 } |
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1897 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1898 try (Scope s = Debug.scope("ResolveDataFlow")) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1899 resolveDataFlow(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1900 } catch (Throwable e) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1901 throw Debug.handle(e); |
13197
8569b9e047cd
change debug scopes implementation to prevent extra frames related to mechanism being added to call stack
Doug Simon <doug.simon@oracle.com>
parents:
12785
diff
changeset
|
1902 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1903 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1904 try (Scope s = Debug.scope("DebugInfo")) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1905 frameMap.finish(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1906 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1907 printIntervals("After register allocation"); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1908 printLir("After register allocation", true); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1909 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1910 sortIntervalsAfterAllocation(); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1911 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1912 if (DetailedAsserts.getValue()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1913 verify(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1914 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1915 |
16372
73d7935be896
LSRA: add debug scope for eliminateSpillMoves() and assignLocations().
Josef Eisl <josef.eisl@jku.at>
parents:
16371
diff
changeset
|
1916 try (Scope s1 = Debug.scope("EliminateSpillMove")) { |
73d7935be896
LSRA: add debug scope for eliminateSpillMoves() and assignLocations().
Josef Eisl <josef.eisl@jku.at>
parents:
16371
diff
changeset
|
1917 eliminateSpillMoves(); |
73d7935be896
LSRA: add debug scope for eliminateSpillMoves() and assignLocations().
Josef Eisl <josef.eisl@jku.at>
parents:
16371
diff
changeset
|
1918 } catch (Throwable e) { |
73d7935be896
LSRA: add debug scope for eliminateSpillMoves() and assignLocations().
Josef Eisl <josef.eisl@jku.at>
parents:
16371
diff
changeset
|
1919 throw Debug.handle(e); |
73d7935be896
LSRA: add debug scope for eliminateSpillMoves() and assignLocations().
Josef Eisl <josef.eisl@jku.at>
parents:
16371
diff
changeset
|
1920 } |
17195
41a75081678c
Print LIR after move elimination.
Josef Eisl <josef.eisl@jku.at>
parents:
17126
diff
changeset
|
1921 printLir("After spill move elimination", true); |
16372
73d7935be896
LSRA: add debug scope for eliminateSpillMoves() and assignLocations().
Josef Eisl <josef.eisl@jku.at>
parents:
16371
diff
changeset
|
1922 |
73d7935be896
LSRA: add debug scope for eliminateSpillMoves() and assignLocations().
Josef Eisl <josef.eisl@jku.at>
parents:
16371
diff
changeset
|
1923 try (Scope s1 = Debug.scope("AssignLocations")) { |
73d7935be896
LSRA: add debug scope for eliminateSpillMoves() and assignLocations().
Josef Eisl <josef.eisl@jku.at>
parents:
16371
diff
changeset
|
1924 assignLocations(); |
73d7935be896
LSRA: add debug scope for eliminateSpillMoves() and assignLocations().
Josef Eisl <josef.eisl@jku.at>
parents:
16371
diff
changeset
|
1925 } catch (Throwable e) { |
73d7935be896
LSRA: add debug scope for eliminateSpillMoves() and assignLocations().
Josef Eisl <josef.eisl@jku.at>
parents:
16371
diff
changeset
|
1926 throw Debug.handle(e); |
73d7935be896
LSRA: add debug scope for eliminateSpillMoves() and assignLocations().
Josef Eisl <josef.eisl@jku.at>
parents:
16371
diff
changeset
|
1927 } |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1928 |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1929 if (DetailedAsserts.getValue()) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1930 verifyIntervals(); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1931 } |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1932 } catch (Throwable e) { |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1933 throw Debug.handle(e); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1934 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1935 |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1936 printLir("After register number assignment", true); |
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
1937 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1938 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
1939 |
16357
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1940 private DebugMetric betterSpillPos = Debug.metric("BetterSpillPosition"); |
16361
faff09aa5999
LSRA spill optimization: only use predecessor block if it has lower probability than the definition.
Josef Eisl <josef.eisl@jku.at>
parents:
16360
diff
changeset
|
1941 private DebugMetric betterSpillPosWithLowerProbability = Debug.metric("BetterSpillPositionWithLowerProbability"); |
16357
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1942 |
16362
b100bd079fff
LSRA spill optimization: add -G:+LSRAOptimizeSpillPosition option (default: enabled).
Josef Eisl <josef.eisl@jku.at>
parents:
16361
diff
changeset
|
1943 private void optimizeSpillPosition() { |
16378
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
1944 LIRInsertionBuffer[] insertionBuffers = new LIRInsertionBuffer[ir.linearScanOrder().size()]; |
16357
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1945 for (Interval interval : intervals) { |
16359
f686fae77383
LSRA spill optimization: rename SpillInDominator.MultipleSpills to SpillState.SpillInDominator.
Josef Eisl <josef.eisl@jku.at>
parents:
16358
diff
changeset
|
1946 if (interval != null && interval.isSplitParent() && interval.spillState() == SpillState.SpillInDominator) { |
16357
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1947 AbstractBlock<?> defBlock = blockForId(interval.spillDefinitionPos()); |
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1948 AbstractBlock<?> spillBlock = null; |
16369
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1949 Interval firstSpillChild = null; |
16357
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1950 try (Indent indent = Debug.logAndIndent("interval %s (%s)", interval, defBlock)) { |
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1951 for (Interval splitChild : interval.getSplitChildren()) { |
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1952 if (isStackSlot(splitChild.location())) { |
16369
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1953 if (firstSpillChild == null || splitChild.from() < firstSpillChild.from()) { |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1954 firstSpillChild = splitChild; |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1955 } else { |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1956 assert firstSpillChild.from() < splitChild.from(); |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1957 } |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1958 // iterate all blocks where the interval has use positions |
16376
ef21879c0c8f
LSRA spill optimization: rename UseBlockIterator to IntervalBlockIterator.
Josef Eisl <josef.eisl@jku.at>
parents:
16375
diff
changeset
|
1959 for (AbstractBlock<?> splitBlock : blocksForInterval(splitChild)) { |
16373
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
1960 if (dominates(defBlock, splitBlock)) { |
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
1961 Debug.log("Split interval %s, block %s", splitChild, splitBlock); |
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
1962 if (spillBlock == null) { |
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
1963 spillBlock = splitBlock; |
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
1964 } else { |
16506
505c17ed39da
LSRA spill optimization: use AbstractControlFlowGraph.commonDominator.
Josef Eisl <josef.eisl@jku.at>
parents:
16505
diff
changeset
|
1965 spillBlock = commonDominator(spillBlock, splitBlock); |
16373
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
1966 assert spillBlock != null; |
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
1967 } |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
1968 } |
16357
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1969 } |
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1970 } |
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
1971 } |
16360
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
1972 if (spillBlock == null) { |
16358
9371b9c246ca
LSRA spill optimization: spill at earliest dominator.
Josef Eisl <josef.eisl@jku.at>
parents:
16357
diff
changeset
|
1973 // no spill interval |
9371b9c246ca
LSRA spill optimization: spill at earliest dominator.
Josef Eisl <josef.eisl@jku.at>
parents:
16357
diff
changeset
|
1974 interval.setSpillState(SpillState.StoreAtDefinition); |
9371b9c246ca
LSRA spill optimization: spill at earliest dominator.
Josef Eisl <josef.eisl@jku.at>
parents:
16357
diff
changeset
|
1975 } else { |
16360
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
1976 // move out of loops |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
1977 if (defBlock.getLoopDepth() < spillBlock.getLoopDepth()) { |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
1978 spillBlock = moveSpillOutOfLoop(defBlock, spillBlock); |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
1979 } |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
1980 |
16369
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1981 /* |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1982 * If the spill block is the begin of the first split child (aka the value |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1983 * is on the stack) spill in the dominator. |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1984 */ |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1985 assert firstSpillChild != null; |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1986 if (!defBlock.equals(spillBlock) && spillBlock.equals(blockForId(firstSpillChild.from()))) { |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1987 AbstractBlock<?> dom = spillBlock.getDominator(); |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1988 Debug.log("Spill block (%s) is the beginning of a spill child -> use dominator (%s)", spillBlock, dom); |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1989 spillBlock = dom; |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1990 } |
f8ba57019a5d
LSRA spill optimization: move spill position to the dominator if at spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16368
diff
changeset
|
1991 |
16360
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
1992 if (!defBlock.equals(spillBlock)) { |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
1993 assert dominates(defBlock, spillBlock); |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
1994 betterSpillPos.increment(); |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
1995 Debug.log("Better spill position found (Block %s)", spillBlock); |
16361
faff09aa5999
LSRA spill optimization: only use predecessor block if it has lower probability than the definition.
Josef Eisl <josef.eisl@jku.at>
parents:
16360
diff
changeset
|
1996 |
faff09aa5999
LSRA spill optimization: only use predecessor block if it has lower probability than the definition.
Josef Eisl <josef.eisl@jku.at>
parents:
16360
diff
changeset
|
1997 if (defBlock.probability() <= spillBlock.probability()) { |
faff09aa5999
LSRA spill optimization: only use predecessor block if it has lower probability than the definition.
Josef Eisl <josef.eisl@jku.at>
parents:
16360
diff
changeset
|
1998 // better spill block has the same probability -> do nothing |
faff09aa5999
LSRA spill optimization: only use predecessor block if it has lower probability than the definition.
Josef Eisl <josef.eisl@jku.at>
parents:
16360
diff
changeset
|
1999 interval.setSpillState(SpillState.StoreAtDefinition); |
faff09aa5999
LSRA spill optimization: only use predecessor block if it has lower probability than the definition.
Josef Eisl <josef.eisl@jku.at>
parents:
16360
diff
changeset
|
2000 } else { |
16378
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2001 LIRInsertionBuffer insertionBuffer = insertionBuffers[spillBlock.getId()]; |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2002 if (insertionBuffer == null) { |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2003 insertionBuffer = new LIRInsertionBuffer(); |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2004 insertionBuffers[spillBlock.getId()] = insertionBuffer; |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2005 insertionBuffer.init(ir.getLIRforBlock(spillBlock)); |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2006 } |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2007 int spillOpId = getFirstLirInstructionId(spillBlock); |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2008 // insert spill move |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2009 AllocatableValue fromLocation = interval.getSplitChildAtOpId(spillOpId, OperandMode.DEF, this).location(); |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2010 AllocatableValue toLocation = canonicalSpillOpr(interval); |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2011 LIRInstruction move = ir.getSpillMoveFactory().createMove(toLocation, fromLocation); |
16380
8057279ec60e
LSRA spill optimization: use DOMINATOR_SPILL_MOVE_ID to mark moves.
Josef Eisl <josef.eisl@jku.at>
parents:
16379
diff
changeset
|
2012 move.setId(DOMINATOR_SPILL_MOVE_ID); |
16378
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2013 /* |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2014 * We can use the insertion buffer directly because we always insert |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2015 * at position 1. |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2016 */ |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2017 insertionBuffer.append(1, move); |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2018 |
16361
faff09aa5999
LSRA spill optimization: only use predecessor block if it has lower probability than the definition.
Josef Eisl <josef.eisl@jku.at>
parents:
16360
diff
changeset
|
2019 betterSpillPosWithLowerProbability.increment(); |
16378
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2020 interval.setSpillDefinitionPos(spillOpId); |
16361
faff09aa5999
LSRA spill optimization: only use predecessor block if it has lower probability than the definition.
Josef Eisl <josef.eisl@jku.at>
parents:
16360
diff
changeset
|
2021 } |
16360
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2022 } else { |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2023 // definition is the best choice |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2024 interval.setSpillState(SpillState.StoreAtDefinition); |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2025 } |
16357
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
2026 } |
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
2027 } |
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
2028 } |
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
2029 } |
16378
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2030 for (LIRInsertionBuffer insertionBuffer : insertionBuffers) { |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2031 if (insertionBuffer != null) { |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2032 assert insertionBuffer.initialized() : "Insertion buffer is nonnull but not initialized!"; |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2033 insertionBuffer.finish(); |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2034 } |
d075b97fbd31
LSRA spill optimization: insert spill moves eagerly.
Josef Eisl <josef.eisl@jku.at>
parents:
16377
diff
changeset
|
2035 } |
16357
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
2036 } |
a07492ccaf52
LSRA spill optimization: calculate optimized spill position.
Josef Eisl <josef.eisl@jku.at>
parents:
16355
diff
changeset
|
2037 |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2038 /** |
16376
ef21879c0c8f
LSRA spill optimization: rename UseBlockIterator to IntervalBlockIterator.
Josef Eisl <josef.eisl@jku.at>
parents:
16375
diff
changeset
|
2039 * Iterate over all {@link AbstractBlock blocks} of an interval. |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2040 */ |
16376
ef21879c0c8f
LSRA spill optimization: rename UseBlockIterator to IntervalBlockIterator.
Josef Eisl <josef.eisl@jku.at>
parents:
16375
diff
changeset
|
2041 private class IntervalBlockIterator implements Iterator<AbstractBlock<?>> { |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2042 |
16373
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2043 Range range; |
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2044 AbstractBlock<?> block; |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2045 |
16376
ef21879c0c8f
LSRA spill optimization: rename UseBlockIterator to IntervalBlockIterator.
Josef Eisl <josef.eisl@jku.at>
parents:
16375
diff
changeset
|
2046 public IntervalBlockIterator(Interval interval) { |
16373
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2047 range = interval.first(); |
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2048 block = blockForId(range.from); |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2049 } |
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2050 |
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2051 public AbstractBlock<?> next() { |
16373
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2052 AbstractBlock<?> currentBlock = block; |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2053 int nextBlockIndex = block.getLinearScanNumber() + 1; |
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2054 if (nextBlockIndex < sortedBlocks.size()) { |
16373
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2055 block = sortedBlocks.get(nextBlockIndex); |
16375
ff14306337f2
LSRA spill optimization: fix UseBlockIterator.
Josef Eisl <josef.eisl@jku.at>
parents:
16374
diff
changeset
|
2056 if (range.to <= getFirstLirInstructionId(block)) { |
16373
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2057 range = range.next; |
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2058 if (range == Range.EndMarker) { |
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2059 block = null; |
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2060 } else { |
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2061 block = blockForId(range.from); |
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2062 } |
16370
3324ab9fe71a
LSRA spill optimization: iterate all ranges of spill interval.
Josef Eisl <josef.eisl@jku.at>
parents:
16369
diff
changeset
|
2063 } |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2064 } else { |
16373
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2065 block = null; |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2066 } |
16373
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2067 return currentBlock; |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2068 } |
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2069 |
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2070 public boolean hasNext() { |
16373
74e93f5ba4f3
LSRA spill optimization: consider all spill blocks not only use positions.
Josef Eisl <josef.eisl@jku.at>
parents:
16372
diff
changeset
|
2071 return block != null; |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2072 } |
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2073 } |
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2074 |
16376
ef21879c0c8f
LSRA spill optimization: rename UseBlockIterator to IntervalBlockIterator.
Josef Eisl <josef.eisl@jku.at>
parents:
16375
diff
changeset
|
2075 private Iterable<AbstractBlock<?>> blocksForInterval(Interval interval) { |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2076 return new Iterable<AbstractBlock<?>>() { |
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2077 public Iterator<AbstractBlock<?>> iterator() { |
16376
ef21879c0c8f
LSRA spill optimization: rename UseBlockIterator to IntervalBlockIterator.
Josef Eisl <josef.eisl@jku.at>
parents:
16375
diff
changeset
|
2078 return new IntervalBlockIterator(interval); |
16364
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2079 } |
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2080 }; |
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2081 } |
a54a64af1e82
LSRA spill optimization: take all blocks (with usepos) of a spill interval into account.
Josef Eisl <josef.eisl@jku.at>
parents:
16363
diff
changeset
|
2082 |
16360
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2083 private static AbstractBlock<?> moveSpillOutOfLoop(AbstractBlock<?> defBlock, AbstractBlock<?> spillBlock) { |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2084 int defLoopDepth = defBlock.getLoopDepth(); |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2085 for (AbstractBlock<?> block = spillBlock.getDominator(); !defBlock.equals(block); block = block.getDominator()) { |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2086 assert block != null : "spill block not dominated by definition block?"; |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2087 if (block.getLoopDepth() <= defLoopDepth) { |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2088 assert block.getLoopDepth() == defLoopDepth : "Cannot spill an interval outside of the loop where it is defined!"; |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2089 return block; |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2090 } |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2091 } |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2092 return defBlock; |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2093 } |
ec54fc47ba5d
LSRA spill optimization: move spill out of loops.
Josef Eisl <josef.eisl@jku.at>
parents:
16359
diff
changeset
|
2094 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2095 void printIntervals(String label) { |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2096 if (Debug.isLogEnabled()) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2097 try (Indent indent = Debug.logAndIndent("intervals %s", label)) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2098 for (Interval interval : intervals) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2099 if (interval != null) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2100 Debug.log("%s", interval.logString(this)); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2101 } |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2102 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2103 |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2104 try (Indent indent2 = Debug.logAndIndent("Basic Blocks")) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2105 for (int i = 0; i < blockCount(); i++) { |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
2106 AbstractBlock<?> block = blockAt(i); |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2107 Debug.log("B%d [%d, %d, %s] ", block.getId(), getFirstLirInstructionId(block), getLastLirInstructionId(block), block.getLoop()); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2108 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2109 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2110 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2111 } |
4353
043bec543161
More work on debug framework. Removed concept of GraalContext.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4352
diff
changeset
|
2112 Debug.dump(Arrays.copyOf(intervals, intervalsSize), label); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2113 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2114 |
7556
630ea5001e33
Modified formatter settings to not insert line break after annotation on parameters.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
7530
diff
changeset
|
2115 void printLir(String label, @SuppressWarnings("unused") boolean hirValid) { |
4353
043bec543161
More work on debug framework. Removed concept of GraalContext.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
4352
diff
changeset
|
2116 Debug.dump(ir, label); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2117 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2118 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2119 boolean verify() { |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2120 // (check that all intervals have a correct register and that no registers are overwritten) |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2121 verifyIntervals(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2122 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2123 verifyRegisters(); |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2124 |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2125 Debug.log("no errors found"); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2126 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2127 return true; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2128 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2129 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2130 private void verifyRegisters() { |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2131 // Enable this logging to get output for the verification process. |
13546
43bd3d7254d1
don?t explicitly disable debug log output in linear scan and graphbuilder
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13467
diff
changeset
|
2132 try (Indent indent = Debug.logAndIndent("verifying register allocation")) { |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2133 RegisterVerifier verifier = new RegisterVerifier(this); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2134 verifier.verify(blockAt(0)); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2135 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2136 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2137 |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2138 void verifyIntervals() { |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2139 try (Indent indent = Debug.logAndIndent("verifying intervals")) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2140 int len = intervalsSize; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2141 |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2142 for (int i = 0; i < len; i++) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2143 Interval i1 = intervals[i]; |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2144 if (i1 == null) { |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2145 continue; |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2146 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2147 |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2148 i1.checkSplitChildren(); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2149 |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2150 if (i1.operandNumber != i) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2151 Debug.log("Interval %d is on position %d in list", i1.operandNumber, i); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2152 Debug.log(i1.logString(this)); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2153 throw new GraalInternalError(""); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2154 } |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2155 |
16118
5cbaad0b7387
Verify usage of equals method in LIRKind.
Roland Schatz <roland.schatz@oracle.com>
parents:
16094
diff
changeset
|
2156 if (isVariable(i1.operand) && i1.kind().equals(LIRKind.Illegal)) { |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2157 Debug.log("Interval %d has no type assigned", i1.operandNumber); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2158 Debug.log(i1.logString(this)); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2159 throw new GraalInternalError(""); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2160 } |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2161 |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2162 if (i1.location() == null) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2163 Debug.log("Interval %d has no register assigned", i1.operandNumber); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2164 Debug.log(i1.logString(this)); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2165 throw new GraalInternalError(""); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2166 } |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2167 |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2168 if (i1.first() == Range.EndMarker) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2169 Debug.log("Interval %d has no Range", i1.operandNumber); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2170 Debug.log(i1.logString(this)); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2171 throw new GraalInternalError(""); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2172 } |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2173 |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2174 for (Range r = i1.first(); r != Range.EndMarker; r = r.next) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2175 if (r.from >= r.to) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2176 Debug.log("Interval %d has zero length range", i1.operandNumber); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2177 Debug.log(i1.logString(this)); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2178 throw new GraalInternalError(""); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2179 } |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2180 } |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2181 |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2182 for (int j = i + 1; j < len; j++) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2183 Interval i2 = intervals[j]; |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2184 if (i2 == null) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2185 continue; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2186 } |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2187 |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2188 // special intervals that are created in MoveResolver |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2189 // . ignore them because the range information has no meaning there |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2190 if (i1.from() == 1 && i1.to() == 2) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2191 continue; |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2192 } |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2193 if (i2.from() == 1 && i2.to() == 2) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2194 continue; |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2195 } |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2196 Value l1 = i1.location(); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2197 Value l2 = i2.location(); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2198 if (i1.intersects(i2) && !isIllegal(l1) && (l1.equals(l2))) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2199 if (DetailedAsserts.getValue()) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2200 Debug.log("Intervals %d and %d overlap and have the same register assigned", i1.operandNumber, i2.operandNumber); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2201 Debug.log(i1.logString(this)); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2202 Debug.log(i2.logString(this)); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2203 } |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2204 throw new BailoutException(""); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2205 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2206 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2207 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2208 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2209 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2210 |
17285
3a834111a632
Make [Instruction]ValueProcedure and [Instruction]ValueConsumer a FunctionalInterface.
Josef Eisl <josef.eisl@jku.at>
parents:
17284
diff
changeset
|
2211 class CheckConsumer implements ValueConsumer { |
7530
5e3d1a68664e
applied mx eclipseformat to all Java files
Doug Simon <doug.simon@oracle.com>
parents:
7512
diff
changeset
|
2212 |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2213 boolean ok; |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2214 Interval curInterval; |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2215 |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2216 @Override |
17284
d21962ea9617
Remove ValueConsumer.visitValue(Value).
Josef Eisl <josef.eisl@jku.at>
parents:
17283
diff
changeset
|
2217 public void visitValue(Value operand, OperandMode mode, EnumSet<OperandFlag> flags) { |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2218 if (isRegister(operand)) { |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2219 if (intervalFor(operand) == curInterval) { |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2220 ok = true; |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2221 } |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2222 } |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2223 } |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2224 } |
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2225 |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2226 void verifyNoOopsInFixedIntervals() { |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2227 try (Indent indent = Debug.logAndIndent("verifying that no oops are in fixed intervals *")) { |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
2228 CheckConsumer checkConsumer = new CheckConsumer(); |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2229 |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2230 Interval fixedIntervals; |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2231 Interval otherIntervals; |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2232 fixedIntervals = createUnhandledLists(IS_PRECOLORED_INTERVAL, null).first; |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2233 // to ensure a walking until the last instruction id, add a dummy interval |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2234 // with a high operation id |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2235 otherIntervals = new Interval(Value.ILLEGAL, -1); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2236 otherIntervals.addRange(Integer.MAX_VALUE - 2, Integer.MAX_VALUE - 1); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2237 IntervalWalker iw = new IntervalWalker(this, fixedIntervals, otherIntervals); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2238 |
14152
42013bd831d6
Make LinearScan use AbstractBlock.
Josef Eisl <josef.eisl@jku.at>
parents:
14145
diff
changeset
|
2239 for (AbstractBlock<?> block : sortedBlocks) { |
14806
a8723f1ff542
LIR renamed setter and getter functions.
Josef Eisl <josef.eisl@jku.at>
parents:
14789
diff
changeset
|
2240 List<LIRInstruction> instructions = ir.getLIRforBlock(block); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2241 |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2242 for (int j = 0; j < instructions.size(); j++) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2243 LIRInstruction op = instructions.get(j); |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2244 |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2245 if (op.hasState()) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2246 iw.walkBefore(op.id()); |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2247 boolean checkLive = true; |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2248 |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2249 // Make sure none of the fixed registers is live across an |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2250 // oopmap since we can't handle that correctly. |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2251 if (checkLive) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2252 for (Interval interval = iw.activeLists.get(RegisterBinding.Fixed); interval != Interval.EndMarker; interval = interval.next) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2253 if (interval.currentTo() > op.id() + 1) { |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2254 // This interval is live out of this op so make sure |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2255 // that this interval represents some value that's |
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2256 // referenced by this op either as an input or output. |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
2257 checkConsumer.curInterval = interval; |
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
2258 checkConsumer.ok = false; |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2259 |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
2260 op.visitEachInput(checkConsumer); |
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
2261 op.visitEachAlive(checkConsumer); |
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
2262 op.visitEachTemp(checkConsumer); |
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
2263 op.visitEachOutput(checkConsumer); |
4245
75c620f90ab9
Support stack-operands and register hints in new register allocator API
Christian Wimmer <Christian.Wimmer@Oracle.com>
parents:
4214
diff
changeset
|
2264 |
16801
067dbd8e7114
Use ValueConsumer in LinearScan where possible.
Josef Eisl <josef.eisl@jku.at>
parents:
16796
diff
changeset
|
2265 assert checkConsumer.ok : "fixed intervals should never be live across an oopmap point"; |
13467
7c694e3e97e5
remove remaining old style TTY debug logging in LinearScan and remove TraceLinearScan option
Erik Eckstein <erik.eckstein@oracle.com>
parents:
13377
diff
changeset
|
2266 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2267 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2268 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2269 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2270 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2271 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2272 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2273 } |
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2274 |
14070
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2275 /** |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2276 * Returns a value for a interval definition, which can be used for re-materialization. |
14871
667710021ea1
removed methods in Indent that are redundant with those in Debug
Doug Simon <doug.simon@oracle.com>
parents:
14841
diff
changeset
|
2277 * |
14070
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2278 * @param op An instruction which defines a value |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2279 * @param operand The destination operand of the instruction |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2280 * @param interval The interval for this defined value. |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2281 * @return Returns the value which is moved to the instruction and which can be reused at all |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2282 * reload-locations in case the interval of this instruction is spilled. Currently this |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2283 * can only be a {@link Constant}. |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2284 */ |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2285 public static Constant getMaterializedValue(LIRInstruction op, Value operand, Interval interval) { |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2286 if (op instanceof MoveOp) { |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2287 MoveOp move = (MoveOp) op; |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2288 if (move.getInput() instanceof Constant) { |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2289 /* |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2290 * Check if the interval has any uses which would accept an stack location (priority |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2291 * == ShouldHaveRegister). Rematerialization of such intervals can result in a |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2292 * degradation, because rematerialization always inserts a constant load, even if |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2293 * the value is not needed in a register. |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2294 */ |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2295 Interval.UsePosList usePosList = interval.usePosList(); |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2296 int numUsePos = usePosList.size(); |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2297 for (int useIdx = 0; useIdx < numUsePos; useIdx++) { |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2298 Interval.RegisterPriority priority = usePosList.registerPriority(useIdx); |
15920 | 2299 if (priority == Interval.RegisterPriority.ShouldHaveRegister) { |
14070
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2300 return null; |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2301 } |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2302 } |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2303 return (Constant) move.getInput(); |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2304 } |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2305 } |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2306 return null; |
a8a82c6e2981
Remove LIRGenerator from LinearScan.
Josef Eisl <josef.eisl@jku.at>
parents:
14057
diff
changeset
|
2307 } |
3733
e233f5660da4
Added Java files from Maxine project.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
diff
changeset
|
2308 } |