annotate graal/com.oracle.graal.lir/src/com/oracle/graal/lir/gen/LIRGenerator.java @ 19130:6fce03279f0a

LIRGenerator: assert that we are not creating copies of variables (unintentionally). Creating copies of variables is almost always a bug.
author Josef Eisl <josef.eisl@jku.at>
date Wed, 04 Feb 2015 16:53:11 +0100
parents 3faa4f98d5c8
children 5fce692f65c8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
1 /*
16094
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
2 * Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
4 *
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
7 * published by the Free Software Foundation.
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
8 *
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
13 * accompanied this code).
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
14 *
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
18 *
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
21 * questions.
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
22 */
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
23 package com.oracle.graal.lir.gen;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
24
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
25 import static com.oracle.graal.api.code.ValueUtil.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
26 import static com.oracle.graal.lir.LIRValueUtil.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
27
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
28 import java.util.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
29
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
30 import com.oracle.graal.api.code.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
31 import com.oracle.graal.api.meta.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
32 import com.oracle.graal.asm.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
33 import com.oracle.graal.compiler.common.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
34 import com.oracle.graal.compiler.common.calc.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
35 import com.oracle.graal.compiler.common.cfg.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
36 import com.oracle.graal.compiler.common.spi.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
37 import com.oracle.graal.compiler.common.type.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
38 import com.oracle.graal.debug.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
39 import com.oracle.graal.lir.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
40 import com.oracle.graal.lir.StandardOp.BlockEndOp;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
41 import com.oracle.graal.lir.StandardOp.LabelOp;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
42 import com.oracle.graal.options.*;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
43
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
44 /**
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
45 * This class traverses the HIR instructions and generates LIR instructions from them.
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
46 */
18358
2dc0d4dcb709 Separate stamp for metaspace pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 18188
diff changeset
47 public abstract class LIRGenerator implements LIRGeneratorTool {
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
48
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
49 public static class Options {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
50 // @formatter:off
18674
ecb9d0cedbab First draft of option classification.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
51 @Option(help = "Print HIR along side LIR as the latter is generated", type = OptionType.Debug)
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
52 public static final OptionValue<Boolean> PrintIRWithLIR = new OptionValue<>(false);
18674
ecb9d0cedbab First draft of option classification.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18490
diff changeset
53 @Option(help = "The trace level for the LIR generator", type = OptionType.Debug)
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
54 public static final OptionValue<Integer> TraceLIRGeneratorLevel = new OptionValue<>(0);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
55 // @formatter:on
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
56 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
57
18358
2dc0d4dcb709 Separate stamp for metaspace pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 18188
diff changeset
58 private final LIRKindTool lirKindTool;
2dc0d4dcb709 Separate stamp for metaspace pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 18188
diff changeset
59
15304
e189f0fbe0c9 Rename LIRProviders to CodeGenProviders.
Josef Eisl <josef.eisl@jku.at>
parents: 15301
diff changeset
60 private final CodeGenProviders providers;
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
61 private final CallingConvention cc;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
62
15330
cc0dde80d6df Remove traceLevel and printIRWithLIR members from LIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 15308
diff changeset
63 private AbstractBlock<?> currentBlock;
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
64
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
65 private LIRGenerationResult res;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
66
18358
2dc0d4dcb709 Separate stamp for metaspace pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 18188
diff changeset
67 public LIRGenerator(LIRKindTool lirKindTool, CodeGenProviders providers, CallingConvention cc, LIRGenerationResult res) {
2dc0d4dcb709 Separate stamp for metaspace pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 18188
diff changeset
68 this.lirKindTool = lirKindTool;
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
69 this.res = res;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
70 this.providers = providers;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
71 this.cc = cc;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
72 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
73
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
74 /**
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
75 * Returns true if the redundant move elimination optimization should be done after register
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
76 * allocation.
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
77 */
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
78 public boolean canEliminateRedundantMoves() {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
79 return true;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
80 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
81
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
82 @Override
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
83 public TargetDescription target() {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
84 return getCodeCache().getTarget();
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
85 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
86
15304
e189f0fbe0c9 Rename LIRProviders to CodeGenProviders.
Josef Eisl <josef.eisl@jku.at>
parents: 15301
diff changeset
87 public CodeGenProviders getProviders() {
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
88 return providers;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
89 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
90
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
91 @Override
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
92 public MetaAccessProvider getMetaAccess() {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
93 return providers.getMetaAccess();
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
94 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
95
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
96 @Override
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
97 public CodeCacheProvider getCodeCache() {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
98 return providers.getCodeCache();
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
99 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
100
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
101 @Override
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
102 public ForeignCallsProvider getForeignCalls() {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
103 return providers.getForeignCalls();
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
104 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
105
18390
ce15cc6af5fe Additional constructor for AMD64HotSpotLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 18358
diff changeset
106 protected LIRKindTool getLIRKindTool() {
ce15cc6af5fe Additional constructor for AMD64HotSpotLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 18358
diff changeset
107 return lirKindTool;
ce15cc6af5fe Additional constructor for AMD64HotSpotLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 18358
diff changeset
108 }
ce15cc6af5fe Additional constructor for AMD64HotSpotLIRGenerator.
Roland Schatz <roland.schatz@oracle.com>
parents: 18358
diff changeset
109
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
110 @Override
16094
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
111 public Variable newVariable(LIRKind lirKind) {
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
112 return new Variable(lirKind, res.getLIR().nextVariable());
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
113 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
114
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
115 @Override
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
116 public RegisterAttributes attributes(Register register) {
18149
c6086a18c9ce Rename LIRGenerationResult.getFrameMap() to getFrameMapBuilder().
Josef Eisl <josef.eisl@jku.at>
parents: 18123
diff changeset
117 return res.getFrameMapBuilder().getRegisterConfig().getAttributesMap()[register.number];
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
118 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
119
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
120 @Override
17314
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
121 public Variable emitMove(Value input) {
19130
6fce03279f0a LIRGenerator: assert that we are not creating copies of variables (unintentionally).
Josef Eisl <josef.eisl@jku.at>
parents: 18976
diff changeset
122 assert !(input instanceof Variable) : "Creating a copy of a variable via this method is not supported (and potentially a bug): " + input;
17314
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
123 Variable result = newVariable(input.getLIRKind());
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
124 emitMove(result, input);
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
125 return result;
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
126 }
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
127
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
128 @Override
18188
8652481a1110 Introduce new Constant interface for use in high-level graph.
Roland Schatz <roland.schatz@oracle.com>
parents: 18187
diff changeset
129 public Value emitLoadConstant(LIRKind kind, Constant constant) {
8652481a1110 Introduce new Constant interface for use in high-level graph.
Roland Schatz <roland.schatz@oracle.com>
parents: 18187
diff changeset
130 JavaConstant javaConstant = (JavaConstant) constant;
8652481a1110 Introduce new Constant interface for use in high-level graph.
Roland Schatz <roland.schatz@oracle.com>
parents: 18187
diff changeset
131 if (canInlineConstant(javaConstant)) {
8652481a1110 Introduce new Constant interface for use in high-level graph.
Roland Schatz <roland.schatz@oracle.com>
parents: 18187
diff changeset
132 return javaConstant;
17314
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
133 } else {
18188
8652481a1110 Introduce new Constant interface for use in high-level graph.
Roland Schatz <roland.schatz@oracle.com>
parents: 18187
diff changeset
134 return emitMove(javaConstant);
17314
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
135 }
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
136 }
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
137
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
138 public AllocatableValue asAllocatable(Value value) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
139 if (isAllocatableValue(value)) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
140 return asAllocatableValue(value);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
141 } else {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
142 return emitMove(value);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
143 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
144 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
145
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
146 public Variable load(Value value) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
147 if (!isVariable(value)) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
148 return emitMove(value);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
149 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
150 return (Variable) value;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
151 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
152
17314
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
153 /**
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
154 * Checks whether the supplied constant can be used without loading it into a register for most
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
155 * operations, i.e., for commonly used arithmetic, logical, and comparison operations.
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
156 *
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
157 * @param c The constant to check.
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
158 * @return True if the constant can be used directly, false if the constant needs to be in a
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
159 * register.
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
160 */
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18149
diff changeset
161 protected abstract boolean canInlineConstant(JavaConstant c);
17314
3b6759c384a9 Introduce emitLoadConstant in LIRGeneratorTool.
Roland Schatz <roland.schatz@oracle.com>
parents: 16347
diff changeset
162
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
163 public Value loadNonConst(Value value) {
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18149
diff changeset
164 if (isConstant(value) && !canInlineConstant((JavaConstant) value)) {
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
165 return emitMove(value);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
166 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
167 return value;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
168 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
169
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
170 /**
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
171 * Determines if only oop maps are required for the code generated from the LIR.
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
172 */
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
173 public boolean needOnlyOopMaps() {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
174 return false;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
175 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
176
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
177 /**
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
178 * Gets the ABI specific operand used to return a value of a given kind from a method.
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
179 *
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
180 * @param kind the kind of value being returned
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
181 * @return the operand representing the ABI defined location used return a value of kind
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
182 * {@code kind}
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
183 */
16094
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
184 public AllocatableValue resultOperandFor(LIRKind kind) {
18149
c6086a18c9ce Rename LIRGenerationResult.getFrameMap() to getFrameMapBuilder().
Josef Eisl <josef.eisl@jku.at>
parents: 18123
diff changeset
185 return res.getFrameMapBuilder().getRegisterConfig().getReturnRegister((Kind) kind.getPlatformKind()).asValue(kind);
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
186 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
187
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
188 public void append(LIRInstruction op) {
15330
cc0dde80d6df Remove traceLevel and printIRWithLIR members from LIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 15308
diff changeset
189 if (Options.PrintIRWithLIR.getValue() && !TTY.isSuppressed()) {
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
190 TTY.println(op.toStringWithIdPrefix());
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
191 TTY.println();
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
192 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
193 assert LIRVerifier.verify(op);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
194 res.getLIR().getLIRforBlock(currentBlock).add(op);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
195 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
196
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
197 public boolean hasBlockEnd(AbstractBlock<?> block) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
198 List<LIRInstruction> ops = getResult().getLIR().getLIRforBlock(block);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
199 if (ops.size() == 0) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
200 return false;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
201 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
202 return ops.get(ops.size() - 1) instanceof BlockEndOp;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
203 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
204
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
205 public final void doBlockStart(AbstractBlock<?> block) {
15330
cc0dde80d6df Remove traceLevel and printIRWithLIR members from LIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 15308
diff changeset
206 if (Options.PrintIRWithLIR.getValue()) {
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
207 TTY.print(block.toString());
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
208 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
209
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
210 currentBlock = block;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
211
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
212 // set up the list of LIR instructions
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
213 assert res.getLIR().getLIRforBlock(block) == null : "LIR list already computed for this block";
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
214 res.getLIR().setLIRforBlock(block, new ArrayList<LIRInstruction>());
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
215
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
216 append(new LabelOp(new Label(block.getId()), block.isAligned()));
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
217
15330
cc0dde80d6df Remove traceLevel and printIRWithLIR members from LIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 15308
diff changeset
218 if (Options.TraceLIRGeneratorLevel.getValue() >= 1) {
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
219 TTY.println("BEGIN Generating LIR for block B" + block.getId());
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
220 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
221 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
222
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
223 public final void doBlockEnd(AbstractBlock<?> block) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
224
15330
cc0dde80d6df Remove traceLevel and printIRWithLIR members from LIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 15308
diff changeset
225 if (Options.TraceLIRGeneratorLevel.getValue() >= 1) {
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
226 TTY.println("END Generating LIR for block B" + block.getId());
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
227 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
228
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
229 currentBlock = null;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
230
15330
cc0dde80d6df Remove traceLevel and printIRWithLIR members from LIRGenerator.
Josef Eisl <josef.eisl@jku.at>
parents: 15308
diff changeset
231 if (Options.PrintIRWithLIR.getValue()) {
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
232 TTY.println();
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
233 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
234 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
235
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
236 public void emitIncomingValues(Value[] params) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
237 ((LabelOp) res.getLIR().getLIRforBlock(currentBlock).get(0)).setIncomingValues(params);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
238 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
239
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
240 public abstract void emitJump(LabelRef label);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
241
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
242 public abstract void emitCompareBranch(PlatformKind cmpKind, Value left, Value right, Condition cond, boolean unorderedIsTrue, LabelRef trueDestination, LabelRef falseDestination,
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
243 double trueDestinationProbability);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
244
18843
5e80dd2f1783 Extend emitMul, emitAdd and emitSub in ArithmeticLIRGenerator for explicitly requesting to set the flags register. (In AMD64 flags are set implicitly, but on SPARC it is not)
Stefan Anzinger <stefan.anzinger@oracle.com>
parents: 18674
diff changeset
245 public abstract void emitOverflowCheckBranch(LabelRef overflow, LabelRef noOverflow, LIRKind cmpKind, double overflowProbability);
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
246
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
247 public abstract void emitIntegerTestBranch(Value left, Value right, LabelRef trueDestination, LabelRef falseDestination, double trueSuccessorProbability);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
248
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
249 public abstract Variable emitConditionalMove(PlatformKind cmpKind, Value leftVal, Value right, Condition cond, boolean unorderedIsTrue, Value trueValue, Value falseValue);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
250
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
251 public abstract Variable emitIntegerTestMove(Value leftVal, Value right, Value trueValue, Value falseValue);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
252
18976
3faa4f98d5c8 renamed LIRGenerator.emitForeignCall to emitForeignCallOp to avoid confusion
Doug Simon <doug.simon@oracle.com>
parents: 18933
diff changeset
253 /**
3faa4f98d5c8 renamed LIRGenerator.emitForeignCall to emitForeignCallOp to avoid confusion
Doug Simon <doug.simon@oracle.com>
parents: 18933
diff changeset
254 * Emits the single call operation at the heart of generating LIR for a
3faa4f98d5c8 renamed LIRGenerator.emitForeignCall to emitForeignCallOp to avoid confusion
Doug Simon <doug.simon@oracle.com>
parents: 18933
diff changeset
255 * {@linkplain #emitForeignCall(ForeignCallLinkage, LIRFrameState, Value...) foreign call}.
3faa4f98d5c8 renamed LIRGenerator.emitForeignCall to emitForeignCallOp to avoid confusion
Doug Simon <doug.simon@oracle.com>
parents: 18933
diff changeset
256 */
3faa4f98d5c8 renamed LIRGenerator.emitForeignCall to emitForeignCallOp to avoid confusion
Doug Simon <doug.simon@oracle.com>
parents: 18933
diff changeset
257 protected abstract void emitForeignCallOp(ForeignCallLinkage linkage, Value result, Value[] arguments, Value[] temps, LIRFrameState info);
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
258
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
259 public static AllocatableValue toStackKind(AllocatableValue value) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
260 if (value.getKind().getStackKind() != value.getKind()) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
261 // We only have stack-kinds in the LIR, so convert the operand kind for values from the
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
262 // calling convention.
16094
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
263 LIRKind stackKind = value.getLIRKind().changeType(value.getKind().getStackKind());
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
264 if (isRegister(value)) {
16094
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
265 return asRegister(value).asValue(stackKind);
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
266 } else if (isStackSlot(value)) {
16094
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
267 return StackSlot.get(stackKind, asStackSlot(value).getRawOffset(), asStackSlot(value).getRawAddFrameSize());
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
268 } else {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
269 throw GraalInternalError.shouldNotReachHere();
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
270 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
271 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
272 return value;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
273 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
274
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
275 @Override
15301
468b2428c403 Change DeoptimizingNode and Access to LIRFrameState in *LIRGenerator*.
Josef Eisl <josef.eisl@jku.at>
parents: 15297
diff changeset
276 public Variable emitForeignCall(ForeignCallLinkage linkage, LIRFrameState frameState, Value... args) {
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
277 LIRFrameState state = null;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
278 if (linkage.canDeoptimize()) {
15301
468b2428c403 Change DeoptimizingNode and Access to LIRFrameState in *LIRGenerator*.
Josef Eisl <josef.eisl@jku.at>
parents: 15297
diff changeset
279 if (frameState != null) {
468b2428c403 Change DeoptimizingNode and Access to LIRFrameState in *LIRGenerator*.
Josef Eisl <josef.eisl@jku.at>
parents: 15297
diff changeset
280 state = frameState;
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
281 } else {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
282 assert needOnlyOopMaps();
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
283 state = new LIRFrameState(null, null, null);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
284 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
285 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
286
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
287 // move the arguments into the correct location
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
288 CallingConvention linkageCc = linkage.getOutgoingCallingConvention();
18149
c6086a18c9ce Rename LIRGenerationResult.getFrameMap() to getFrameMapBuilder().
Josef Eisl <josef.eisl@jku.at>
parents: 18123
diff changeset
289 res.getFrameMapBuilder().callsMethod(linkageCc);
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
290 assert linkageCc.getArgumentCount() == args.length : "argument count mismatch";
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
291 Value[] argLocations = new Value[args.length];
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
292 for (int i = 0; i < args.length; i++) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
293 Value arg = args[i];
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
294 AllocatableValue loc = linkageCc.getArgument(i);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
295 emitMove(loc, arg);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
296 argLocations[i] = loc;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
297 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
298 res.setForeignCall(true);
18976
3faa4f98d5c8 renamed LIRGenerator.emitForeignCall to emitForeignCallOp to avoid confusion
Doug Simon <doug.simon@oracle.com>
parents: 18933
diff changeset
299 emitForeignCallOp(linkage, linkageCc.getReturn(), argLocations, linkage.getTemporaries(), state);
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
300
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
301 if (isLegal(linkageCc.getReturn())) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
302 return emitMove(linkageCc.getReturn());
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
303 } else {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
304 return null;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
305 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
306 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
307
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18149
diff changeset
308 public void emitStrategySwitch(JavaConstant[] keyConstants, double[] keyProbabilities, LabelRef[] keyTargets, LabelRef defaultTarget, Variable value) {
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
309 int keyCount = keyConstants.length;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
310 SwitchStrategy strategy = SwitchStrategy.getBestStrategy(keyProbabilities, keyConstants, keyTargets);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
311 long valueRange = keyConstants[keyCount - 1].asLong() - keyConstants[0].asLong() + 1;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
312 double tableSwitchDensity = keyCount / (double) valueRange;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
313 /*
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
314 * This heuristic tries to find a compromise between the effort for the best switch strategy
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
315 * and the density of a tableswitch. If the effort for the strategy is at least 4, then a
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
316 * tableswitch is preferred if better than a certain value that starts at 0.5 and lowers
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
317 * gradually with additional effort.
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
318 */
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
319 if (strategy.getAverageEffort() < 4 || tableSwitchDensity < (1 / Math.sqrt(strategy.getAverageEffort()))) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
320 emitStrategySwitch(strategy, value, keyTargets, defaultTarget);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
321 } else {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
322 int minValue = keyConstants[0].asInt();
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
323 assert valueRange < Integer.MAX_VALUE;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
324 LabelRef[] targets = new LabelRef[(int) valueRange];
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
325 for (int i = 0; i < valueRange; i++) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
326 targets[i] = defaultTarget;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
327 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
328 for (int i = 0; i < keyCount; i++) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
329 targets[keyConstants[i].asInt() - minValue] = keyTargets[i];
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
330 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
331 emitTableSwitch(minValue, defaultTarget, targets, value);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
332 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
333 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
334
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
335 public abstract void emitStrategySwitch(SwitchStrategy strategy, Variable key, LabelRef[] keyTargets, LabelRef defaultTarget);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
336
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
337 protected abstract void emitTableSwitch(int lowKey, LabelRef defaultTarget, LabelRef[] targets, Value key);
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
338
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
339 public CallingConvention getCallingConvention() {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
340 return cc;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
341 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
342
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
343 @Override
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
344 public void beforeRegisterAllocation() {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
345 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
346
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
347 /**
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
348 * Gets a garbage value for a given kind.
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
349 */
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18149
diff changeset
350 protected JavaConstant zapValueForKind(PlatformKind kind) {
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
351 long dead = 0xDEADDEADDEADDEADL;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
352 switch ((Kind) kind) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
353 case Boolean:
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18149
diff changeset
354 return JavaConstant.FALSE;
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
355 case Byte:
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18149
diff changeset
356 return JavaConstant.forByte((byte) dead);
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
357 case Char:
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18149
diff changeset
358 return JavaConstant.forChar((char) dead);
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
359 case Short:
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18149
diff changeset
360 return JavaConstant.forShort((short) dead);
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
361 case Int:
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18149
diff changeset
362 return JavaConstant.forInt((int) dead);
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
363 case Double:
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18149
diff changeset
364 return JavaConstant.forDouble(Double.longBitsToDouble(dead));
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
365 case Float:
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18149
diff changeset
366 return JavaConstant.forFloat(Float.intBitsToFloat((int) dead));
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
367 case Long:
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 18149
diff changeset
368 return JavaConstant.forLong(dead);
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
369 case Object:
18490
ca81508f2a19 Generalize NULL handling to work on arbitrary pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 18390
diff changeset
370 return JavaConstant.NULL_POINTER;
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
371 default:
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
372 throw new IllegalArgumentException(kind.toString());
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
373 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
374 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
375
16094
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
376 public LIRKind getLIRKind(Stamp stamp) {
18358
2dc0d4dcb709 Separate stamp for metaspace pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 18188
diff changeset
377 return stamp.getLIRKind(lirKindTool);
16094
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
378 }
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
379
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
380 protected LIRKind getAddressKind(Value base, long displacement, Value index) {
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
381 if (base.getLIRKind().isValue() && (index.equals(Value.ILLEGAL) || index.getLIRKind().isValue())) {
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
382 return LIRKind.value(target().wordKind);
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
383 } else if (base.getLIRKind().isReference(0) && displacement == 0L && index.equals(Value.ILLEGAL)) {
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
384 return LIRKind.reference(target().wordKind);
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
385 } else {
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
386 return LIRKind.derivedReference(target().wordKind);
c0b8d395368b Introduce LIRKind to accurately track oop references in backend.
Roland Schatz <roland.schatz@oracle.com>
parents: 16092
diff changeset
387 }
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
388 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
389
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
390 public AbstractBlock<?> getCurrentBlock() {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
391 return currentBlock;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
392 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
393
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
394 void setCurrentBlock(AbstractBlock<?> block) {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
395 currentBlock = block;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
396 }
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
397
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
398 public LIRGenerationResult getResult() {
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
399 return res;
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
400 }
18933
76553fa0f02b Compiler intrinsic for JMH blackhole.
Roland Schatz <roland.schatz@oracle.com>
parents: 18843
diff changeset
401
76553fa0f02b Compiler intrinsic for JMH blackhole.
Roland Schatz <roland.schatz@oracle.com>
parents: 18843
diff changeset
402 public void emitBlackhole(Value operand) {
76553fa0f02b Compiler intrinsic for JMH blackhole.
Roland Schatz <roland.schatz@oracle.com>
parents: 18843
diff changeset
403 append(new StandardOp.BlackholeOp(operand));
76553fa0f02b Compiler intrinsic for JMH blackhole.
Roland Schatz <roland.schatz@oracle.com>
parents: 18843
diff changeset
404 }
15297
3a6151ed5a25 Move LIRGenerator to graal.lir (errors).
Josef Eisl <josef.eisl@jku.at>
parents:
diff changeset
405 }