annotate graal/com.oracle.graal.lir/src/com/oracle/graal/lir/constopt/ConstantLoadOptimization.java @ 17277:730aa0eb20e5

LIRIntrospection: rename forEach*(ValuePositionProcedure) to forEach*Pos.
author Josef Eisl <josef.eisl@jku.at>
date Thu, 25 Sep 2014 10:27:05 +0200
parents 26d07b31c4a8
children e8b80721524d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16952
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
1 /*
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
2 * Copyright (c) 2014, 2014, Oracle and/or its affiliates. All rights reserved.
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
4 *
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
7 * published by the Free Software Foundation.
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
8 *
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
13 * accompanied this code).
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
14 *
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
18 *
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
21 * questions.
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
22 */
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
23 package com.oracle.graal.lir.constopt;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
24
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
25 import static com.oracle.graal.api.code.ValueUtil.*;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
26 import static com.oracle.graal.lir.LIRValueUtil.*;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
27
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
28 import java.util.*;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
29
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
30 import com.oracle.graal.api.meta.*;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
31 import com.oracle.graal.compiler.common.cfg.*;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
32 import com.oracle.graal.debug.*;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
33 import com.oracle.graal.debug.Debug.Scope;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
34 import com.oracle.graal.lir.*;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
35 import com.oracle.graal.lir.StandardOp.MoveOp;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
36 import com.oracle.graal.lir.constopt.ConstantTree.Flags;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
37 import com.oracle.graal.lir.constopt.ConstantTree.NodeCost;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
38 import com.oracle.graal.lir.gen.*;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
39 import com.oracle.graal.options.*;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
40
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
41 /**
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
42 * This optimization tries to improve the handling of constants by replacing a single definition of
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
43 * a constant, which is potentially scheduled into a block with high probability, with one or more
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
44 * definitions in blocks with a lower probability.
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
45 */
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
46 public class ConstantLoadOptimization {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
47
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
48 public static class Options {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
49 // @formatter:off
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
50 @Option(help = "Enable constant load optimization.")
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
51 public static final OptionValue<Boolean> ConstantLoadOptimization = new OptionValue<>(true);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
52 // @formatter:on
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
53 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
54
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
55 public static void optimize(LIR lir, LIRGeneratorTool lirGen) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
56 new ConstantLoadOptimization(lir, lirGen).apply();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
57 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
58
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
59 private LIR lir;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
60 private LIRGeneratorTool lirGen;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
61 private VariableMap<DefUseTree> map;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
62 private BitSet phiConstants;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
63 private BitSet defined;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
64 private BlockMap<List<UseEntry>> blockMap;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
65 private BlockMap<LIRInsertionBuffer> insertionBuffers;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
66
17212
26d07b31c4a8 ConstantLoadOptimization: make debug meters final.
Josef Eisl <josef.eisl@jku.at>
parents: 17068
diff changeset
67 private static final DebugMetric constantsTotal = Debug.metric("ConstantLoadOptimization[total]");
26d07b31c4a8 ConstantLoadOptimization: make debug meters final.
Josef Eisl <josef.eisl@jku.at>
parents: 17068
diff changeset
68 private static final DebugMetric phiConstantsSkipped = Debug.metric("ConstantLoadOptimization[PhisSkipped]");
26d07b31c4a8 ConstantLoadOptimization: make debug meters final.
Josef Eisl <josef.eisl@jku.at>
parents: 17068
diff changeset
69 private static final DebugMetric singleUsageConstantsSkipped = Debug.metric("ConstantLoadOptimization[SingleUsageSkipped]");
26d07b31c4a8 ConstantLoadOptimization: make debug meters final.
Josef Eisl <josef.eisl@jku.at>
parents: 17068
diff changeset
70 private static final DebugMetric usageAtDefinitionSkipped = Debug.metric("ConstantLoadOptimization[UsageAtDefinitionSkipped]");
26d07b31c4a8 ConstantLoadOptimization: make debug meters final.
Josef Eisl <josef.eisl@jku.at>
parents: 17068
diff changeset
71 private static final DebugMetric materializeAtDefinitionSkipped = Debug.metric("ConstantLoadOptimization[MaterializeAtDefinitionSkipped]");
26d07b31c4a8 ConstantLoadOptimization: make debug meters final.
Josef Eisl <josef.eisl@jku.at>
parents: 17068
diff changeset
72 private static final DebugMetric constantsOptimized = Debug.metric("ConstantLoadOptimization[optimized]");
16952
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
73
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
74 private ConstantLoadOptimization(LIR lir, LIRGeneratorTool lirGen) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
75 this.lir = lir;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
76 this.lirGen = lirGen;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
77 this.map = new VariableMap<>();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
78 this.phiConstants = new BitSet();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
79 this.defined = new BitSet();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
80 this.insertionBuffers = new BlockMap<>(lir.getControlFlowGraph());
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
81 this.blockMap = new BlockMap<>(lir.getControlFlowGraph());
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
82 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
83
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
84 private void apply() {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
85 try (Indent indent = Debug.logAndIndent("ConstantLoadOptimization")) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
86 try (Scope s = Debug.scope("BuildDefUseTree")) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
87 // build DefUseTree
16953
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
88 lir.getControlFlowGraph().getBlocks().forEach(this::analyzeBlock);
16952
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
89 // remove all with only one use
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
90 map.filter(t -> {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
91 if (t.usageCount() > 1) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
92 return true;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
93 } else {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
94 singleUsageConstantsSkipped.increment();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
95 return false;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
96 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
97 });
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
98 // collect block map
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
99 map.forEach(tree -> tree.forEach(this::addUsageToBlockMap));
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
100 } catch (Throwable e) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
101 throw Debug.handle(e);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
102 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
103
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
104 try (Scope s = Debug.scope("BuildConstantTree")) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
105 // create ConstantTree
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
106 map.forEach(this::createConstantTree);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
107
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
108 // insert moves, delete null instructions and reset instruction ids
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
109 lir.getControlFlowGraph().getBlocks().forEach(this::rewriteBlock);
17068
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
110
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
111 assert verifyStates();
16952
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
112 } catch (Throwable e) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
113 throw Debug.handle(e);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
114 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
115 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
116 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
117
17068
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
118 private boolean verifyStates() {
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
119 map.forEach(this::verifyStateUsage);
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
120 return true;
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
121 }
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
122
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
123 private void verifyStateUsage(DefUseTree tree) {
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
124 Variable var = tree.getVariable();
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
125 ValueConsumer stateConsumer = new ValueConsumer() {
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
126
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
127 @Override
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
128 public void visitValue(Value operand) {
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
129 assert !operand.equals(var) : "constant usage through variable in frame state " + var;
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
130 }
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
131 };
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
132 for (AbstractBlock<?> block : lir.getControlFlowGraph().getBlocks()) {
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
133 for (LIRInstruction inst : lir.getLIRforBlock(block)) {
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
134 // set instruction id to the index in the lir instruction list
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
135 inst.visitEachState(stateConsumer);
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
136 }
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
137 }
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
138 }
8456194ca311 Unproxy constant usages in FrameState
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16953
diff changeset
139
16952
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
140 private static boolean isConstantLoad(LIRInstruction inst) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
141 if (!(inst instanceof MoveOp)) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
142 return false;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
143 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
144 MoveOp move = (MoveOp) inst;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
145 return isConstant(move.getInput()) && isVariable(move.getResult());
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
146 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
147
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
148 private void addUsageToBlockMap(UseEntry entry) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
149 AbstractBlock<?> block = entry.getBlock();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
150 List<UseEntry> list = blockMap.get(block);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
151 if (list == null) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
152 list = new ArrayList<>();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
153 blockMap.put(block, list);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
154 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
155 list.add(entry);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
156 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
157
16953
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
158 /**
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
159 * Collects def-use information for a {@code block}.
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
160 */
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
161 private void analyzeBlock(AbstractBlock<?> block) {
16952
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
162 try (Indent indent = Debug.logAndIndent("Block: %s", block)) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
163
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
164 InstructionValueConsumer loadConsumer = new InstructionValueConsumer() {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
165 @Override
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
166 public void visitValue(LIRInstruction instruction, Value value) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
167 if (isVariable(value)) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
168 Variable var = (Variable) value;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
169
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
170 if (!phiConstants.get(var.index)) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
171 if (!defined.get(var.index)) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
172 defined.set(var.index);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
173 if (isConstantLoad(instruction)) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
174 Debug.log("constant load: %s", instruction);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
175 map.put(var, new DefUseTree(instruction, block));
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
176 constantsTotal.increment();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
177 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
178 } else {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
179 // Variable is redefined, this only happens for constant loads
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
180 // introduced by phi resolution -> ignore.
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
181 DefUseTree removed = map.remove(var);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
182 if (removed != null) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
183 phiConstantsSkipped.increment();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
184 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
185 phiConstants.set(var.index);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
186 Debug.log(3, "Removing phi variable: %s", var);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
187 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
188 } else {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
189 assert defined.get(var.index) : "phi but not defined? " + var;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
190 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
191
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
192 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
193 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
194
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
195 };
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
196
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
197 ValuePositionProcedure useProcedure = new ValuePositionProcedure() {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
198 @Override
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
199 public void doValue(LIRInstruction instruction, ValuePosition position) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
200 Value value = position.get(instruction);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
201 if (isVariable(value)) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
202 Variable var = (Variable) value;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
203 if (!phiConstants.get(var.index)) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
204 DefUseTree tree = map.get(var);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
205 if (tree != null) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
206 tree.addUsage(block, instruction, position);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
207 Debug.log("usage of %s : %s", var, instruction);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
208 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
209 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
210 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
211 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
212
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
213 };
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
214
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
215 int opId = 0;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
216 for (LIRInstruction inst : lir.getLIRforBlock(block)) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
217 // set instruction id to the index in the lir instruction list
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
218 inst.setId(opId++);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
219 inst.visitEachOutput(loadConsumer);
17277
730aa0eb20e5 LIRIntrospection: rename forEach*(ValuePositionProcedure) to forEach*Pos.
Josef Eisl <josef.eisl@jku.at>
parents: 17212
diff changeset
220 inst.forEachInputPos(useProcedure);
730aa0eb20e5 LIRIntrospection: rename forEach*(ValuePositionProcedure) to forEach*Pos.
Josef Eisl <josef.eisl@jku.at>
parents: 17212
diff changeset
221 inst.forEachAlivePos(useProcedure);
16952
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
222
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
223 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
224 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
225 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
226
16953
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
227 /**
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
228 * Creates the dominator tree and searches for an solution.
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
229 */
16952
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
230 private void createConstantTree(DefUseTree tree) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
231 ConstantTree constTree = new ConstantTree(lir.getControlFlowGraph(), tree);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
232 constTree.set(Flags.SUBTREE, tree.getBlock());
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
233 tree.forEach(u -> constTree.set(Flags.USAGE, u.getBlock()));
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
234
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
235 if (constTree.get(Flags.USAGE, tree.getBlock())) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
236 // usage in the definition block -> no optimization
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
237 usageAtDefinitionSkipped.increment();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
238 return;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
239 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
240
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
241 constTree.markBlocks();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
242
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
243 NodeCost cost = ConstantTreeAnalyzer.analyze(constTree, tree.getBlock());
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
244 int usageCount = cost.getUsages().size();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
245 assert usageCount == tree.usageCount() : "Usage count differs: " + usageCount + " vs. " + tree.usageCount();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
246
16953
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
247 if (Debug.isLogEnabled()) {
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
248 try (Indent i = Debug.logAndIndent("Variable: %s, Block: %s, prob.: %f", tree.getVariable(), tree.getBlock(), tree.getBlock().probability())) {
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
249 Debug.log("Usages result: %s", cost);
16952
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
250 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
251
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
252 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
253
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
254 if (cost.getNumMaterializations() > 1 || cost.getBestCost() < tree.getBlock().probability()) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
255 try (Scope s = Debug.scope("CLOmodify", constTree); Indent i = Debug.logAndIndent("Replacing %s = %s", tree.getVariable(), tree.getConstant().toValueString())) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
256 // mark original load for removal
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
257 deleteInstruction(tree);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
258 constantsOptimized.increment();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
259
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
260 // collect result
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
261 createLoads(tree, constTree, tree.getBlock());
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
262
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
263 } catch (Throwable e) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
264 throw Debug.handle(e);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
265 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
266 } else {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
267 // no better solution found
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
268 materializeAtDefinitionSkipped.increment();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
269 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
270 Debug.dump(constTree, "ConstantTree for " + tree.getVariable());
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
271 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
272
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
273 private void createLoads(DefUseTree tree, ConstantTree constTree, AbstractBlock<?> startBlock) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
274 Deque<AbstractBlock<?>> worklist = new ArrayDeque<>();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
275 worklist.add(startBlock);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
276 while (!worklist.isEmpty()) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
277 AbstractBlock<?> block = worklist.pollLast();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
278 if (constTree.get(Flags.CANDIDATE, block)) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
279 constTree.set(Flags.MATERIALIZE, block);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
280 // create and insert load
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
281 insertLoad(tree.getConstant(), tree.getVariable().getLIRKind(), block, constTree.getCost(block).getUsages());
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
282 } else {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
283 for (AbstractBlock<?> dominated : block.getDominated()) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
284 if (constTree.isMarked(dominated)) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
285 worklist.addLast(dominated);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
286 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
287 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
288 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
289 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
290 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
291
16953
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
292 private void insertLoad(Constant constant, LIRKind kind, AbstractBlock<?> block, List<UseEntry> usages) {
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
293 assert usages != null && usages.size() > 0 : String.format("No usages %s %s %s", constant, block, usages);
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
294 // create variable
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
295 Variable variable = lirGen.newVariable(kind);
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
296 // create move
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
297 LIRInstruction move = lir.getSpillMoveFactory().createMove(variable, constant);
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
298 // insert instruction
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
299 getInsertionBuffer(block).append(1, move);
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
300 Debug.log("new move (%s) and inserted in block %s", move, block);
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
301 // update usages
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
302 for (UseEntry u : usages) {
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
303 u.getPosition().set(u.getInstruction(), variable);
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
304 Debug.log("patched instruction %s", u.getInstruction());
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
305 }
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
306 }
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
307
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
308 /**
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
309 * Inserts the constant loads created in {@link #createConstantTree} and deletes the original
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
310 * definition.
85020469ed2b ConstantLoadOptimization: minor cleanups.
Josef Eisl <josef.eisl@jku.at>
parents: 16952
diff changeset
311 */
16952
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
312 private void rewriteBlock(AbstractBlock<?> block) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
313 // insert moves
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
314 LIRInsertionBuffer buffer = insertionBuffers.get(block);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
315 if (buffer != null) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
316 assert buffer.initialized() : "not initialized?";
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
317 buffer.finish();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
318 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
319
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
320 // delete instructions
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
321 List<LIRInstruction> instructions = lir.getLIRforBlock(block);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
322 boolean hasDead = false;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
323 for (LIRInstruction inst : instructions) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
324 if (inst == null) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
325 hasDead = true;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
326 } else {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
327 inst.setId(-1);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
328 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
329 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
330 if (hasDead) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
331 // Remove null values from the list.
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
332 instructions.removeAll(Collections.singleton(null));
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
333 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
334 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
335
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
336 private void deleteInstruction(DefUseTree tree) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
337 AbstractBlock<?> block = tree.getBlock();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
338 LIRInstruction instruction = tree.getInstruction();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
339 Debug.log("deleting instruction %s from block %s", instruction, block);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
340 lir.getLIRforBlock(block).set(instruction.id(), null);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
341 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
342
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
343 private LIRInsertionBuffer getInsertionBuffer(AbstractBlock<?> block) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
344 LIRInsertionBuffer insertionBuffer = insertionBuffers.get(block);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
345 if (insertionBuffer == null) {
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
346 insertionBuffer = new LIRInsertionBuffer();
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
347 insertionBuffers.put(block, insertionBuffer);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
348 assert !insertionBuffer.initialized() : "already initialized?";
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
349 List<LIRInstruction> instructions = lir.getLIRforBlock(block);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
350 insertionBuffer.init(instructions);
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
351 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
352 return insertionBuffer;
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
353 }
2451521ed26f Add ConstantLoadOptimization.
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
354 }