comparison src/share/vm/opto/compile.cpp @ 14383:5ec7dace41a6

8027422: assert(_gvn.type(obj)->higher_equal(tjp)) failed: cast_up is no longer needed Summary: type methods shouldn't always operate on speculative part Reviewed-by: kvn, twisti
author roland
date Fri, 24 Jan 2014 09:31:53 +0100
parents 183bd5c00828
children 17ec2d5c43e8
comparison
equal deleted inserted replaced
14272:757ec609d8d5 14383:5ec7dace41a6
3917 // Go over all type nodes that carry a speculative type, drop the 3917 // Go over all type nodes that carry a speculative type, drop the
3918 // speculative part of the type and enqueue the node for an igvn 3918 // speculative part of the type and enqueue the node for an igvn
3919 // which may optimize it out. 3919 // which may optimize it out.
3920 for (uint next = 0; next < worklist.size(); ++next) { 3920 for (uint next = 0; next < worklist.size(); ++next) {
3921 Node *n = worklist.at(next); 3921 Node *n = worklist.at(next);
3922 if (n->is_Type() && n->as_Type()->type()->isa_oopptr() != NULL && 3922 if (n->is_Type()) {
3923 n->as_Type()->type()->is_oopptr()->speculative() != NULL) {
3924 TypeNode* tn = n->as_Type(); 3923 TypeNode* tn = n->as_Type();
3925 const TypeOopPtr* t = tn->type()->is_oopptr(); 3924 const Type* t = tn->type();
3926 bool in_hash = igvn.hash_delete(n); 3925 const Type* t_no_spec = t->remove_speculative();
3927 assert(in_hash, "node should be in igvn hash table"); 3926 if (t_no_spec != t) {
3928 tn->set_type(t->remove_speculative()); 3927 bool in_hash = igvn.hash_delete(n);
3929 igvn.hash_insert(n); 3928 assert(in_hash, "node should be in igvn hash table");
3930 igvn._worklist.push(n); // give it a chance to go away 3929 tn->set_type(t_no_spec);
3931 modified++; 3930 igvn.hash_insert(n);
3931 igvn._worklist.push(n); // give it a chance to go away
3932 modified++;
3933 }
3932 } 3934 }
3933 uint max = n->len(); 3935 uint max = n->len();
3934 for( uint i = 0; i < max; ++i ) { 3936 for( uint i = 0; i < max; ++i ) {
3935 Node *m = n->in(i); 3937 Node *m = n->in(i);
3936 if (not_a_node(m)) continue; 3938 if (not_a_node(m)) continue;
3940 // Drop the speculative part of all types in the igvn's type table 3942 // Drop the speculative part of all types in the igvn's type table
3941 igvn.remove_speculative_types(); 3943 igvn.remove_speculative_types();
3942 if (modified > 0) { 3944 if (modified > 0) {
3943 igvn.optimize(); 3945 igvn.optimize();
3944 } 3946 }
3947 #ifdef ASSERT
3948 // Verify that after the IGVN is over no speculative type has resurfaced
3949 worklist.clear();
3950 worklist.push(root());
3951 for (uint next = 0; next < worklist.size(); ++next) {
3952 Node *n = worklist.at(next);
3953 const Type* t = igvn.type(n);
3954 assert(t == t->remove_speculative(), "no more speculative types");
3955 if (n->is_Type()) {
3956 t = n->as_Type()->type();
3957 assert(t == t->remove_speculative(), "no more speculative types");
3958 }
3959 uint max = n->len();
3960 for( uint i = 0; i < max; ++i ) {
3961 Node *m = n->in(i);
3962 if (not_a_node(m)) continue;
3963 worklist.push(m);
3964 }
3965 }
3966 igvn.check_no_speculative_types();
3967 #endif
3945 } 3968 }
3946 } 3969 }
3947 3970
3948 // Auxiliary method to support randomized stressing/fuzzing. 3971 // Auxiliary method to support randomized stressing/fuzzing.
3949 // 3972 //