1.1 --- a/src/share/vm/opto/library_call.cpp Tue Aug 05 15:02:10 2014 -0700 1.2 +++ b/src/share/vm/opto/library_call.cpp Tue Jun 10 12:28:06 2014 -0700 1.3 @@ -46,25 +46,28 @@ 1.4 public: 1.5 private: 1.6 bool _is_virtual; 1.7 - bool _is_predicted; 1.8 bool _does_virtual_dispatch; 1.9 + int8_t _predicates_count; // Intrinsic is predicated by several conditions 1.10 + int8_t _last_predicate; // Last generated predicate 1.11 vmIntrinsics::ID _intrinsic_id; 1.12 1.13 public: 1.14 - LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, bool does_virtual_dispatch, vmIntrinsics::ID id) 1.15 + LibraryIntrinsic(ciMethod* m, bool is_virtual, int predicates_count, bool does_virtual_dispatch, vmIntrinsics::ID id) 1.16 : InlineCallGenerator(m), 1.17 _is_virtual(is_virtual), 1.18 - _is_predicted(is_predicted), 1.19 _does_virtual_dispatch(does_virtual_dispatch), 1.20 + _predicates_count((int8_t)predicates_count), 1.21 + _last_predicate((int8_t)-1), 1.22 _intrinsic_id(id) 1.23 { 1.24 } 1.25 virtual bool is_intrinsic() const { return true; } 1.26 virtual bool is_virtual() const { return _is_virtual; } 1.27 - virtual bool is_predicted() const { return _is_predicted; } 1.28 + virtual bool is_predicated() const { return _predicates_count > 0; } 1.29 + virtual int predicates_count() const { return _predicates_count; } 1.30 virtual bool does_virtual_dispatch() const { return _does_virtual_dispatch; } 1.31 virtual JVMState* generate(JVMState* jvms, Parse* parent_parser); 1.32 - virtual Node* generate_predicate(JVMState* jvms); 1.33 + virtual Node* generate_predicate(JVMState* jvms, int predicate); 1.34 vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; } 1.35 }; 1.36 1.37 @@ -107,8 +110,8 @@ 1.38 vmIntrinsics::ID intrinsic_id() const { return _intrinsic->intrinsic_id(); } 1.39 ciMethod* callee() const { return _intrinsic->method(); } 1.40 1.41 - bool try_to_inline(); 1.42 - Node* try_to_predicate(); 1.43 + bool try_to_inline(int predicate); 1.44 + Node* try_to_predicate(int predicate); 1.45 1.46 void push_result() { 1.47 // Push the result onto the stack. 1.48 @@ -367,7 +370,7 @@ 1.49 } 1.50 } 1.51 1.52 - bool is_predicted = false; 1.53 + int predicates = 0; 1.54 bool does_virtual_dispatch = false; 1.55 1.56 switch (id) { 1.57 @@ -508,7 +511,7 @@ 1.58 case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: 1.59 if (!UseAESIntrinsics) return NULL; 1.60 // these two require the predicated logic 1.61 - is_predicted = true; 1.62 + predicates = 1; 1.63 break; 1.64 1.65 case vmIntrinsics::_updateCRC32: 1.66 @@ -577,7 +580,7 @@ 1.67 if (!InlineUnsafeOps) return NULL; 1.68 } 1.69 1.70 - return new LibraryIntrinsic(m, is_virtual, is_predicted, does_virtual_dispatch, (vmIntrinsics::ID) id); 1.71 + return new LibraryIntrinsic(m, is_virtual, predicates, does_virtual_dispatch, (vmIntrinsics::ID) id); 1.72 } 1.73 1.74 //----------------------register_library_intrinsics----------------------- 1.75 @@ -601,7 +604,7 @@ 1.76 const int bci = kit.bci(); 1.77 1.78 // Try to inline the intrinsic. 1.79 - if (kit.try_to_inline()) { 1.80 + if (kit.try_to_inline(_last_predicate)) { 1.81 if (C->print_intrinsics() || C->print_inlining()) { 1.82 C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)"); 1.83 } 1.84 @@ -634,12 +637,13 @@ 1.85 return NULL; 1.86 } 1.87 1.88 -Node* LibraryIntrinsic::generate_predicate(JVMState* jvms) { 1.89 +Node* LibraryIntrinsic::generate_predicate(JVMState* jvms, int predicate) { 1.90 LibraryCallKit kit(jvms, this); 1.91 Compile* C = kit.C; 1.92 int nodes = C->unique(); 1.93 + _last_predicate = predicate; 1.94 #ifndef PRODUCT 1.95 - assert(is_predicted(), "sanity"); 1.96 + assert(is_predicated() && predicate < predicates_count(), "sanity"); 1.97 if ((C->print_intrinsics() || C->print_inlining()) && Verbose) { 1.98 char buf[1000]; 1.99 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf)); 1.100 @@ -649,10 +653,10 @@ 1.101 ciMethod* callee = kit.callee(); 1.102 const int bci = kit.bci(); 1.103 1.104 - Node* slow_ctl = kit.try_to_predicate(); 1.105 + Node* slow_ctl = kit.try_to_predicate(predicate); 1.106 if (!kit.failing()) { 1.107 if (C->print_intrinsics() || C->print_inlining()) { 1.108 - C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)"); 1.109 + C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual, predicate)" : "(intrinsic, predicate)"); 1.110 } 1.111 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked); 1.112 if (C->log()) { 1.113 @@ -681,7 +685,7 @@ 1.114 return NULL; 1.115 } 1.116 1.117 -bool LibraryCallKit::try_to_inline() { 1.118 +bool LibraryCallKit::try_to_inline(int predicate) { 1.119 // Handle symbolic names for otherwise undistinguished boolean switches: 1.120 const bool is_store = true; 1.121 const bool is_native_ptr = true; 1.122 @@ -898,7 +902,7 @@ 1.123 } 1.124 } 1.125 1.126 -Node* LibraryCallKit::try_to_predicate() { 1.127 +Node* LibraryCallKit::try_to_predicate(int predicate) { 1.128 if (!jvms()->has_method()) { 1.129 // Root JVMState has a null method. 1.130 assert(map()->memory()->Opcode() == Op_Parm, ""); 1.131 @@ -5866,7 +5870,12 @@ 1.132 BasicType bt = field->layout_type(); 1.133 1.134 // Build the resultant type of the load 1.135 - const Type *type = TypeOopPtr::make_from_klass(field_klass->as_klass()); 1.136 + const Type *type; 1.137 + if (bt == T_OBJECT) { 1.138 + type = TypeOopPtr::make_from_klass(field_klass->as_klass()); 1.139 + } else { 1.140 + type = Type::get_const_basic_type(bt); 1.141 + } 1.142 1.143 // Build the load. 1.144 Node* loadedField = make_load(NULL, adr, type, bt, adr_type, MemNode::unordered, is_vol); 1.145 @@ -5996,7 +6005,7 @@ 1.146 assert(tinst != NULL, "CBC obj is null"); 1.147 assert(tinst->klass()->is_loaded(), "CBC obj is not loaded"); 1.148 ciKlass* klass_AESCrypt = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); 1.149 - if (!klass_AESCrypt->is_loaded()) return false; 1.150 + assert(klass_AESCrypt->is_loaded(), "predicate checks that this class is loaded"); 1.151 1.152 ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); 1.153 const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_AESCrypt); 1.154 @@ -6071,11 +6080,8 @@ 1.155 // note cipher==plain is more conservative than the original java code but that's OK 1.156 // 1.157 Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting) { 1.158 - // First, check receiver for NULL since it is virtual method. 1.159 + // The receiver was checked for NULL already. 1.160 Node* objCBC = argument(0); 1.161 - objCBC = null_check(objCBC); 1.162 - 1.163 - if (stopped()) return NULL; // Always NULL 1.164 1.165 // Load embeddedCipher field of CipherBlockChaining object. 1.166 Node* embeddedCipherObj = load_field_from_object(objCBC, "embeddedCipher", "Lcom/sun/crypto/provider/SymmetricCipher;", /*is_exact*/ false);