< 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 >