src/share/vm/opto/library_call.cpp

changeset 7026
922c87c9aed4
parent 6733
00c8a1255912
child 7027
b20a35eae442
     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);

mercurial