Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/c1/c1_Instruction.hpp
40930 views
1
/*
2
* Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*
23
*/
24
25
#ifndef SHARE_C1_C1_INSTRUCTION_HPP
26
#define SHARE_C1_C1_INSTRUCTION_HPP
27
28
#include "c1/c1_Compilation.hpp"
29
#include "c1/c1_LIR.hpp"
30
#include "c1/c1_ValueType.hpp"
31
#include "ci/ciField.hpp"
32
33
// Predefined classes
34
class ciField;
35
class ValueStack;
36
class InstructionPrinter;
37
class IRScope;
38
class LIR_OprDesc;
39
typedef LIR_OprDesc* LIR_Opr;
40
41
42
// Instruction class hierarchy
43
//
44
// All leaf classes in the class hierarchy are concrete classes
45
// (i.e., are instantiated). All other classes are abstract and
46
// serve factoring.
47
48
class Instruction;
49
class Phi;
50
class Local;
51
class Constant;
52
class AccessField;
53
class LoadField;
54
class StoreField;
55
class AccessArray;
56
class ArrayLength;
57
class AccessIndexed;
58
class LoadIndexed;
59
class StoreIndexed;
60
class NegateOp;
61
class Op2;
62
class ArithmeticOp;
63
class ShiftOp;
64
class LogicOp;
65
class CompareOp;
66
class IfOp;
67
class Convert;
68
class NullCheck;
69
class TypeCast;
70
class OsrEntry;
71
class ExceptionObject;
72
class StateSplit;
73
class Invoke;
74
class NewInstance;
75
class NewArray;
76
class NewTypeArray;
77
class NewObjectArray;
78
class NewMultiArray;
79
class TypeCheck;
80
class CheckCast;
81
class InstanceOf;
82
class AccessMonitor;
83
class MonitorEnter;
84
class MonitorExit;
85
class Intrinsic;
86
class BlockBegin;
87
class BlockEnd;
88
class Goto;
89
class If;
90
class Switch;
91
class TableSwitch;
92
class LookupSwitch;
93
class Return;
94
class Throw;
95
class Base;
96
class RoundFP;
97
class UnsafeOp;
98
class UnsafeRawOp;
99
class UnsafeGetRaw;
100
class UnsafePutRaw;
101
class UnsafeObjectOp;
102
class UnsafeGetObject;
103
class UnsafePutObject;
104
class UnsafeGetAndSetObject;
105
class ProfileCall;
106
class ProfileReturnType;
107
class ProfileInvoke;
108
class RuntimeCall;
109
class MemBar;
110
class RangeCheckPredicate;
111
#ifdef ASSERT
112
class Assert;
113
#endif
114
115
// A Value is a reference to the instruction creating the value
116
typedef Instruction* Value;
117
typedef GrowableArray<Value> Values;
118
typedef GrowableArray<ValueStack*> ValueStackStack;
119
120
// BlockClosure is the base class for block traversal/iteration.
121
122
class BlockClosure: public CompilationResourceObj {
123
public:
124
virtual void block_do(BlockBegin* block) = 0;
125
};
126
127
128
// A simple closure class for visiting the values of an Instruction
129
class ValueVisitor: public StackObj {
130
public:
131
virtual void visit(Value* v) = 0;
132
};
133
134
135
// Some array and list classes
136
typedef GrowableArray<BlockBegin*> BlockBeginArray;
137
138
class BlockList: public GrowableArray<BlockBegin*> {
139
public:
140
BlockList(): GrowableArray<BlockBegin*>() {}
141
BlockList(const int size): GrowableArray<BlockBegin*>(size) {}
142
BlockList(const int size, BlockBegin* init): GrowableArray<BlockBegin*>(size, size, init) {}
143
144
void iterate_forward(BlockClosure* closure);
145
void iterate_backward(BlockClosure* closure);
146
void blocks_do(void f(BlockBegin*));
147
void values_do(ValueVisitor* f);
148
void print(bool cfg_only = false, bool live_only = false) PRODUCT_RETURN;
149
};
150
151
152
// InstructionVisitors provide type-based dispatch for instructions.
153
// For each concrete Instruction class X, a virtual function do_X is
154
// provided. Functionality that needs to be implemented for all classes
155
// (e.g., printing, code generation) is factored out into a specialised
156
// visitor instead of added to the Instruction classes itself.
157
158
class InstructionVisitor: public StackObj {
159
public:
160
virtual void do_Phi (Phi* x) = 0;
161
virtual void do_Local (Local* x) = 0;
162
virtual void do_Constant (Constant* x) = 0;
163
virtual void do_LoadField (LoadField* x) = 0;
164
virtual void do_StoreField (StoreField* x) = 0;
165
virtual void do_ArrayLength (ArrayLength* x) = 0;
166
virtual void do_LoadIndexed (LoadIndexed* x) = 0;
167
virtual void do_StoreIndexed (StoreIndexed* x) = 0;
168
virtual void do_NegateOp (NegateOp* x) = 0;
169
virtual void do_ArithmeticOp (ArithmeticOp* x) = 0;
170
virtual void do_ShiftOp (ShiftOp* x) = 0;
171
virtual void do_LogicOp (LogicOp* x) = 0;
172
virtual void do_CompareOp (CompareOp* x) = 0;
173
virtual void do_IfOp (IfOp* x) = 0;
174
virtual void do_Convert (Convert* x) = 0;
175
virtual void do_NullCheck (NullCheck* x) = 0;
176
virtual void do_TypeCast (TypeCast* x) = 0;
177
virtual void do_Invoke (Invoke* x) = 0;
178
virtual void do_NewInstance (NewInstance* x) = 0;
179
virtual void do_NewTypeArray (NewTypeArray* x) = 0;
180
virtual void do_NewObjectArray (NewObjectArray* x) = 0;
181
virtual void do_NewMultiArray (NewMultiArray* x) = 0;
182
virtual void do_CheckCast (CheckCast* x) = 0;
183
virtual void do_InstanceOf (InstanceOf* x) = 0;
184
virtual void do_MonitorEnter (MonitorEnter* x) = 0;
185
virtual void do_MonitorExit (MonitorExit* x) = 0;
186
virtual void do_Intrinsic (Intrinsic* x) = 0;
187
virtual void do_BlockBegin (BlockBegin* x) = 0;
188
virtual void do_Goto (Goto* x) = 0;
189
virtual void do_If (If* x) = 0;
190
virtual void do_TableSwitch (TableSwitch* x) = 0;
191
virtual void do_LookupSwitch (LookupSwitch* x) = 0;
192
virtual void do_Return (Return* x) = 0;
193
virtual void do_Throw (Throw* x) = 0;
194
virtual void do_Base (Base* x) = 0;
195
virtual void do_OsrEntry (OsrEntry* x) = 0;
196
virtual void do_ExceptionObject(ExceptionObject* x) = 0;
197
virtual void do_RoundFP (RoundFP* x) = 0;
198
virtual void do_UnsafeGetRaw (UnsafeGetRaw* x) = 0;
199
virtual void do_UnsafePutRaw (UnsafePutRaw* x) = 0;
200
virtual void do_UnsafeGetObject(UnsafeGetObject* x) = 0;
201
virtual void do_UnsafePutObject(UnsafePutObject* x) = 0;
202
virtual void do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) = 0;
203
virtual void do_ProfileCall (ProfileCall* x) = 0;
204
virtual void do_ProfileReturnType (ProfileReturnType* x) = 0;
205
virtual void do_ProfileInvoke (ProfileInvoke* x) = 0;
206
virtual void do_RuntimeCall (RuntimeCall* x) = 0;
207
virtual void do_MemBar (MemBar* x) = 0;
208
virtual void do_RangeCheckPredicate(RangeCheckPredicate* x) = 0;
209
#ifdef ASSERT
210
virtual void do_Assert (Assert* x) = 0;
211
#endif
212
};
213
214
215
// Hashing support
216
//
217
// Note: This hash functions affect the performance
218
// of ValueMap - make changes carefully!
219
220
#define HASH1(x1 ) ((intx)(x1))
221
#define HASH2(x1, x2 ) ((HASH1(x1 ) << 7) ^ HASH1(x2))
222
#define HASH3(x1, x2, x3 ) ((HASH2(x1, x2 ) << 7) ^ HASH1(x3))
223
#define HASH4(x1, x2, x3, x4) ((HASH3(x1, x2, x3) << 7) ^ HASH1(x4))
224
225
226
// The following macros are used to implement instruction-specific hashing.
227
// By default, each instruction implements hash() and is_equal(Value), used
228
// for value numbering/common subexpression elimination. The default imple-
229
// mentation disables value numbering. Each instruction which can be value-
230
// numbered, should define corresponding hash() and is_equal(Value) functions
231
// via the macros below. The f arguments specify all the values/op codes, etc.
232
// that need to be identical for two instructions to be identical.
233
//
234
// Note: The default implementation of hash() returns 0 in order to indicate
235
// that the instruction should not be considered for value numbering.
236
// The currently used hash functions do not guarantee that never a 0
237
// is produced. While this is still correct, it may be a performance
238
// bug (no value numbering for that node). However, this situation is
239
// so unlikely, that we are not going to handle it specially.
240
241
#define HASHING1(class_name, enabled, f1) \
242
virtual intx hash() const { \
243
return (enabled) ? HASH2(name(), f1) : 0; \
244
} \
245
virtual bool is_equal(Value v) const { \
246
if (!(enabled) ) return false; \
247
class_name* _v = v->as_##class_name(); \
248
if (_v == NULL ) return false; \
249
if (f1 != _v->f1) return false; \
250
return true; \
251
} \
252
253
254
#define HASHING2(class_name, enabled, f1, f2) \
255
virtual intx hash() const { \
256
return (enabled) ? HASH3(name(), f1, f2) : 0; \
257
} \
258
virtual bool is_equal(Value v) const { \
259
if (!(enabled) ) return false; \
260
class_name* _v = v->as_##class_name(); \
261
if (_v == NULL ) return false; \
262
if (f1 != _v->f1) return false; \
263
if (f2 != _v->f2) return false; \
264
return true; \
265
} \
266
267
268
#define HASHING3(class_name, enabled, f1, f2, f3) \
269
virtual intx hash() const { \
270
return (enabled) ? HASH4(name(), f1, f2, f3) : 0; \
271
} \
272
virtual bool is_equal(Value v) const { \
273
if (!(enabled) ) return false; \
274
class_name* _v = v->as_##class_name(); \
275
if (_v == NULL ) return false; \
276
if (f1 != _v->f1) return false; \
277
if (f2 != _v->f2) return false; \
278
if (f3 != _v->f3) return false; \
279
return true; \
280
} \
281
282
283
// The mother of all instructions...
284
285
class Instruction: public CompilationResourceObj {
286
private:
287
int _id; // the unique instruction id
288
#ifndef PRODUCT
289
int _printable_bci; // the bci of the instruction for printing
290
#endif
291
int _use_count; // the number of instructions refering to this value (w/o prev/next); only roots can have use count = 0 or > 1
292
int _pin_state; // set of PinReason describing the reason for pinning
293
ValueType* _type; // the instruction value type
294
Instruction* _next; // the next instruction if any (NULL for BlockEnd instructions)
295
Instruction* _subst; // the substitution instruction if any
296
LIR_Opr _operand; // LIR specific information
297
unsigned int _flags; // Flag bits
298
299
ValueStack* _state_before; // Copy of state with input operands still on stack (or NULL)
300
ValueStack* _exception_state; // Copy of state for exception handling
301
XHandlers* _exception_handlers; // Flat list of exception handlers covering this instruction
302
303
friend class UseCountComputer;
304
305
void update_exception_state(ValueStack* state);
306
307
protected:
308
BlockBegin* _block; // Block that contains this instruction
309
310
void set_type(ValueType* type) {
311
assert(type != NULL, "type must exist");
312
_type = type;
313
}
314
315
// Helper class to keep track of which arguments need a null check
316
class ArgsNonNullState {
317
private:
318
int _nonnull_state; // mask identifying which args are nonnull
319
public:
320
ArgsNonNullState()
321
: _nonnull_state(AllBits) {}
322
323
// Does argument number i needs a null check?
324
bool arg_needs_null_check(int i) const {
325
// No data is kept for arguments starting at position 33 so
326
// conservatively assume that they need a null check.
327
if (i >= 0 && i < (int)sizeof(_nonnull_state) * BitsPerByte) {
328
return is_set_nth_bit(_nonnull_state, i);
329
}
330
return true;
331
}
332
333
// Set whether argument number i needs a null check or not
334
void set_arg_needs_null_check(int i, bool check) {
335
if (i >= 0 && i < (int)sizeof(_nonnull_state) * BitsPerByte) {
336
if (check) {
337
_nonnull_state |= nth_bit(i);
338
} else {
339
_nonnull_state &= ~(nth_bit(i));
340
}
341
}
342
}
343
};
344
345
public:
346
void* operator new(size_t size) throw() {
347
Compilation* c = Compilation::current();
348
void* res = c->arena()->Amalloc(size);
349
return res;
350
}
351
352
static const int no_bci = -99;
353
354
enum InstructionFlag {
355
NeedsNullCheckFlag = 0,
356
CanTrapFlag,
357
DirectCompareFlag,
358
IsEliminatedFlag,
359
IsSafepointFlag,
360
IsStaticFlag,
361
NeedsStoreCheckFlag,
362
NeedsWriteBarrierFlag,
363
PreservesStateFlag,
364
TargetIsFinalFlag,
365
TargetIsLoadedFlag,
366
UnorderedIsTrueFlag,
367
NeedsPatchingFlag,
368
ThrowIncompatibleClassChangeErrorFlag,
369
InvokeSpecialReceiverCheckFlag,
370
ProfileMDOFlag,
371
IsLinkedInBlockFlag,
372
NeedsRangeCheckFlag,
373
InWorkListFlag,
374
DeoptimizeOnException,
375
InstructionLastFlag
376
};
377
378
public:
379
bool check_flag(InstructionFlag id) const { return (_flags & (1 << id)) != 0; }
380
void set_flag(InstructionFlag id, bool f) { _flags = f ? (_flags | (1 << id)) : (_flags & ~(1 << id)); };
381
382
// 'globally' used condition values
383
enum Condition {
384
eql, neq, lss, leq, gtr, geq, aeq, beq
385
};
386
387
// Instructions may be pinned for many reasons and under certain conditions
388
// with enough knowledge it's possible to safely unpin them.
389
enum PinReason {
390
PinUnknown = 1 << 0
391
, PinExplicitNullCheck = 1 << 3
392
, PinStackForStateSplit= 1 << 12
393
, PinStateSplitConstructor= 1 << 13
394
, PinGlobalValueNumbering= 1 << 14
395
};
396
397
static Condition mirror(Condition cond);
398
static Condition negate(Condition cond);
399
400
// initialization
401
static int number_of_instructions() {
402
return Compilation::current()->number_of_instructions();
403
}
404
405
// creation
406
Instruction(ValueType* type, ValueStack* state_before = NULL, bool type_is_constant = false)
407
: _id(Compilation::current()->get_next_id()),
408
#ifndef PRODUCT
409
_printable_bci(-99),
410
#endif
411
_use_count(0)
412
, _pin_state(0)
413
, _type(type)
414
, _next(NULL)
415
, _subst(NULL)
416
, _operand(LIR_OprFact::illegalOpr)
417
, _flags(0)
418
, _state_before(state_before)
419
, _exception_handlers(NULL)
420
, _block(NULL)
421
{
422
check_state(state_before);
423
assert(type != NULL && (!type->is_constant() || type_is_constant), "type must exist");
424
update_exception_state(_state_before);
425
}
426
427
// accessors
428
int id() const { return _id; }
429
#ifndef PRODUCT
430
bool has_printable_bci() const { return _printable_bci != -99; }
431
int printable_bci() const { assert(has_printable_bci(), "_printable_bci should have been set"); return _printable_bci; }
432
void set_printable_bci(int bci) { _printable_bci = bci; }
433
#endif
434
int dominator_depth();
435
int use_count() const { return _use_count; }
436
int pin_state() const { return _pin_state; }
437
bool is_pinned() const { return _pin_state != 0 || PinAllInstructions; }
438
ValueType* type() const { return _type; }
439
BlockBegin *block() const { return _block; }
440
Instruction* prev(); // use carefully, expensive operation
441
Instruction* next() const { return _next; }
442
bool has_subst() const { return _subst != NULL; }
443
Instruction* subst() { return _subst == NULL ? this : _subst->subst(); }
444
LIR_Opr operand() const { return _operand; }
445
446
void set_needs_null_check(bool f) { set_flag(NeedsNullCheckFlag, f); }
447
bool needs_null_check() const { return check_flag(NeedsNullCheckFlag); }
448
bool is_linked() const { return check_flag(IsLinkedInBlockFlag); }
449
bool can_be_linked() { return as_Local() == NULL && as_Phi() == NULL; }
450
451
bool is_null_obj() { return as_Constant() != NULL && type()->as_ObjectType()->constant_value()->is_null_object(); }
452
453
bool has_uses() const { return use_count() > 0; }
454
ValueStack* state_before() const { return _state_before; }
455
ValueStack* exception_state() const { return _exception_state; }
456
virtual bool needs_exception_state() const { return true; }
457
XHandlers* exception_handlers() const { return _exception_handlers; }
458
459
// manipulation
460
void pin(PinReason reason) { _pin_state |= reason; }
461
void pin() { _pin_state |= PinUnknown; }
462
// DANGEROUS: only used by EliminateStores
463
void unpin(PinReason reason) { assert((reason & PinUnknown) == 0, "can't unpin unknown state"); _pin_state &= ~reason; }
464
465
Instruction* set_next(Instruction* next) {
466
assert(next->has_printable_bci(), "_printable_bci should have been set");
467
assert(next != NULL, "must not be NULL");
468
assert(as_BlockEnd() == NULL, "BlockEnd instructions must have no next");
469
assert(next->can_be_linked(), "shouldn't link these instructions into list");
470
471
BlockBegin *block = this->block();
472
next->_block = block;
473
474
next->set_flag(Instruction::IsLinkedInBlockFlag, true);
475
_next = next;
476
return next;
477
}
478
479
Instruction* set_next(Instruction* next, int bci) {
480
#ifndef PRODUCT
481
next->set_printable_bci(bci);
482
#endif
483
return set_next(next);
484
}
485
486
// when blocks are merged
487
void fixup_block_pointers() {
488
Instruction *cur = next()->next(); // next()'s block is set in set_next
489
while (cur && cur->_block != block()) {
490
cur->_block = block();
491
cur = cur->next();
492
}
493
}
494
495
Instruction *insert_after(Instruction *i) {
496
Instruction* n = _next;
497
set_next(i);
498
i->set_next(n);
499
return _next;
500
}
501
502
Instruction *insert_after_same_bci(Instruction *i) {
503
#ifndef PRODUCT
504
i->set_printable_bci(printable_bci());
505
#endif
506
return insert_after(i);
507
}
508
509
void set_subst(Instruction* subst) {
510
assert(subst == NULL ||
511
type()->base() == subst->type()->base() ||
512
subst->type()->base() == illegalType, "type can't change");
513
_subst = subst;
514
}
515
void set_exception_handlers(XHandlers *xhandlers) { _exception_handlers = xhandlers; }
516
void set_exception_state(ValueStack* s) { check_state(s); _exception_state = s; }
517
void set_state_before(ValueStack* s) { check_state(s); _state_before = s; }
518
519
// machine-specifics
520
void set_operand(LIR_Opr operand) { assert(operand != LIR_OprFact::illegalOpr, "operand must exist"); _operand = operand; }
521
void clear_operand() { _operand = LIR_OprFact::illegalOpr; }
522
523
// generic
524
virtual Instruction* as_Instruction() { return this; } // to satisfy HASHING1 macro
525
virtual Phi* as_Phi() { return NULL; }
526
virtual Local* as_Local() { return NULL; }
527
virtual Constant* as_Constant() { return NULL; }
528
virtual AccessField* as_AccessField() { return NULL; }
529
virtual LoadField* as_LoadField() { return NULL; }
530
virtual StoreField* as_StoreField() { return NULL; }
531
virtual AccessArray* as_AccessArray() { return NULL; }
532
virtual ArrayLength* as_ArrayLength() { return NULL; }
533
virtual AccessIndexed* as_AccessIndexed() { return NULL; }
534
virtual LoadIndexed* as_LoadIndexed() { return NULL; }
535
virtual StoreIndexed* as_StoreIndexed() { return NULL; }
536
virtual NegateOp* as_NegateOp() { return NULL; }
537
virtual Op2* as_Op2() { return NULL; }
538
virtual ArithmeticOp* as_ArithmeticOp() { return NULL; }
539
virtual ShiftOp* as_ShiftOp() { return NULL; }
540
virtual LogicOp* as_LogicOp() { return NULL; }
541
virtual CompareOp* as_CompareOp() { return NULL; }
542
virtual IfOp* as_IfOp() { return NULL; }
543
virtual Convert* as_Convert() { return NULL; }
544
virtual NullCheck* as_NullCheck() { return NULL; }
545
virtual OsrEntry* as_OsrEntry() { return NULL; }
546
virtual StateSplit* as_StateSplit() { return NULL; }
547
virtual Invoke* as_Invoke() { return NULL; }
548
virtual NewInstance* as_NewInstance() { return NULL; }
549
virtual NewArray* as_NewArray() { return NULL; }
550
virtual NewTypeArray* as_NewTypeArray() { return NULL; }
551
virtual NewObjectArray* as_NewObjectArray() { return NULL; }
552
virtual NewMultiArray* as_NewMultiArray() { return NULL; }
553
virtual TypeCheck* as_TypeCheck() { return NULL; }
554
virtual CheckCast* as_CheckCast() { return NULL; }
555
virtual InstanceOf* as_InstanceOf() { return NULL; }
556
virtual TypeCast* as_TypeCast() { return NULL; }
557
virtual AccessMonitor* as_AccessMonitor() { return NULL; }
558
virtual MonitorEnter* as_MonitorEnter() { return NULL; }
559
virtual MonitorExit* as_MonitorExit() { return NULL; }
560
virtual Intrinsic* as_Intrinsic() { return NULL; }
561
virtual BlockBegin* as_BlockBegin() { return NULL; }
562
virtual BlockEnd* as_BlockEnd() { return NULL; }
563
virtual Goto* as_Goto() { return NULL; }
564
virtual If* as_If() { return NULL; }
565
virtual TableSwitch* as_TableSwitch() { return NULL; }
566
virtual LookupSwitch* as_LookupSwitch() { return NULL; }
567
virtual Return* as_Return() { return NULL; }
568
virtual Throw* as_Throw() { return NULL; }
569
virtual Base* as_Base() { return NULL; }
570
virtual RoundFP* as_RoundFP() { return NULL; }
571
virtual ExceptionObject* as_ExceptionObject() { return NULL; }
572
virtual UnsafeOp* as_UnsafeOp() { return NULL; }
573
virtual ProfileInvoke* as_ProfileInvoke() { return NULL; }
574
virtual RangeCheckPredicate* as_RangeCheckPredicate() { return NULL; }
575
576
#ifdef ASSERT
577
virtual Assert* as_Assert() { return NULL; }
578
#endif
579
580
virtual void visit(InstructionVisitor* v) = 0;
581
582
virtual bool can_trap() const { return false; }
583
584
virtual void input_values_do(ValueVisitor* f) = 0;
585
virtual void state_values_do(ValueVisitor* f);
586
virtual void other_values_do(ValueVisitor* f) { /* usually no other - override on demand */ }
587
void values_do(ValueVisitor* f) { input_values_do(f); state_values_do(f); other_values_do(f); }
588
589
virtual ciType* exact_type() const;
590
virtual ciType* declared_type() const { return NULL; }
591
592
// hashing
593
virtual const char* name() const = 0;
594
HASHING1(Instruction, false, id()) // hashing disabled by default
595
596
// debugging
597
static void check_state(ValueStack* state) PRODUCT_RETURN;
598
void print() PRODUCT_RETURN;
599
void print_line() PRODUCT_RETURN;
600
void print(InstructionPrinter& ip) PRODUCT_RETURN;
601
};
602
603
604
// The following macros are used to define base (i.e., non-leaf)
605
// and leaf instruction classes. They define class-name related
606
// generic functionality in one place.
607
608
#define BASE(class_name, super_class_name) \
609
class class_name: public super_class_name { \
610
public: \
611
virtual class_name* as_##class_name() { return this; } \
612
613
614
#define LEAF(class_name, super_class_name) \
615
BASE(class_name, super_class_name) \
616
public: \
617
virtual const char* name() const { return #class_name; } \
618
virtual void visit(InstructionVisitor* v) { v->do_##class_name(this); } \
619
620
621
// Debugging support
622
623
624
#ifdef ASSERT
625
class AssertValues: public ValueVisitor {
626
void visit(Value* x) { assert((*x) != NULL, "value must exist"); }
627
};
628
#define ASSERT_VALUES { AssertValues assert_value; values_do(&assert_value); }
629
#else
630
#define ASSERT_VALUES
631
#endif // ASSERT
632
633
634
// A Phi is a phi function in the sense of SSA form. It stands for
635
// the value of a local variable at the beginning of a join block.
636
// A Phi consists of n operands, one for every incoming branch.
637
638
LEAF(Phi, Instruction)
639
private:
640
int _pf_flags; // the flags of the phi function
641
int _index; // to value on operand stack (index < 0) or to local
642
public:
643
// creation
644
Phi(ValueType* type, BlockBegin* b, int index)
645
: Instruction(type->base())
646
, _pf_flags(0)
647
, _index(index)
648
{
649
_block = b;
650
NOT_PRODUCT(set_printable_bci(Value(b)->printable_bci()));
651
if (type->is_illegal()) {
652
make_illegal();
653
}
654
}
655
656
// flags
657
enum Flag {
658
no_flag = 0,
659
visited = 1 << 0,
660
cannot_simplify = 1 << 1
661
};
662
663
// accessors
664
bool is_local() const { return _index >= 0; }
665
bool is_on_stack() const { return !is_local(); }
666
int local_index() const { assert(is_local(), ""); return _index; }
667
int stack_index() const { assert(is_on_stack(), ""); return -(_index+1); }
668
669
Value operand_at(int i) const;
670
int operand_count() const;
671
672
void set(Flag f) { _pf_flags |= f; }
673
void clear(Flag f) { _pf_flags &= ~f; }
674
bool is_set(Flag f) const { return (_pf_flags & f) != 0; }
675
676
// Invalidates phis corresponding to merges of locals of two different types
677
// (these should never be referenced, otherwise the bytecodes are illegal)
678
void make_illegal() {
679
set(cannot_simplify);
680
set_type(illegalType);
681
}
682
683
bool is_illegal() const {
684
return type()->is_illegal();
685
}
686
687
// generic
688
virtual void input_values_do(ValueVisitor* f) {
689
}
690
};
691
692
693
// A local is a placeholder for an incoming argument to a function call.
694
LEAF(Local, Instruction)
695
private:
696
int _java_index; // the local index within the method to which the local belongs
697
bool _is_receiver; // if local variable holds the receiver: "this" for non-static methods
698
ciType* _declared_type;
699
public:
700
// creation
701
Local(ciType* declared, ValueType* type, int index, bool receiver)
702
: Instruction(type)
703
, _java_index(index)
704
, _is_receiver(receiver)
705
, _declared_type(declared)
706
{
707
NOT_PRODUCT(set_printable_bci(-1));
708
}
709
710
// accessors
711
int java_index() const { return _java_index; }
712
bool is_receiver() const { return _is_receiver; }
713
714
virtual ciType* declared_type() const { return _declared_type; }
715
716
// generic
717
virtual void input_values_do(ValueVisitor* f) { /* no values */ }
718
};
719
720
721
LEAF(Constant, Instruction)
722
public:
723
// creation
724
Constant(ValueType* type):
725
Instruction(type, NULL, /*type_is_constant*/ true)
726
{
727
assert(type->is_constant(), "must be a constant");
728
}
729
730
Constant(ValueType* type, ValueStack* state_before):
731
Instruction(type, state_before, /*type_is_constant*/ true)
732
{
733
assert(state_before != NULL, "only used for constants which need patching");
734
assert(type->is_constant(), "must be a constant");
735
// since it's patching it needs to be pinned
736
pin();
737
}
738
739
// generic
740
virtual bool can_trap() const { return state_before() != NULL; }
741
virtual void input_values_do(ValueVisitor* f) { /* no values */ }
742
743
virtual intx hash() const;
744
virtual bool is_equal(Value v) const;
745
746
virtual ciType* exact_type() const;
747
748
enum CompareResult { not_comparable = -1, cond_false, cond_true };
749
750
virtual CompareResult compare(Instruction::Condition condition, Value right) const;
751
BlockBegin* compare(Instruction::Condition cond, Value right,
752
BlockBegin* true_sux, BlockBegin* false_sux) const {
753
switch (compare(cond, right)) {
754
case not_comparable:
755
return NULL;
756
case cond_false:
757
return false_sux;
758
case cond_true:
759
return true_sux;
760
default:
761
ShouldNotReachHere();
762
return NULL;
763
}
764
}
765
};
766
767
768
BASE(AccessField, Instruction)
769
private:
770
Value _obj;
771
int _offset;
772
ciField* _field;
773
NullCheck* _explicit_null_check; // For explicit null check elimination
774
775
public:
776
// creation
777
AccessField(Value obj, int offset, ciField* field, bool is_static,
778
ValueStack* state_before, bool needs_patching)
779
: Instruction(as_ValueType(field->type()->basic_type()), state_before)
780
, _obj(obj)
781
, _offset(offset)
782
, _field(field)
783
, _explicit_null_check(NULL)
784
{
785
set_needs_null_check(!is_static);
786
set_flag(IsStaticFlag, is_static);
787
set_flag(NeedsPatchingFlag, needs_patching);
788
ASSERT_VALUES
789
// pin of all instructions with memory access
790
pin();
791
}
792
793
// accessors
794
Value obj() const { return _obj; }
795
int offset() const { return _offset; }
796
ciField* field() const { return _field; }
797
BasicType field_type() const { return _field->type()->basic_type(); }
798
bool is_static() const { return check_flag(IsStaticFlag); }
799
NullCheck* explicit_null_check() const { return _explicit_null_check; }
800
bool needs_patching() const { return check_flag(NeedsPatchingFlag); }
801
802
// Unresolved getstatic and putstatic can cause initialization.
803
// Technically it occurs at the Constant that materializes the base
804
// of the static fields but it's simpler to model it here.
805
bool is_init_point() const { return is_static() && (needs_patching() || !_field->holder()->is_initialized()); }
806
807
// manipulation
808
809
// Under certain circumstances, if a previous NullCheck instruction
810
// proved the target object non-null, we can eliminate the explicit
811
// null check and do an implicit one, simply specifying the debug
812
// information from the NullCheck. This field should only be consulted
813
// if needs_null_check() is true.
814
void set_explicit_null_check(NullCheck* check) { _explicit_null_check = check; }
815
816
// generic
817
virtual bool can_trap() const { return needs_null_check() || needs_patching(); }
818
virtual void input_values_do(ValueVisitor* f) { f->visit(&_obj); }
819
};
820
821
822
LEAF(LoadField, AccessField)
823
public:
824
// creation
825
LoadField(Value obj, int offset, ciField* field, bool is_static,
826
ValueStack* state_before, bool needs_patching)
827
: AccessField(obj, offset, field, is_static, state_before, needs_patching)
828
{}
829
830
ciType* declared_type() const;
831
832
// generic; cannot be eliminated if needs patching or if volatile.
833
HASHING3(LoadField, !needs_patching() && !field()->is_volatile(), obj()->subst(), offset(), declared_type())
834
};
835
836
837
LEAF(StoreField, AccessField)
838
private:
839
Value _value;
840
841
public:
842
// creation
843
StoreField(Value obj, int offset, ciField* field, Value value, bool is_static,
844
ValueStack* state_before, bool needs_patching)
845
: AccessField(obj, offset, field, is_static, state_before, needs_patching)
846
, _value(value)
847
{
848
set_flag(NeedsWriteBarrierFlag, as_ValueType(field_type())->is_object());
849
ASSERT_VALUES
850
pin();
851
}
852
853
// accessors
854
Value value() const { return _value; }
855
bool needs_write_barrier() const { return check_flag(NeedsWriteBarrierFlag); }
856
857
// generic
858
virtual void input_values_do(ValueVisitor* f) { AccessField::input_values_do(f); f->visit(&_value); }
859
};
860
861
862
BASE(AccessArray, Instruction)
863
private:
864
Value _array;
865
866
public:
867
// creation
868
AccessArray(ValueType* type, Value array, ValueStack* state_before)
869
: Instruction(type, state_before)
870
, _array(array)
871
{
872
set_needs_null_check(true);
873
ASSERT_VALUES
874
pin(); // instruction with side effect (null exception or range check throwing)
875
}
876
877
Value array() const { return _array; }
878
879
// generic
880
virtual bool can_trap() const { return needs_null_check(); }
881
virtual void input_values_do(ValueVisitor* f) { f->visit(&_array); }
882
};
883
884
885
LEAF(ArrayLength, AccessArray)
886
private:
887
NullCheck* _explicit_null_check; // For explicit null check elimination
888
889
public:
890
// creation
891
ArrayLength(Value array, ValueStack* state_before)
892
: AccessArray(intType, array, state_before)
893
, _explicit_null_check(NULL) {}
894
895
// accessors
896
NullCheck* explicit_null_check() const { return _explicit_null_check; }
897
898
// setters
899
// See LoadField::set_explicit_null_check for documentation
900
void set_explicit_null_check(NullCheck* check) { _explicit_null_check = check; }
901
902
// generic
903
HASHING1(ArrayLength, true, array()->subst())
904
};
905
906
907
BASE(AccessIndexed, AccessArray)
908
private:
909
Value _index;
910
Value _length;
911
BasicType _elt_type;
912
bool _mismatched;
913
914
public:
915
// creation
916
AccessIndexed(Value array, Value index, Value length, BasicType elt_type, ValueStack* state_before, bool mismatched)
917
: AccessArray(as_ValueType(elt_type), array, state_before)
918
, _index(index)
919
, _length(length)
920
, _elt_type(elt_type)
921
, _mismatched(mismatched)
922
{
923
set_flag(Instruction::NeedsRangeCheckFlag, true);
924
ASSERT_VALUES
925
}
926
927
// accessors
928
Value index() const { return _index; }
929
Value length() const { return _length; }
930
BasicType elt_type() const { return _elt_type; }
931
bool mismatched() const { return _mismatched; }
932
933
void clear_length() { _length = NULL; }
934
// perform elimination of range checks involving constants
935
bool compute_needs_range_check();
936
937
// generic
938
virtual void input_values_do(ValueVisitor* f) { AccessArray::input_values_do(f); f->visit(&_index); if (_length != NULL) f->visit(&_length); }
939
};
940
941
942
LEAF(LoadIndexed, AccessIndexed)
943
private:
944
NullCheck* _explicit_null_check; // For explicit null check elimination
945
946
public:
947
// creation
948
LoadIndexed(Value array, Value index, Value length, BasicType elt_type, ValueStack* state_before, bool mismatched = false)
949
: AccessIndexed(array, index, length, elt_type, state_before, mismatched)
950
, _explicit_null_check(NULL) {}
951
952
// accessors
953
NullCheck* explicit_null_check() const { return _explicit_null_check; }
954
955
// setters
956
// See LoadField::set_explicit_null_check for documentation
957
void set_explicit_null_check(NullCheck* check) { _explicit_null_check = check; }
958
959
ciType* exact_type() const;
960
ciType* declared_type() const;
961
962
// generic;
963
HASHING3(LoadIndexed, true, type()->tag(), array()->subst(), index()->subst())
964
};
965
966
967
LEAF(StoreIndexed, AccessIndexed)
968
private:
969
Value _value;
970
971
ciMethod* _profiled_method;
972
int _profiled_bci;
973
bool _check_boolean;
974
975
public:
976
// creation
977
StoreIndexed(Value array, Value index, Value length, BasicType elt_type, Value value, ValueStack* state_before,
978
bool check_boolean, bool mismatched = false)
979
: AccessIndexed(array, index, length, elt_type, state_before, mismatched)
980
, _value(value), _profiled_method(NULL), _profiled_bci(0), _check_boolean(check_boolean)
981
{
982
set_flag(NeedsWriteBarrierFlag, (as_ValueType(elt_type)->is_object()));
983
set_flag(NeedsStoreCheckFlag, (as_ValueType(elt_type)->is_object()));
984
ASSERT_VALUES
985
pin();
986
}
987
988
// accessors
989
Value value() const { return _value; }
990
bool needs_write_barrier() const { return check_flag(NeedsWriteBarrierFlag); }
991
bool needs_store_check() const { return check_flag(NeedsStoreCheckFlag); }
992
bool check_boolean() const { return _check_boolean; }
993
// Helpers for MethodData* profiling
994
void set_should_profile(bool value) { set_flag(ProfileMDOFlag, value); }
995
void set_profiled_method(ciMethod* method) { _profiled_method = method; }
996
void set_profiled_bci(int bci) { _profiled_bci = bci; }
997
bool should_profile() const { return check_flag(ProfileMDOFlag); }
998
ciMethod* profiled_method() const { return _profiled_method; }
999
int profiled_bci() const { return _profiled_bci; }
1000
// generic
1001
virtual void input_values_do(ValueVisitor* f) { AccessIndexed::input_values_do(f); f->visit(&_value); }
1002
};
1003
1004
1005
LEAF(NegateOp, Instruction)
1006
private:
1007
Value _x;
1008
1009
public:
1010
// creation
1011
NegateOp(Value x) : Instruction(x->type()->base()), _x(x) {
1012
ASSERT_VALUES
1013
}
1014
1015
// accessors
1016
Value x() const { return _x; }
1017
1018
// generic
1019
virtual void input_values_do(ValueVisitor* f) { f->visit(&_x); }
1020
};
1021
1022
1023
BASE(Op2, Instruction)
1024
private:
1025
Bytecodes::Code _op;
1026
Value _x;
1027
Value _y;
1028
1029
public:
1030
// creation
1031
Op2(ValueType* type, Bytecodes::Code op, Value x, Value y, ValueStack* state_before = NULL)
1032
: Instruction(type, state_before)
1033
, _op(op)
1034
, _x(x)
1035
, _y(y)
1036
{
1037
ASSERT_VALUES
1038
}
1039
1040
// accessors
1041
Bytecodes::Code op() const { return _op; }
1042
Value x() const { return _x; }
1043
Value y() const { return _y; }
1044
1045
// manipulators
1046
void swap_operands() {
1047
assert(is_commutative(), "operation must be commutative");
1048
Value t = _x; _x = _y; _y = t;
1049
}
1050
1051
// generic
1052
virtual bool is_commutative() const { return false; }
1053
virtual void input_values_do(ValueVisitor* f) { f->visit(&_x); f->visit(&_y); }
1054
};
1055
1056
1057
LEAF(ArithmeticOp, Op2)
1058
public:
1059
// creation
1060
ArithmeticOp(Bytecodes::Code op, Value x, Value y, ValueStack* state_before)
1061
: Op2(x->type()->meet(y->type()), op, x, y, state_before)
1062
{
1063
if (can_trap()) pin();
1064
}
1065
1066
// generic
1067
virtual bool is_commutative() const;
1068
virtual bool can_trap() const;
1069
HASHING3(Op2, true, op(), x()->subst(), y()->subst())
1070
};
1071
1072
1073
LEAF(ShiftOp, Op2)
1074
public:
1075
// creation
1076
ShiftOp(Bytecodes::Code op, Value x, Value s) : Op2(x->type()->base(), op, x, s) {}
1077
1078
// generic
1079
HASHING3(Op2, true, op(), x()->subst(), y()->subst())
1080
};
1081
1082
1083
LEAF(LogicOp, Op2)
1084
public:
1085
// creation
1086
LogicOp(Bytecodes::Code op, Value x, Value y) : Op2(x->type()->meet(y->type()), op, x, y) {}
1087
1088
// generic
1089
virtual bool is_commutative() const;
1090
HASHING3(Op2, true, op(), x()->subst(), y()->subst())
1091
};
1092
1093
1094
LEAF(CompareOp, Op2)
1095
public:
1096
// creation
1097
CompareOp(Bytecodes::Code op, Value x, Value y, ValueStack* state_before)
1098
: Op2(intType, op, x, y, state_before)
1099
{}
1100
1101
// generic
1102
HASHING3(Op2, true, op(), x()->subst(), y()->subst())
1103
};
1104
1105
1106
LEAF(IfOp, Op2)
1107
private:
1108
Value _tval;
1109
Value _fval;
1110
1111
public:
1112
// creation
1113
IfOp(Value x, Condition cond, Value y, Value tval, Value fval)
1114
: Op2(tval->type()->meet(fval->type()), (Bytecodes::Code)cond, x, y)
1115
, _tval(tval)
1116
, _fval(fval)
1117
{
1118
ASSERT_VALUES
1119
assert(tval->type()->tag() == fval->type()->tag(), "types must match");
1120
}
1121
1122
// accessors
1123
virtual bool is_commutative() const;
1124
Bytecodes::Code op() const { ShouldNotCallThis(); return Bytecodes::_illegal; }
1125
Condition cond() const { return (Condition)Op2::op(); }
1126
Value tval() const { return _tval; }
1127
Value fval() const { return _fval; }
1128
1129
// generic
1130
virtual void input_values_do(ValueVisitor* f) { Op2::input_values_do(f); f->visit(&_tval); f->visit(&_fval); }
1131
};
1132
1133
1134
LEAF(Convert, Instruction)
1135
private:
1136
Bytecodes::Code _op;
1137
Value _value;
1138
1139
public:
1140
// creation
1141
Convert(Bytecodes::Code op, Value value, ValueType* to_type) : Instruction(to_type), _op(op), _value(value) {
1142
ASSERT_VALUES
1143
}
1144
1145
// accessors
1146
Bytecodes::Code op() const { return _op; }
1147
Value value() const { return _value; }
1148
1149
// generic
1150
virtual void input_values_do(ValueVisitor* f) { f->visit(&_value); }
1151
HASHING2(Convert, true, op(), value()->subst())
1152
};
1153
1154
1155
LEAF(NullCheck, Instruction)
1156
private:
1157
Value _obj;
1158
1159
public:
1160
// creation
1161
NullCheck(Value obj, ValueStack* state_before)
1162
: Instruction(obj->type()->base(), state_before)
1163
, _obj(obj)
1164
{
1165
ASSERT_VALUES
1166
set_can_trap(true);
1167
assert(_obj->type()->is_object(), "null check must be applied to objects only");
1168
pin(Instruction::PinExplicitNullCheck);
1169
}
1170
1171
// accessors
1172
Value obj() const { return _obj; }
1173
1174
// setters
1175
void set_can_trap(bool can_trap) { set_flag(CanTrapFlag, can_trap); }
1176
1177
// generic
1178
virtual bool can_trap() const { return check_flag(CanTrapFlag); /* null-check elimination sets to false */ }
1179
virtual void input_values_do(ValueVisitor* f) { f->visit(&_obj); }
1180
HASHING1(NullCheck, true, obj()->subst())
1181
};
1182
1183
1184
// This node is supposed to cast the type of another node to a more precise
1185
// declared type.
1186
LEAF(TypeCast, Instruction)
1187
private:
1188
ciType* _declared_type;
1189
Value _obj;
1190
1191
public:
1192
// The type of this node is the same type as the object type (and it might be constant).
1193
TypeCast(ciType* type, Value obj, ValueStack* state_before)
1194
: Instruction(obj->type(), state_before, obj->type()->is_constant()),
1195
_declared_type(type),
1196
_obj(obj) {}
1197
1198
// accessors
1199
ciType* declared_type() const { return _declared_type; }
1200
Value obj() const { return _obj; }
1201
1202
// generic
1203
virtual void input_values_do(ValueVisitor* f) { f->visit(&_obj); }
1204
};
1205
1206
1207
BASE(StateSplit, Instruction)
1208
private:
1209
ValueStack* _state;
1210
1211
protected:
1212
static void substitute(BlockList& list, BlockBegin* old_block, BlockBegin* new_block);
1213
1214
public:
1215
// creation
1216
StateSplit(ValueType* type, ValueStack* state_before = NULL)
1217
: Instruction(type, state_before)
1218
, _state(NULL)
1219
{
1220
pin(PinStateSplitConstructor);
1221
}
1222
1223
// accessors
1224
ValueStack* state() const { return _state; }
1225
IRScope* scope() const; // the state's scope
1226
1227
// manipulation
1228
void set_state(ValueStack* state) { assert(_state == NULL, "overwriting existing state"); check_state(state); _state = state; }
1229
1230
// generic
1231
virtual void input_values_do(ValueVisitor* f) { /* no values */ }
1232
virtual void state_values_do(ValueVisitor* f);
1233
};
1234
1235
1236
LEAF(Invoke, StateSplit)
1237
private:
1238
Bytecodes::Code _code;
1239
Value _recv;
1240
Values* _args;
1241
BasicTypeList* _signature;
1242
ciMethod* _target;
1243
1244
public:
1245
// creation
1246
Invoke(Bytecodes::Code code, ValueType* result_type, Value recv, Values* args,
1247
ciMethod* target, ValueStack* state_before);
1248
1249
// accessors
1250
Bytecodes::Code code() const { return _code; }
1251
Value receiver() const { return _recv; }
1252
bool has_receiver() const { return receiver() != NULL; }
1253
int number_of_arguments() const { return _args->length(); }
1254
Value argument_at(int i) const { return _args->at(i); }
1255
BasicTypeList* signature() const { return _signature; }
1256
ciMethod* target() const { return _target; }
1257
1258
ciType* declared_type() const;
1259
1260
// Returns false if target is not loaded
1261
bool target_is_final() const { return check_flag(TargetIsFinalFlag); }
1262
bool target_is_loaded() const { return check_flag(TargetIsLoadedFlag); }
1263
1264
// JSR 292 support
1265
bool is_invokedynamic() const { return code() == Bytecodes::_invokedynamic; }
1266
bool is_method_handle_intrinsic() const { return target()->is_method_handle_intrinsic(); }
1267
1268
virtual bool needs_exception_state() const { return false; }
1269
1270
// generic
1271
virtual bool can_trap() const { return true; }
1272
virtual void input_values_do(ValueVisitor* f) {
1273
StateSplit::input_values_do(f);
1274
if (has_receiver()) f->visit(&_recv);
1275
for (int i = 0; i < _args->length(); i++) f->visit(_args->adr_at(i));
1276
}
1277
virtual void state_values_do(ValueVisitor *f);
1278
};
1279
1280
1281
LEAF(NewInstance, StateSplit)
1282
private:
1283
ciInstanceKlass* _klass;
1284
bool _is_unresolved;
1285
1286
public:
1287
// creation
1288
NewInstance(ciInstanceKlass* klass, ValueStack* state_before, bool is_unresolved)
1289
: StateSplit(instanceType, state_before)
1290
, _klass(klass), _is_unresolved(is_unresolved)
1291
{}
1292
1293
// accessors
1294
ciInstanceKlass* klass() const { return _klass; }
1295
bool is_unresolved() const { return _is_unresolved; }
1296
1297
virtual bool needs_exception_state() const { return false; }
1298
1299
// generic
1300
virtual bool can_trap() const { return true; }
1301
ciType* exact_type() const;
1302
ciType* declared_type() const;
1303
};
1304
1305
1306
BASE(NewArray, StateSplit)
1307
private:
1308
Value _length;
1309
1310
public:
1311
// creation
1312
NewArray(Value length, ValueStack* state_before)
1313
: StateSplit(objectType, state_before)
1314
, _length(length)
1315
{
1316
// Do not ASSERT_VALUES since length is NULL for NewMultiArray
1317
}
1318
1319
// accessors
1320
Value length() const { return _length; }
1321
1322
virtual bool needs_exception_state() const { return false; }
1323
1324
ciType* exact_type() const { return NULL; }
1325
ciType* declared_type() const;
1326
1327
// generic
1328
virtual bool can_trap() const { return true; }
1329
virtual void input_values_do(ValueVisitor* f) { StateSplit::input_values_do(f); f->visit(&_length); }
1330
};
1331
1332
1333
LEAF(NewTypeArray, NewArray)
1334
private:
1335
BasicType _elt_type;
1336
1337
public:
1338
// creation
1339
NewTypeArray(Value length, BasicType elt_type, ValueStack* state_before)
1340
: NewArray(length, state_before)
1341
, _elt_type(elt_type)
1342
{}
1343
1344
// accessors
1345
BasicType elt_type() const { return _elt_type; }
1346
ciType* exact_type() const;
1347
};
1348
1349
1350
LEAF(NewObjectArray, NewArray)
1351
private:
1352
ciKlass* _klass;
1353
1354
public:
1355
// creation
1356
NewObjectArray(ciKlass* klass, Value length, ValueStack* state_before) : NewArray(length, state_before), _klass(klass) {}
1357
1358
// accessors
1359
ciKlass* klass() const { return _klass; }
1360
ciType* exact_type() const;
1361
};
1362
1363
1364
LEAF(NewMultiArray, NewArray)
1365
private:
1366
ciKlass* _klass;
1367
Values* _dims;
1368
1369
public:
1370
// creation
1371
NewMultiArray(ciKlass* klass, Values* dims, ValueStack* state_before) : NewArray(NULL, state_before), _klass(klass), _dims(dims) {
1372
ASSERT_VALUES
1373
}
1374
1375
// accessors
1376
ciKlass* klass() const { return _klass; }
1377
Values* dims() const { return _dims; }
1378
int rank() const { return dims()->length(); }
1379
1380
// generic
1381
virtual void input_values_do(ValueVisitor* f) {
1382
// NOTE: we do not call NewArray::input_values_do since "length"
1383
// is meaningless for a multi-dimensional array; passing the
1384
// zeroth element down to NewArray as its length is a bad idea
1385
// since there will be a copy in the "dims" array which doesn't
1386
// get updated, and the value must not be traversed twice. Was bug
1387
// - kbr 4/10/2001
1388
StateSplit::input_values_do(f);
1389
for (int i = 0; i < _dims->length(); i++) f->visit(_dims->adr_at(i));
1390
}
1391
};
1392
1393
1394
BASE(TypeCheck, StateSplit)
1395
private:
1396
ciKlass* _klass;
1397
Value _obj;
1398
1399
ciMethod* _profiled_method;
1400
int _profiled_bci;
1401
1402
public:
1403
// creation
1404
TypeCheck(ciKlass* klass, Value obj, ValueType* type, ValueStack* state_before)
1405
: StateSplit(type, state_before), _klass(klass), _obj(obj),
1406
_profiled_method(NULL), _profiled_bci(0) {
1407
ASSERT_VALUES
1408
set_direct_compare(false);
1409
}
1410
1411
// accessors
1412
ciKlass* klass() const { return _klass; }
1413
Value obj() const { return _obj; }
1414
bool is_loaded() const { return klass() != NULL; }
1415
bool direct_compare() const { return check_flag(DirectCompareFlag); }
1416
1417
// manipulation
1418
void set_direct_compare(bool flag) { set_flag(DirectCompareFlag, flag); }
1419
1420
// generic
1421
virtual bool can_trap() const { return true; }
1422
virtual void input_values_do(ValueVisitor* f) { StateSplit::input_values_do(f); f->visit(&_obj); }
1423
1424
// Helpers for MethodData* profiling
1425
void set_should_profile(bool value) { set_flag(ProfileMDOFlag, value); }
1426
void set_profiled_method(ciMethod* method) { _profiled_method = method; }
1427
void set_profiled_bci(int bci) { _profiled_bci = bci; }
1428
bool should_profile() const { return check_flag(ProfileMDOFlag); }
1429
ciMethod* profiled_method() const { return _profiled_method; }
1430
int profiled_bci() const { return _profiled_bci; }
1431
};
1432
1433
1434
LEAF(CheckCast, TypeCheck)
1435
public:
1436
// creation
1437
CheckCast(ciKlass* klass, Value obj, ValueStack* state_before)
1438
: TypeCheck(klass, obj, objectType, state_before) {}
1439
1440
void set_incompatible_class_change_check() {
1441
set_flag(ThrowIncompatibleClassChangeErrorFlag, true);
1442
}
1443
bool is_incompatible_class_change_check() const {
1444
return check_flag(ThrowIncompatibleClassChangeErrorFlag);
1445
}
1446
void set_invokespecial_receiver_check() {
1447
set_flag(InvokeSpecialReceiverCheckFlag, true);
1448
}
1449
bool is_invokespecial_receiver_check() const {
1450
return check_flag(InvokeSpecialReceiverCheckFlag);
1451
}
1452
1453
virtual bool needs_exception_state() const {
1454
return !is_invokespecial_receiver_check();
1455
}
1456
1457
ciType* declared_type() const;
1458
};
1459
1460
1461
LEAF(InstanceOf, TypeCheck)
1462
public:
1463
// creation
1464
InstanceOf(ciKlass* klass, Value obj, ValueStack* state_before) : TypeCheck(klass, obj, intType, state_before) {}
1465
1466
virtual bool needs_exception_state() const { return false; }
1467
};
1468
1469
1470
BASE(AccessMonitor, StateSplit)
1471
private:
1472
Value _obj;
1473
int _monitor_no;
1474
1475
public:
1476
// creation
1477
AccessMonitor(Value obj, int monitor_no, ValueStack* state_before = NULL)
1478
: StateSplit(illegalType, state_before)
1479
, _obj(obj)
1480
, _monitor_no(monitor_no)
1481
{
1482
set_needs_null_check(true);
1483
ASSERT_VALUES
1484
}
1485
1486
// accessors
1487
Value obj() const { return _obj; }
1488
int monitor_no() const { return _monitor_no; }
1489
1490
// generic
1491
virtual void input_values_do(ValueVisitor* f) { StateSplit::input_values_do(f); f->visit(&_obj); }
1492
};
1493
1494
1495
LEAF(MonitorEnter, AccessMonitor)
1496
public:
1497
// creation
1498
MonitorEnter(Value obj, int monitor_no, ValueStack* state_before)
1499
: AccessMonitor(obj, monitor_no, state_before)
1500
{
1501
ASSERT_VALUES
1502
}
1503
1504
// generic
1505
virtual bool can_trap() const { return true; }
1506
};
1507
1508
1509
LEAF(MonitorExit, AccessMonitor)
1510
public:
1511
// creation
1512
MonitorExit(Value obj, int monitor_no)
1513
: AccessMonitor(obj, monitor_no, NULL)
1514
{
1515
ASSERT_VALUES
1516
}
1517
};
1518
1519
1520
LEAF(Intrinsic, StateSplit)
1521
private:
1522
vmIntrinsics::ID _id;
1523
Values* _args;
1524
Value _recv;
1525
ArgsNonNullState _nonnull_state;
1526
1527
public:
1528
// preserves_state can be set to true for Intrinsics
1529
// which are guaranteed to preserve register state across any slow
1530
// cases; setting it to true does not mean that the Intrinsic can
1531
// not trap, only that if we continue execution in the same basic
1532
// block after the Intrinsic, all of the registers are intact. This
1533
// allows load elimination and common expression elimination to be
1534
// performed across the Intrinsic. The default value is false.
1535
Intrinsic(ValueType* type,
1536
vmIntrinsics::ID id,
1537
Values* args,
1538
bool has_receiver,
1539
ValueStack* state_before,
1540
bool preserves_state,
1541
bool cantrap = true)
1542
: StateSplit(type, state_before)
1543
, _id(id)
1544
, _args(args)
1545
, _recv(NULL)
1546
{
1547
assert(args != NULL, "args must exist");
1548
ASSERT_VALUES
1549
set_flag(PreservesStateFlag, preserves_state);
1550
set_flag(CanTrapFlag, cantrap);
1551
if (has_receiver) {
1552
_recv = argument_at(0);
1553
}
1554
set_needs_null_check(has_receiver);
1555
1556
// some intrinsics can't trap, so don't force them to be pinned
1557
if (!can_trap() && !vmIntrinsics::should_be_pinned(_id)) {
1558
unpin(PinStateSplitConstructor);
1559
}
1560
}
1561
1562
// accessors
1563
vmIntrinsics::ID id() const { return _id; }
1564
int number_of_arguments() const { return _args->length(); }
1565
Value argument_at(int i) const { return _args->at(i); }
1566
1567
bool has_receiver() const { return (_recv != NULL); }
1568
Value receiver() const { assert(has_receiver(), "must have receiver"); return _recv; }
1569
bool preserves_state() const { return check_flag(PreservesStateFlag); }
1570
1571
bool arg_needs_null_check(int i) const {
1572
return _nonnull_state.arg_needs_null_check(i);
1573
}
1574
1575
void set_arg_needs_null_check(int i, bool check) {
1576
_nonnull_state.set_arg_needs_null_check(i, check);
1577
}
1578
1579
// generic
1580
virtual bool can_trap() const { return check_flag(CanTrapFlag); }
1581
virtual void input_values_do(ValueVisitor* f) {
1582
StateSplit::input_values_do(f);
1583
for (int i = 0; i < _args->length(); i++) f->visit(_args->adr_at(i));
1584
}
1585
};
1586
1587
1588
class LIR_List;
1589
1590
LEAF(BlockBegin, StateSplit)
1591
private:
1592
int _block_id; // the unique block id
1593
int _bci; // start-bci of block
1594
int _depth_first_number; // number of this block in a depth-first ordering
1595
int _linear_scan_number; // number of this block in linear-scan ordering
1596
int _dominator_depth;
1597
int _loop_depth; // the loop nesting level of this block
1598
int _loop_index; // number of the innermost loop of this block
1599
int _flags; // the flags associated with this block
1600
1601
// fields used by BlockListBuilder
1602
int _total_preds; // number of predecessors found by BlockListBuilder
1603
ResourceBitMap _stores_to_locals; // bit is set when a local variable is stored in the block
1604
1605
// SSA specific fields: (factor out later)
1606
BlockList _successors; // the successors of this block
1607
BlockList _predecessors; // the predecessors of this block
1608
BlockList _dominates; // list of blocks that are dominated by this block
1609
BlockBegin* _dominator; // the dominator of this block
1610
// SSA specific ends
1611
BlockEnd* _end; // the last instruction of this block
1612
BlockList _exception_handlers; // the exception handlers potentially invoked by this block
1613
ValueStackStack* _exception_states; // only for xhandler entries: states of all instructions that have an edge to this xhandler
1614
int _exception_handler_pco; // if this block is the start of an exception handler,
1615
// this records the PC offset in the assembly code of the
1616
// first instruction in this block
1617
Label _label; // the label associated with this block
1618
LIR_List* _lir; // the low level intermediate representation for this block
1619
1620
ResourceBitMap _live_in; // set of live LIR_Opr registers at entry to this block
1621
ResourceBitMap _live_out; // set of live LIR_Opr registers at exit from this block
1622
ResourceBitMap _live_gen; // set of registers used before any redefinition in this block
1623
ResourceBitMap _live_kill; // set of registers defined in this block
1624
1625
ResourceBitMap _fpu_register_usage;
1626
intArray* _fpu_stack_state; // For x86 FPU code generation with UseLinearScan
1627
int _first_lir_instruction_id; // ID of first LIR instruction in this block
1628
int _last_lir_instruction_id; // ID of last LIR instruction in this block
1629
1630
void iterate_preorder (boolArray& mark, BlockClosure* closure);
1631
void iterate_postorder(boolArray& mark, BlockClosure* closure);
1632
1633
friend class SuxAndWeightAdjuster;
1634
1635
public:
1636
void* operator new(size_t size) throw() {
1637
Compilation* c = Compilation::current();
1638
void* res = c->arena()->Amalloc(size);
1639
return res;
1640
}
1641
1642
// initialization/counting
1643
static int number_of_blocks() {
1644
return Compilation::current()->number_of_blocks();
1645
}
1646
1647
// creation
1648
BlockBegin(int bci)
1649
: StateSplit(illegalType)
1650
, _block_id(Compilation::current()->get_next_block_id())
1651
, _bci(bci)
1652
, _depth_first_number(-1)
1653
, _linear_scan_number(-1)
1654
, _dominator_depth(-1)
1655
, _loop_depth(0)
1656
, _loop_index(-1)
1657
, _flags(0)
1658
, _total_preds(0)
1659
, _stores_to_locals()
1660
, _successors(2)
1661
, _predecessors(2)
1662
, _dominates(2)
1663
, _dominator(NULL)
1664
, _end(NULL)
1665
, _exception_handlers(1)
1666
, _exception_states(NULL)
1667
, _exception_handler_pco(-1)
1668
, _lir(NULL)
1669
, _live_in()
1670
, _live_out()
1671
, _live_gen()
1672
, _live_kill()
1673
, _fpu_register_usage()
1674
, _fpu_stack_state(NULL)
1675
, _first_lir_instruction_id(-1)
1676
, _last_lir_instruction_id(-1)
1677
{
1678
_block = this;
1679
#ifndef PRODUCT
1680
set_printable_bci(bci);
1681
#endif
1682
}
1683
1684
// accessors
1685
int block_id() const { return _block_id; }
1686
int bci() const { return _bci; }
1687
BlockList* successors() { return &_successors; }
1688
BlockList* dominates() { return &_dominates; }
1689
BlockBegin* dominator() const { return _dominator; }
1690
int loop_depth() const { return _loop_depth; }
1691
int dominator_depth() const { return _dominator_depth; }
1692
int depth_first_number() const { return _depth_first_number; }
1693
int linear_scan_number() const { return _linear_scan_number; }
1694
BlockEnd* end() const { return _end; }
1695
Label* label() { return &_label; }
1696
LIR_List* lir() const { return _lir; }
1697
int exception_handler_pco() const { return _exception_handler_pco; }
1698
ResourceBitMap& live_in() { return _live_in; }
1699
ResourceBitMap& live_out() { return _live_out; }
1700
ResourceBitMap& live_gen() { return _live_gen; }
1701
ResourceBitMap& live_kill() { return _live_kill; }
1702
ResourceBitMap& fpu_register_usage() { return _fpu_register_usage; }
1703
intArray* fpu_stack_state() const { return _fpu_stack_state; }
1704
int first_lir_instruction_id() const { return _first_lir_instruction_id; }
1705
int last_lir_instruction_id() const { return _last_lir_instruction_id; }
1706
int total_preds() const { return _total_preds; }
1707
BitMap& stores_to_locals() { return _stores_to_locals; }
1708
1709
// manipulation
1710
void set_dominator(BlockBegin* dom) { _dominator = dom; }
1711
void set_loop_depth(int d) { _loop_depth = d; }
1712
void set_dominator_depth(int d) { _dominator_depth = d; }
1713
void set_depth_first_number(int dfn) { _depth_first_number = dfn; }
1714
void set_linear_scan_number(int lsn) { _linear_scan_number = lsn; }
1715
void set_end(BlockEnd* end);
1716
void clear_end();
1717
void disconnect_from_graph();
1718
static void disconnect_edge(BlockBegin* from, BlockBegin* to);
1719
BlockBegin* insert_block_between(BlockBegin* sux);
1720
void substitute_sux(BlockBegin* old_sux, BlockBegin* new_sux);
1721
void set_lir(LIR_List* lir) { _lir = lir; }
1722
void set_exception_handler_pco(int pco) { _exception_handler_pco = pco; }
1723
void set_live_in (const ResourceBitMap& map) { _live_in = map; }
1724
void set_live_out (const ResourceBitMap& map) { _live_out = map; }
1725
void set_live_gen (const ResourceBitMap& map) { _live_gen = map; }
1726
void set_live_kill(const ResourceBitMap& map) { _live_kill = map; }
1727
void set_fpu_register_usage(const ResourceBitMap& map) { _fpu_register_usage = map; }
1728
void set_fpu_stack_state(intArray* state) { _fpu_stack_state = state; }
1729
void set_first_lir_instruction_id(int id) { _first_lir_instruction_id = id; }
1730
void set_last_lir_instruction_id(int id) { _last_lir_instruction_id = id; }
1731
void increment_total_preds(int n = 1) { _total_preds += n; }
1732
void init_stores_to_locals(int locals_count) { _stores_to_locals.initialize(locals_count); }
1733
1734
// generic
1735
virtual void state_values_do(ValueVisitor* f);
1736
1737
// successors and predecessors
1738
int number_of_sux() const;
1739
BlockBegin* sux_at(int i) const;
1740
void add_successor(BlockBegin* sux);
1741
void remove_successor(BlockBegin* pred);
1742
bool is_successor(BlockBegin* sux) const { return _successors.contains(sux); }
1743
1744
void add_predecessor(BlockBegin* pred);
1745
void remove_predecessor(BlockBegin* pred);
1746
bool is_predecessor(BlockBegin* pred) const { return _predecessors.contains(pred); }
1747
int number_of_preds() const { return _predecessors.length(); }
1748
BlockBegin* pred_at(int i) const { return _predecessors.at(i); }
1749
1750
// exception handlers potentially invoked by this block
1751
void add_exception_handler(BlockBegin* b);
1752
bool is_exception_handler(BlockBegin* b) const { return _exception_handlers.contains(b); }
1753
int number_of_exception_handlers() const { return _exception_handlers.length(); }
1754
BlockBegin* exception_handler_at(int i) const { return _exception_handlers.at(i); }
1755
1756
// states of the instructions that have an edge to this exception handler
1757
int number_of_exception_states() { assert(is_set(exception_entry_flag), "only for xhandlers"); return _exception_states == NULL ? 0 : _exception_states->length(); }
1758
ValueStack* exception_state_at(int idx) const { assert(is_set(exception_entry_flag), "only for xhandlers"); return _exception_states->at(idx); }
1759
int add_exception_state(ValueStack* state);
1760
1761
// flags
1762
enum Flag {
1763
no_flag = 0,
1764
std_entry_flag = 1 << 0,
1765
osr_entry_flag = 1 << 1,
1766
exception_entry_flag = 1 << 2,
1767
subroutine_entry_flag = 1 << 3,
1768
backward_branch_target_flag = 1 << 4,
1769
is_on_work_list_flag = 1 << 5,
1770
was_visited_flag = 1 << 6,
1771
parser_loop_header_flag = 1 << 7, // set by parser to identify blocks where phi functions can not be created on demand
1772
critical_edge_split_flag = 1 << 8, // set for all blocks that are introduced when critical edges are split
1773
linear_scan_loop_header_flag = 1 << 9, // set during loop-detection for LinearScan
1774
linear_scan_loop_end_flag = 1 << 10, // set during loop-detection for LinearScan
1775
donot_eliminate_range_checks = 1 << 11 // Should be try to eliminate range checks in this block
1776
};
1777
1778
void set(Flag f) { _flags |= f; }
1779
void clear(Flag f) { _flags &= ~f; }
1780
bool is_set(Flag f) const { return (_flags & f) != 0; }
1781
bool is_entry_block() const {
1782
const int entry_mask = std_entry_flag | osr_entry_flag | exception_entry_flag;
1783
return (_flags & entry_mask) != 0;
1784
}
1785
1786
// iteration
1787
void iterate_preorder (BlockClosure* closure);
1788
void iterate_postorder (BlockClosure* closure);
1789
1790
void block_values_do(ValueVisitor* f);
1791
1792
// loops
1793
void set_loop_index(int ix) { _loop_index = ix; }
1794
int loop_index() const { return _loop_index; }
1795
1796
// merging
1797
bool try_merge(ValueStack* state); // try to merge states at block begin
1798
void merge(ValueStack* state) { bool b = try_merge(state); assert(b, "merge failed"); }
1799
1800
// debugging
1801
void print_block() PRODUCT_RETURN;
1802
void print_block(InstructionPrinter& ip, bool live_only = false) PRODUCT_RETURN;
1803
};
1804
1805
1806
BASE(BlockEnd, StateSplit)
1807
private:
1808
BlockList* _sux;
1809
1810
protected:
1811
BlockList* sux() const { return _sux; }
1812
1813
void set_sux(BlockList* sux) {
1814
#ifdef ASSERT
1815
assert(sux != NULL, "sux must exist");
1816
for (int i = sux->length() - 1; i >= 0; i--) assert(sux->at(i) != NULL, "sux must exist");
1817
#endif
1818
_sux = sux;
1819
}
1820
1821
public:
1822
// creation
1823
BlockEnd(ValueType* type, ValueStack* state_before, bool is_safepoint)
1824
: StateSplit(type, state_before)
1825
, _sux(NULL)
1826
{
1827
set_flag(IsSafepointFlag, is_safepoint);
1828
}
1829
1830
// accessors
1831
bool is_safepoint() const { return check_flag(IsSafepointFlag); }
1832
// For compatibility with old code, for new code use block()
1833
BlockBegin* begin() const { return _block; }
1834
1835
// manipulation
1836
void set_begin(BlockBegin* begin);
1837
1838
// successors
1839
int number_of_sux() const { return _sux != NULL ? _sux->length() : 0; }
1840
BlockBegin* sux_at(int i) const { return _sux->at(i); }
1841
BlockBegin* default_sux() const { return sux_at(number_of_sux() - 1); }
1842
BlockBegin** addr_sux_at(int i) const { return _sux->adr_at(i); }
1843
int sux_index(BlockBegin* sux) const { return _sux->find(sux); }
1844
void substitute_sux(BlockBegin* old_sux, BlockBegin* new_sux);
1845
};
1846
1847
1848
LEAF(Goto, BlockEnd)
1849
public:
1850
enum Direction {
1851
none, // Just a regular goto
1852
taken, not_taken // Goto produced from If
1853
};
1854
private:
1855
ciMethod* _profiled_method;
1856
int _profiled_bci;
1857
Direction _direction;
1858
public:
1859
// creation
1860
Goto(BlockBegin* sux, ValueStack* state_before, bool is_safepoint = false)
1861
: BlockEnd(illegalType, state_before, is_safepoint)
1862
, _profiled_method(NULL)
1863
, _profiled_bci(0)
1864
, _direction(none) {
1865
BlockList* s = new BlockList(1);
1866
s->append(sux);
1867
set_sux(s);
1868
}
1869
1870
Goto(BlockBegin* sux, bool is_safepoint) : BlockEnd(illegalType, NULL, is_safepoint)
1871
, _profiled_method(NULL)
1872
, _profiled_bci(0)
1873
, _direction(none) {
1874
BlockList* s = new BlockList(1);
1875
s->append(sux);
1876
set_sux(s);
1877
}
1878
1879
bool should_profile() const { return check_flag(ProfileMDOFlag); }
1880
ciMethod* profiled_method() const { return _profiled_method; } // set only for profiled branches
1881
int profiled_bci() const { return _profiled_bci; }
1882
Direction direction() const { return _direction; }
1883
1884
void set_should_profile(bool value) { set_flag(ProfileMDOFlag, value); }
1885
void set_profiled_method(ciMethod* method) { _profiled_method = method; }
1886
void set_profiled_bci(int bci) { _profiled_bci = bci; }
1887
void set_direction(Direction d) { _direction = d; }
1888
};
1889
1890
#ifdef ASSERT
1891
LEAF(Assert, Instruction)
1892
private:
1893
Value _x;
1894
Condition _cond;
1895
Value _y;
1896
char *_message;
1897
1898
public:
1899
// creation
1900
// unordered_is_true is valid for float/double compares only
1901
Assert(Value x, Condition cond, bool unordered_is_true, Value y);
1902
1903
// accessors
1904
Value x() const { return _x; }
1905
Condition cond() const { return _cond; }
1906
bool unordered_is_true() const { return check_flag(UnorderedIsTrueFlag); }
1907
Value y() const { return _y; }
1908
const char *message() const { return _message; }
1909
1910
// generic
1911
virtual void input_values_do(ValueVisitor* f) { f->visit(&_x); f->visit(&_y); }
1912
};
1913
#endif
1914
1915
LEAF(RangeCheckPredicate, StateSplit)
1916
private:
1917
Value _x;
1918
Condition _cond;
1919
Value _y;
1920
1921
void check_state();
1922
1923
public:
1924
// creation
1925
// unordered_is_true is valid for float/double compares only
1926
RangeCheckPredicate(Value x, Condition cond, bool unordered_is_true, Value y, ValueStack* state) : StateSplit(illegalType)
1927
, _x(x)
1928
, _cond(cond)
1929
, _y(y)
1930
{
1931
ASSERT_VALUES
1932
set_flag(UnorderedIsTrueFlag, unordered_is_true);
1933
assert(x->type()->tag() == y->type()->tag(), "types must match");
1934
this->set_state(state);
1935
check_state();
1936
}
1937
1938
// Always deoptimize
1939
RangeCheckPredicate(ValueStack* state) : StateSplit(illegalType)
1940
{
1941
this->set_state(state);
1942
_x = _y = NULL;
1943
check_state();
1944
}
1945
1946
// accessors
1947
Value x() const { return _x; }
1948
Condition cond() const { return _cond; }
1949
bool unordered_is_true() const { return check_flag(UnorderedIsTrueFlag); }
1950
Value y() const { return _y; }
1951
1952
void always_fail() { _x = _y = NULL; }
1953
1954
// generic
1955
virtual void input_values_do(ValueVisitor* f) { StateSplit::input_values_do(f); f->visit(&_x); f->visit(&_y); }
1956
HASHING3(RangeCheckPredicate, true, x()->subst(), y()->subst(), cond())
1957
};
1958
1959
LEAF(If, BlockEnd)
1960
private:
1961
Value _x;
1962
Condition _cond;
1963
Value _y;
1964
ciMethod* _profiled_method;
1965
int _profiled_bci; // Canonicalizer may alter bci of If node
1966
bool _swapped; // Is the order reversed with respect to the original If in the
1967
// bytecode stream?
1968
public:
1969
// creation
1970
// unordered_is_true is valid for float/double compares only
1971
If(Value x, Condition cond, bool unordered_is_true, Value y, BlockBegin* tsux, BlockBegin* fsux, ValueStack* state_before, bool is_safepoint)
1972
: BlockEnd(illegalType, state_before, is_safepoint)
1973
, _x(x)
1974
, _cond(cond)
1975
, _y(y)
1976
, _profiled_method(NULL)
1977
, _profiled_bci(0)
1978
, _swapped(false)
1979
{
1980
ASSERT_VALUES
1981
set_flag(UnorderedIsTrueFlag, unordered_is_true);
1982
assert(x->type()->tag() == y->type()->tag(), "types must match");
1983
BlockList* s = new BlockList(2);
1984
s->append(tsux);
1985
s->append(fsux);
1986
set_sux(s);
1987
}
1988
1989
// accessors
1990
Value x() const { return _x; }
1991
Condition cond() const { return _cond; }
1992
bool unordered_is_true() const { return check_flag(UnorderedIsTrueFlag); }
1993
Value y() const { return _y; }
1994
BlockBegin* sux_for(bool is_true) const { return sux_at(is_true ? 0 : 1); }
1995
BlockBegin* tsux() const { return sux_for(true); }
1996
BlockBegin* fsux() const { return sux_for(false); }
1997
BlockBegin* usux() const { return sux_for(unordered_is_true()); }
1998
bool should_profile() const { return check_flag(ProfileMDOFlag); }
1999
ciMethod* profiled_method() const { return _profiled_method; } // set only for profiled branches
2000
int profiled_bci() const { return _profiled_bci; } // set for profiled branches and tiered
2001
bool is_swapped() const { return _swapped; }
2002
2003
// manipulation
2004
void swap_operands() {
2005
Value t = _x; _x = _y; _y = t;
2006
_cond = mirror(_cond);
2007
}
2008
2009
void swap_sux() {
2010
assert(number_of_sux() == 2, "wrong number of successors");
2011
BlockList* s = sux();
2012
BlockBegin* t = s->at(0); s->at_put(0, s->at(1)); s->at_put(1, t);
2013
_cond = negate(_cond);
2014
set_flag(UnorderedIsTrueFlag, !check_flag(UnorderedIsTrueFlag));
2015
}
2016
2017
void set_should_profile(bool value) { set_flag(ProfileMDOFlag, value); }
2018
void set_profiled_method(ciMethod* method) { _profiled_method = method; }
2019
void set_profiled_bci(int bci) { _profiled_bci = bci; }
2020
void set_swapped(bool value) { _swapped = value; }
2021
// generic
2022
virtual void input_values_do(ValueVisitor* f) { BlockEnd::input_values_do(f); f->visit(&_x); f->visit(&_y); }
2023
};
2024
2025
2026
BASE(Switch, BlockEnd)
2027
private:
2028
Value _tag;
2029
2030
public:
2031
// creation
2032
Switch(Value tag, BlockList* sux, ValueStack* state_before, bool is_safepoint)
2033
: BlockEnd(illegalType, state_before, is_safepoint)
2034
, _tag(tag) {
2035
ASSERT_VALUES
2036
set_sux(sux);
2037
}
2038
2039
// accessors
2040
Value tag() const { return _tag; }
2041
int length() const { return number_of_sux() - 1; }
2042
2043
virtual bool needs_exception_state() const { return false; }
2044
2045
// generic
2046
virtual void input_values_do(ValueVisitor* f) { BlockEnd::input_values_do(f); f->visit(&_tag); }
2047
};
2048
2049
2050
LEAF(TableSwitch, Switch)
2051
private:
2052
int _lo_key;
2053
2054
public:
2055
// creation
2056
TableSwitch(Value tag, BlockList* sux, int lo_key, ValueStack* state_before, bool is_safepoint)
2057
: Switch(tag, sux, state_before, is_safepoint)
2058
, _lo_key(lo_key) { assert(_lo_key <= hi_key(), "integer overflow"); }
2059
2060
// accessors
2061
int lo_key() const { return _lo_key; }
2062
int hi_key() const { return _lo_key + (length() - 1); }
2063
};
2064
2065
2066
LEAF(LookupSwitch, Switch)
2067
private:
2068
intArray* _keys;
2069
2070
public:
2071
// creation
2072
LookupSwitch(Value tag, BlockList* sux, intArray* keys, ValueStack* state_before, bool is_safepoint)
2073
: Switch(tag, sux, state_before, is_safepoint)
2074
, _keys(keys) {
2075
assert(keys != NULL, "keys must exist");
2076
assert(keys->length() == length(), "sux & keys have incompatible lengths");
2077
}
2078
2079
// accessors
2080
int key_at(int i) const { return _keys->at(i); }
2081
};
2082
2083
2084
LEAF(Return, BlockEnd)
2085
private:
2086
Value _result;
2087
2088
public:
2089
// creation
2090
Return(Value result) :
2091
BlockEnd(result == NULL ? voidType : result->type()->base(), NULL, true),
2092
_result(result) {}
2093
2094
// accessors
2095
Value result() const { return _result; }
2096
bool has_result() const { return result() != NULL; }
2097
2098
// generic
2099
virtual void input_values_do(ValueVisitor* f) {
2100
BlockEnd::input_values_do(f);
2101
if (has_result()) f->visit(&_result);
2102
}
2103
};
2104
2105
2106
LEAF(Throw, BlockEnd)
2107
private:
2108
Value _exception;
2109
2110
public:
2111
// creation
2112
Throw(Value exception, ValueStack* state_before) : BlockEnd(illegalType, state_before, true), _exception(exception) {
2113
ASSERT_VALUES
2114
}
2115
2116
// accessors
2117
Value exception() const { return _exception; }
2118
2119
// generic
2120
virtual bool can_trap() const { return true; }
2121
virtual void input_values_do(ValueVisitor* f) { BlockEnd::input_values_do(f); f->visit(&_exception); }
2122
};
2123
2124
2125
LEAF(Base, BlockEnd)
2126
public:
2127
// creation
2128
Base(BlockBegin* std_entry, BlockBegin* osr_entry) : BlockEnd(illegalType, NULL, false) {
2129
assert(std_entry->is_set(BlockBegin::std_entry_flag), "std entry must be flagged");
2130
assert(osr_entry == NULL || osr_entry->is_set(BlockBegin::osr_entry_flag), "osr entry must be flagged");
2131
BlockList* s = new BlockList(2);
2132
if (osr_entry != NULL) s->append(osr_entry);
2133
s->append(std_entry); // must be default sux!
2134
set_sux(s);
2135
}
2136
2137
// accessors
2138
BlockBegin* std_entry() const { return default_sux(); }
2139
BlockBegin* osr_entry() const { return number_of_sux() < 2 ? NULL : sux_at(0); }
2140
};
2141
2142
2143
LEAF(OsrEntry, Instruction)
2144
public:
2145
// creation
2146
#ifdef _LP64
2147
OsrEntry() : Instruction(longType) { pin(); }
2148
#else
2149
OsrEntry() : Instruction(intType) { pin(); }
2150
#endif
2151
2152
// generic
2153
virtual void input_values_do(ValueVisitor* f) { }
2154
};
2155
2156
2157
// Models the incoming exception at a catch site
2158
LEAF(ExceptionObject, Instruction)
2159
public:
2160
// creation
2161
ExceptionObject() : Instruction(objectType) {
2162
pin();
2163
}
2164
2165
// generic
2166
virtual void input_values_do(ValueVisitor* f) { }
2167
};
2168
2169
2170
// Models needed rounding for floating-point values on Intel.
2171
// Currently only used to represent rounding of double-precision
2172
// values stored into local variables, but could be used to model
2173
// intermediate rounding of single-precision values as well.
2174
LEAF(RoundFP, Instruction)
2175
private:
2176
Value _input; // floating-point value to be rounded
2177
2178
public:
2179
RoundFP(Value input)
2180
: Instruction(input->type()) // Note: should not be used for constants
2181
, _input(input)
2182
{
2183
ASSERT_VALUES
2184
}
2185
2186
// accessors
2187
Value input() const { return _input; }
2188
2189
// generic
2190
virtual void input_values_do(ValueVisitor* f) { f->visit(&_input); }
2191
};
2192
2193
2194
BASE(UnsafeOp, Instruction)
2195
private:
2196
BasicType _basic_type; // ValueType can not express byte-sized integers
2197
2198
protected:
2199
// creation
2200
UnsafeOp(BasicType basic_type, bool is_put)
2201
: Instruction(is_put ? voidType : as_ValueType(basic_type))
2202
, _basic_type(basic_type)
2203
{
2204
//Note: Unsafe ops are not not guaranteed to throw NPE.
2205
// Convservatively, Unsafe operations must be pinned though we could be
2206
// looser about this if we wanted to..
2207
pin();
2208
}
2209
2210
public:
2211
// accessors
2212
BasicType basic_type() { return _basic_type; }
2213
2214
// generic
2215
virtual void input_values_do(ValueVisitor* f) { }
2216
};
2217
2218
2219
BASE(UnsafeRawOp, UnsafeOp)
2220
private:
2221
Value _base; // Base address (a Java long)
2222
Value _index; // Index if computed by optimizer; initialized to NULL
2223
int _log2_scale; // Scale factor: 0, 1, 2, or 3.
2224
// Indicates log2 of number of bytes (1, 2, 4, or 8)
2225
// to scale index by.
2226
2227
protected:
2228
UnsafeRawOp(BasicType basic_type, Value addr, bool is_put)
2229
: UnsafeOp(basic_type, is_put)
2230
, _base(addr)
2231
, _index(NULL)
2232
, _log2_scale(0)
2233
{
2234
// Can not use ASSERT_VALUES because index may be NULL
2235
assert(addr != NULL && addr->type()->is_long(), "just checking");
2236
}
2237
2238
UnsafeRawOp(BasicType basic_type, Value base, Value index, int log2_scale, bool is_put)
2239
: UnsafeOp(basic_type, is_put)
2240
, _base(base)
2241
, _index(index)
2242
, _log2_scale(log2_scale)
2243
{
2244
}
2245
2246
public:
2247
// accessors
2248
Value base() { return _base; }
2249
Value index() { return _index; }
2250
bool has_index() { return (_index != NULL); }
2251
int log2_scale() { return _log2_scale; }
2252
2253
// setters
2254
void set_base (Value base) { _base = base; }
2255
void set_index(Value index) { _index = index; }
2256
void set_log2_scale(int log2_scale) { _log2_scale = log2_scale; }
2257
2258
// generic
2259
virtual void input_values_do(ValueVisitor* f) { UnsafeOp::input_values_do(f);
2260
f->visit(&_base);
2261
if (has_index()) f->visit(&_index); }
2262
};
2263
2264
2265
LEAF(UnsafeGetRaw, UnsafeRawOp)
2266
private:
2267
bool _may_be_unaligned, _is_wide; // For OSREntry
2268
2269
public:
2270
UnsafeGetRaw(BasicType basic_type, Value addr, bool may_be_unaligned, bool is_wide = false)
2271
: UnsafeRawOp(basic_type, addr, false) {
2272
_may_be_unaligned = may_be_unaligned;
2273
_is_wide = is_wide;
2274
}
2275
2276
UnsafeGetRaw(BasicType basic_type, Value base, Value index, int log2_scale, bool may_be_unaligned, bool is_wide = false)
2277
: UnsafeRawOp(basic_type, base, index, log2_scale, false) {
2278
_may_be_unaligned = may_be_unaligned;
2279
_is_wide = is_wide;
2280
}
2281
2282
bool may_be_unaligned() { return _may_be_unaligned; }
2283
bool is_wide() { return _is_wide; }
2284
};
2285
2286
2287
LEAF(UnsafePutRaw, UnsafeRawOp)
2288
private:
2289
Value _value; // Value to be stored
2290
2291
public:
2292
UnsafePutRaw(BasicType basic_type, Value addr, Value value)
2293
: UnsafeRawOp(basic_type, addr, true)
2294
, _value(value)
2295
{
2296
assert(value != NULL, "just checking");
2297
ASSERT_VALUES
2298
}
2299
2300
UnsafePutRaw(BasicType basic_type, Value base, Value index, int log2_scale, Value value)
2301
: UnsafeRawOp(basic_type, base, index, log2_scale, true)
2302
, _value(value)
2303
{
2304
assert(value != NULL, "just checking");
2305
ASSERT_VALUES
2306
}
2307
2308
// accessors
2309
Value value() { return _value; }
2310
2311
// generic
2312
virtual void input_values_do(ValueVisitor* f) { UnsafeRawOp::input_values_do(f);
2313
f->visit(&_value); }
2314
};
2315
2316
2317
BASE(UnsafeObjectOp, UnsafeOp)
2318
private:
2319
Value _object; // Object to be fetched from or mutated
2320
Value _offset; // Offset within object
2321
bool _is_volatile; // true if volatile - dl/JSR166
2322
public:
2323
UnsafeObjectOp(BasicType basic_type, Value object, Value offset, bool is_put, bool is_volatile)
2324
: UnsafeOp(basic_type, is_put), _object(object), _offset(offset), _is_volatile(is_volatile)
2325
{
2326
}
2327
2328
// accessors
2329
Value object() { return _object; }
2330
Value offset() { return _offset; }
2331
bool is_volatile() { return _is_volatile; }
2332
// generic
2333
virtual void input_values_do(ValueVisitor* f) { UnsafeOp::input_values_do(f);
2334
f->visit(&_object);
2335
f->visit(&_offset); }
2336
};
2337
2338
2339
LEAF(UnsafeGetObject, UnsafeObjectOp)
2340
public:
2341
UnsafeGetObject(BasicType basic_type, Value object, Value offset, bool is_volatile)
2342
: UnsafeObjectOp(basic_type, object, offset, false, is_volatile)
2343
{
2344
ASSERT_VALUES
2345
}
2346
};
2347
2348
2349
LEAF(UnsafePutObject, UnsafeObjectOp)
2350
private:
2351
Value _value; // Value to be stored
2352
public:
2353
UnsafePutObject(BasicType basic_type, Value object, Value offset, Value value, bool is_volatile)
2354
: UnsafeObjectOp(basic_type, object, offset, true, is_volatile)
2355
, _value(value)
2356
{
2357
ASSERT_VALUES
2358
}
2359
2360
// accessors
2361
Value value() { return _value; }
2362
2363
// generic
2364
virtual void input_values_do(ValueVisitor* f) { UnsafeObjectOp::input_values_do(f);
2365
f->visit(&_value); }
2366
};
2367
2368
LEAF(UnsafeGetAndSetObject, UnsafeObjectOp)
2369
private:
2370
Value _value; // Value to be stored
2371
bool _is_add;
2372
public:
2373
UnsafeGetAndSetObject(BasicType basic_type, Value object, Value offset, Value value, bool is_add)
2374
: UnsafeObjectOp(basic_type, object, offset, false, false)
2375
, _value(value)
2376
, _is_add(is_add)
2377
{
2378
ASSERT_VALUES
2379
}
2380
2381
// accessors
2382
bool is_add() const { return _is_add; }
2383
Value value() { return _value; }
2384
2385
// generic
2386
virtual void input_values_do(ValueVisitor* f) { UnsafeObjectOp::input_values_do(f);
2387
f->visit(&_value); }
2388
};
2389
2390
LEAF(ProfileCall, Instruction)
2391
private:
2392
ciMethod* _method;
2393
int _bci_of_invoke;
2394
ciMethod* _callee; // the method that is called at the given bci
2395
Value _recv;
2396
ciKlass* _known_holder;
2397
Values* _obj_args; // arguments for type profiling
2398
ArgsNonNullState _nonnull_state; // Do we know whether some arguments are never null?
2399
bool _inlined; // Are we profiling a call that is inlined
2400
2401
public:
2402
ProfileCall(ciMethod* method, int bci, ciMethod* callee, Value recv, ciKlass* known_holder, Values* obj_args, bool inlined)
2403
: Instruction(voidType)
2404
, _method(method)
2405
, _bci_of_invoke(bci)
2406
, _callee(callee)
2407
, _recv(recv)
2408
, _known_holder(known_holder)
2409
, _obj_args(obj_args)
2410
, _inlined(inlined)
2411
{
2412
// The ProfileCall has side-effects and must occur precisely where located
2413
pin();
2414
}
2415
2416
ciMethod* method() const { return _method; }
2417
int bci_of_invoke() const { return _bci_of_invoke; }
2418
ciMethod* callee() const { return _callee; }
2419
Value recv() const { return _recv; }
2420
ciKlass* known_holder() const { return _known_holder; }
2421
int nb_profiled_args() const { return _obj_args == NULL ? 0 : _obj_args->length(); }
2422
Value profiled_arg_at(int i) const { return _obj_args->at(i); }
2423
bool arg_needs_null_check(int i) const {
2424
return _nonnull_state.arg_needs_null_check(i);
2425
}
2426
bool inlined() const { return _inlined; }
2427
2428
void set_arg_needs_null_check(int i, bool check) {
2429
_nonnull_state.set_arg_needs_null_check(i, check);
2430
}
2431
2432
virtual void input_values_do(ValueVisitor* f) {
2433
if (_recv != NULL) {
2434
f->visit(&_recv);
2435
}
2436
for (int i = 0; i < nb_profiled_args(); i++) {
2437
f->visit(_obj_args->adr_at(i));
2438
}
2439
}
2440
};
2441
2442
LEAF(ProfileReturnType, Instruction)
2443
private:
2444
ciMethod* _method;
2445
ciMethod* _callee;
2446
int _bci_of_invoke;
2447
Value _ret;
2448
2449
public:
2450
ProfileReturnType(ciMethod* method, int bci, ciMethod* callee, Value ret)
2451
: Instruction(voidType)
2452
, _method(method)
2453
, _callee(callee)
2454
, _bci_of_invoke(bci)
2455
, _ret(ret)
2456
{
2457
set_needs_null_check(true);
2458
// The ProfileType has side-effects and must occur precisely where located
2459
pin();
2460
}
2461
2462
ciMethod* method() const { return _method; }
2463
ciMethod* callee() const { return _callee; }
2464
int bci_of_invoke() const { return _bci_of_invoke; }
2465
Value ret() const { return _ret; }
2466
2467
virtual void input_values_do(ValueVisitor* f) {
2468
if (_ret != NULL) {
2469
f->visit(&_ret);
2470
}
2471
}
2472
};
2473
2474
// Call some C runtime function that doesn't safepoint,
2475
// optionally passing the current thread as the first argument.
2476
LEAF(RuntimeCall, Instruction)
2477
private:
2478
const char* _entry_name;
2479
address _entry;
2480
Values* _args;
2481
bool _pass_thread; // Pass the JavaThread* as an implicit first argument
2482
2483
public:
2484
RuntimeCall(ValueType* type, const char* entry_name, address entry, Values* args, bool pass_thread = true)
2485
: Instruction(type)
2486
, _entry_name(entry_name)
2487
, _entry(entry)
2488
, _args(args)
2489
, _pass_thread(pass_thread) {
2490
ASSERT_VALUES
2491
pin();
2492
}
2493
2494
const char* entry_name() const { return _entry_name; }
2495
address entry() const { return _entry; }
2496
int number_of_arguments() const { return _args->length(); }
2497
Value argument_at(int i) const { return _args->at(i); }
2498
bool pass_thread() const { return _pass_thread; }
2499
2500
virtual void input_values_do(ValueVisitor* f) {
2501
for (int i = 0; i < _args->length(); i++) f->visit(_args->adr_at(i));
2502
}
2503
};
2504
2505
// Use to trip invocation counter of an inlined method
2506
2507
LEAF(ProfileInvoke, Instruction)
2508
private:
2509
ciMethod* _inlinee;
2510
ValueStack* _state;
2511
2512
public:
2513
ProfileInvoke(ciMethod* inlinee, ValueStack* state)
2514
: Instruction(voidType)
2515
, _inlinee(inlinee)
2516
, _state(state)
2517
{
2518
// The ProfileInvoke has side-effects and must occur precisely where located QQQ???
2519
pin();
2520
}
2521
2522
ciMethod* inlinee() { return _inlinee; }
2523
ValueStack* state() { return _state; }
2524
virtual void input_values_do(ValueVisitor*) {}
2525
virtual void state_values_do(ValueVisitor*);
2526
};
2527
2528
LEAF(MemBar, Instruction)
2529
private:
2530
LIR_Code _code;
2531
2532
public:
2533
MemBar(LIR_Code code)
2534
: Instruction(voidType)
2535
, _code(code)
2536
{
2537
pin();
2538
}
2539
2540
LIR_Code code() { return _code; }
2541
2542
virtual void input_values_do(ValueVisitor*) {}
2543
};
2544
2545
class BlockPair: public CompilationResourceObj {
2546
private:
2547
BlockBegin* _from;
2548
BlockBegin* _to;
2549
public:
2550
BlockPair(BlockBegin* from, BlockBegin* to): _from(from), _to(to) {}
2551
BlockBegin* from() const { return _from; }
2552
BlockBegin* to() const { return _to; }
2553
bool is_same(BlockBegin* from, BlockBegin* to) const { return _from == from && _to == to; }
2554
bool is_same(BlockPair* p) const { return _from == p->from() && _to == p->to(); }
2555
void set_to(BlockBegin* b) { _to = b; }
2556
void set_from(BlockBegin* b) { _from = b; }
2557
};
2558
2559
typedef GrowableArray<BlockPair*> BlockPairList;
2560
2561
inline int BlockBegin::number_of_sux() const { assert(_end == NULL || _end->number_of_sux() == _successors.length(), "mismatch"); return _successors.length(); }
2562
inline BlockBegin* BlockBegin::sux_at(int i) const { assert(_end == NULL || _end->sux_at(i) == _successors.at(i), "mismatch"); return _successors.at(i); }
2563
inline void BlockBegin::add_successor(BlockBegin* sux) { assert(_end == NULL, "Would create mismatch with successors of BlockEnd"); _successors.append(sux); }
2564
2565
#undef ASSERT_VALUES
2566
2567
#endif // SHARE_C1_C1_INSTRUCTION_HPP
2568
2569