< prev index next >

src/hotspot/share/opto/coalesce.cpp

Print this page
rev 48658 : 8192992: Test8007294.java failed: attempted to spill a non-spillable item
Summary: Allow recompile without subsuming loads
Reviewed-by:

@@ -26,10 +26,11 @@
 #include "memory/allocation.inline.hpp"
 #include "opto/block.hpp"
 #include "opto/cfgnode.hpp"
 #include "opto/chaitin.hpp"
 #include "opto/coalesce.hpp"
+#include "opto/c2compiler.hpp"
 #include "opto/connode.hpp"
 #include "opto/indexSet.hpp"
 #include "opto/machnode.hpp"
 #include "opto/matcher.hpp"
 #include "opto/regmask.hpp"

@@ -292,13 +293,19 @@
               // Copy any flags as well
               _phc.clone_projs(pred, pred->end_idx(), m, copy, _phc._lrg_map);
             } else {
               uint ireg = m->ideal_reg();
               if (ireg == 0 || ireg == Op_RegFlags) {
+                if (C->subsume_loads() == true && !C->failing()) {
+                  // Retry with subsume_loads == false
+                  C->record_failure(C2Compiler::retry_no_subsuming_loads());
+                } else {
                 assert(false, "attempted to spill a non-spillable item: %d: %s, ireg = %u, spill_type: %s",
                        m->_idx, m->Name(), ireg, MachSpillCopyNode::spill_type(MachSpillCopyNode::PhiInput));
+                  // Bailout without retry
                 C->record_method_not_compilable("attempted to spill a non-spillable item");
+                }
                 return;
               }
               const RegMask *rm = C->matcher()->idealreg2spillmask[ireg];
               copy = new MachSpillCopyNode(MachSpillCopyNode::PhiInput, m, *rm, *rm);
               // Find a good place to insert.  Kinda tricky, use a subroutine
< prev index next >