Mercurial > hg > truffle
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 |
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 } |