--- a/hotspot/src/share/vm/c1/c1_Instruction.hpp Sat Apr 02 10:54:15 2011 -0700
+++ b/hotspot/src/share/vm/c1/c1_Instruction.hpp Sun Apr 03 12:00:54 2011 +0200
@@ -621,16 +621,21 @@
LEAF(Local, Instruction)
private:
int _java_index; // the local index within the method to which the local belongs
+ ciType* _declared_type;
public:
// creation
- Local(ValueType* type, int index)
+ Local(ciType* declared, ValueType* type, int index)
: Instruction(type)
, _java_index(index)
+ , _declared_type(declared)
{}
// accessors
int java_index() const { return _java_index; }
+ ciType* declared_type() const { return _declared_type; }
+ ciType* exact_type() const;
+
// generic
virtual void input_values_do(ValueVisitor* f) { /* no values */ }
};
@@ -1146,6 +1151,8 @@
BasicTypeList* signature() const { return _signature; }
ciMethod* target() const { return _target; }
+ ciType* declared_type() const;
+
// Returns false if target is not loaded
bool target_is_final() const { return check_flag(TargetIsFinalFlag); }
bool target_is_loaded() const { return check_flag(TargetIsLoadedFlag); }
@@ -1187,6 +1194,7 @@
// generic
virtual bool can_trap() const { return true; }
ciType* exact_type() const;
+ ciType* declared_type() const;
};
@@ -1208,6 +1216,8 @@
virtual bool needs_exception_state() const { return false; }
+ ciType* declared_type() const;
+
// generic
virtual bool can_trap() const { return true; }
virtual void input_values_do(ValueVisitor* f) { StateSplit::input_values_do(f); f->visit(&_length); }
@@ -1397,6 +1407,7 @@
vmIntrinsics::ID _id;
Values* _args;
Value _recv;
+ int _nonnull_state; // mask identifying which args are nonnull
public:
// preserves_state can be set to true for Intrinsics
@@ -1417,6 +1428,7 @@
, _id(id)
, _args(args)
, _recv(NULL)
+ , _nonnull_state(AllBits)
{
assert(args != NULL, "args must exist");
ASSERT_VALUES
@@ -1442,6 +1454,23 @@
Value receiver() const { assert(has_receiver(), "must have receiver"); return _recv; }
bool preserves_state() const { return check_flag(PreservesStateFlag); }
+ bool arg_needs_null_check(int i) {
+ if (i >= 0 && i < (int)sizeof(_nonnull_state) * BitsPerByte) {
+ return is_set_nth_bit(_nonnull_state, i);
+ }
+ return true;
+ }
+
+ void set_arg_needs_null_check(int i, bool check) {
+ if (i >= 0 && i < (int)sizeof(_nonnull_state) * BitsPerByte) {
+ if (check) {
+ _nonnull_state |= nth_bit(i);
+ } else {
+ _nonnull_state &= ~(nth_bit(i));
+ }
+ }
+ }
+
// generic
virtual bool can_trap() const { return check_flag(CanTrapFlag); }
virtual void input_values_do(ValueVisitor* f) {