< prev index next >

src/hotspot/share/opto/loopopts.cpp

Print this page

        

*** 38,47 **** --- 38,48 ---- #include "opto/mulnode.hpp" #include "opto/movenode.hpp" #include "opto/opaquenode.hpp" #include "opto/rootnode.hpp" #include "opto/subnode.hpp" + #include "opto/valuetypenode.hpp" #include "utilities/macros.hpp" #if INCLUDE_ZGC #include "gc/z/c2/zBarrierSetC2.hpp" #endif
*** 61,70 **** --- 62,77 ---- if (n->Opcode() == Op_CastII && n->as_CastII()->has_range_check() && region->is_CountedLoop() && n->in(1) == region->as_CountedLoop()->phi()) { return NULL; } + // Value types should not be split through Phis because they cannot be merged + // through Phi nodes but each value input needs to be merged individually. + if (n->is_ValueType()) { + return NULL; + } + int wins = 0; assert(!n->is_CFG(), ""); assert(region->is_Region(), ""); const Type* type = n->bottom_type();
*** 1447,1456 **** --- 1454,1469 ---- } } try_move_store_after_loop(n); + // Remove multiple allocations of the same value type + if (n->is_ValueType() && EliminateAllocations) { + n->as_ValueType()->remove_redundant_allocations(&_igvn, this); + return; // n is now dead + } + // Check for Opaque2's who's loop has disappeared - who's input is in the // same loop nest as their output. Remove 'em, they are no longer useful. if( n_op == Op_Opaque2 && n->in(1) != NULL && get_loop(get_ctrl(n)) == get_loop(get_ctrl(n->in(1))) ) {
< prev index next >