comparison src/share/vm/opto/macro.cpp @ 362:f8199438385b

Merge
author apetrusenko
date Wed, 17 Sep 2008 16:49:18 +0400
parents af945ba2e739 1ee8caae33af
children a1980da045cc
comparison
equal deleted inserted replaced
316:5fa96a5a7e76 362:f8199438385b
942 // optimize it to the raw slice. 942 // optimize it to the raw slice.
943 if (mem->is_MergeMem()) { 943 if (mem->is_MergeMem()) {
944 mem = mem->as_MergeMem()->memory_at(Compile::AliasIdxRaw); 944 mem = mem->as_MergeMem()->memory_at(Compile::AliasIdxRaw);
945 } 945 }
946 946
947 Node* eden_top_adr;
948 Node* eden_end_adr;
949 set_eden_pointers(eden_top_adr, eden_end_adr);
950
951 uint raw_idx = C->get_alias_index(TypeRawPtr::BOTTOM);
952 assert(ctrl != NULL, "must have control"); 947 assert(ctrl != NULL, "must have control");
953
954 // Load Eden::end. Loop invariant and hoisted.
955 //
956 // Note: We set the control input on "eden_end" and "old_eden_top" when using
957 // a TLAB to work around a bug where these values were being moved across
958 // a safepoint. These are not oops, so they cannot be include in the oop
959 // map, but the can be changed by a GC. The proper way to fix this would
960 // be to set the raw memory state when generating a SafepointNode. However
961 // this will require extensive changes to the loop optimization in order to
962 // prevent a degradation of the optimization.
963 // See comment in memnode.hpp, around line 227 in class LoadPNode.
964 Node* eden_end = make_load(ctrl, mem, eden_end_adr, 0, TypeRawPtr::BOTTOM, T_ADDRESS);
965
966 // We need a Region and corresponding Phi's to merge the slow-path and fast-path results. 948 // We need a Region and corresponding Phi's to merge the slow-path and fast-path results.
967 // they will not be used if "always_slow" is set 949 // they will not be used if "always_slow" is set
968 enum { slow_result_path = 1, fast_result_path = 2 }; 950 enum { slow_result_path = 1, fast_result_path = 2 };
969 Node *result_region; 951 Node *result_region;
970 Node *result_phi_rawmem; 952 Node *result_phi_rawmem;
980 initial_slow_test = NULL; 962 initial_slow_test = NULL;
981 } else { 963 } else {
982 initial_slow_test = BoolNode::make_predicate(initial_slow_test, &_igvn); 964 initial_slow_test = BoolNode::make_predicate(initial_slow_test, &_igvn);
983 } 965 }
984 966
985 if (DTraceAllocProbes) { 967 if (DTraceAllocProbes ||
968 !UseTLAB && (!Universe::heap()->supports_inline_contig_alloc() ||
969 (UseConcMarkSweepGC && CMSIncrementalMode))) {
986 // Force slow-path allocation 970 // Force slow-path allocation
987 always_slow = true; 971 always_slow = true;
988 initial_slow_test = NULL; 972 initial_slow_test = NULL;
989 } 973 }
974
990 975
991 enum { too_big_or_final_path = 1, need_gc_path = 2 }; 976 enum { too_big_or_final_path = 1, need_gc_path = 2 };
992 Node *slow_region = NULL; 977 Node *slow_region = NULL;
993 Node *toobig_false = ctrl; 978 Node *toobig_false = ctrl;
994 979
1014 } 999 }
1015 1000
1016 Node *slow_mem = mem; // save the current memory state for slow path 1001 Node *slow_mem = mem; // save the current memory state for slow path
1017 // generate the fast allocation code unless we know that the initial test will always go slow 1002 // generate the fast allocation code unless we know that the initial test will always go slow
1018 if (!always_slow) { 1003 if (!always_slow) {
1004 Node* eden_top_adr;
1005 Node* eden_end_adr;
1006
1007 set_eden_pointers(eden_top_adr, eden_end_adr);
1008
1009 // Load Eden::end. Loop invariant and hoisted.
1010 //
1011 // Note: We set the control input on "eden_end" and "old_eden_top" when using
1012 // a TLAB to work around a bug where these values were being moved across
1013 // a safepoint. These are not oops, so they cannot be include in the oop
1014 // map, but the can be changed by a GC. The proper way to fix this would
1015 // be to set the raw memory state when generating a SafepointNode. However
1016 // this will require extensive changes to the loop optimization in order to
1017 // prevent a degradation of the optimization.
1018 // See comment in memnode.hpp, around line 227 in class LoadPNode.
1019 Node *eden_end = make_load(ctrl, mem, eden_end_adr, 0, TypeRawPtr::BOTTOM, T_ADDRESS);
1020
1019 // allocate the Region and Phi nodes for the result 1021 // allocate the Region and Phi nodes for the result
1020 result_region = new (C, 3) RegionNode(3); 1022 result_region = new (C, 3) RegionNode(3);
1021 result_phi_rawmem = new (C, 3) PhiNode( result_region, Type::MEMORY, TypeRawPtr::BOTTOM ); 1023 result_phi_rawmem = new (C, 3) PhiNode( result_region, Type::MEMORY, TypeRawPtr::BOTTOM );
1022 result_phi_rawoop = new (C, 3) PhiNode( result_region, TypeRawPtr::BOTTOM ); 1024 result_phi_rawoop = new (C, 3) PhiNode( result_region, TypeRawPtr::BOTTOM );
1023 result_phi_i_o = new (C, 3) PhiNode( result_region, Type::ABIO ); // I/O is used for Prefetch 1025 result_phi_i_o = new (C, 3) PhiNode( result_region, Type::ABIO ); // I/O is used for Prefetch