< prev index next >

src/share/vm/opto/loopnode.hpp

Print this page
rev 11401 : other changes
rev 12673 : move loop variant barriers that have all uses outside a loop after the loop
rev 13082 : loop predicate exp
rev 13090 : Make a copy of strip mined loops with small number of iterations from profiling
rev 13092 : aggressive predicates

@@ -70,11 +70,12 @@
          DoUnrollOnly=1024,
          VectorizedLoop=2048,
          HasAtomicPostLoop=4096,
          HasRangeChecks=8192,
          IsMultiversioned=16384,
-         StripMined=32768};
+         StripMined=32768,
+         StripMinedShortCloned=65536};
   char _unswitch_count;
   enum { _unswitch_max=3 };
   char _postloop_flags;
   enum { LoopNotRCEChecked = 0, LoopRCEChecked = 1, RCEPostLoop = 2 };
 

@@ -90,10 +91,11 @@
   uint is_vectorized_loop() const { return _loop_flags & VectorizedLoop; }
   uint is_partial_peel_loop() const { return _loop_flags & PartialPeelLoop; }
   void set_partial_peel_loop() { _loop_flags |= PartialPeelLoop; }
   uint partial_peel_has_failed() const { return _loop_flags & PartialPeelFailed; }
   uint is_strip_mined() const { return _loop_flags & StripMined; }
+  uint is_strip_mined_short_cloned() const { return _loop_flags & StripMinedShortCloned; }
 
   void mark_partial_peel_failed() { _loop_flags |= PartialPeelFailed; }
   void mark_has_reductions() { _loop_flags |= HasReductions; }
   void mark_was_slp() { _loop_flags |= WasSlpAnalyzed; }
   void mark_passed_slp() { _loop_flags |= PassedSlpAnalysis; }

@@ -102,10 +104,11 @@
   void mark_has_atomic_post_loop() { _loop_flags |= HasAtomicPostLoop; }
   void mark_has_range_checks() { _loop_flags |=  HasRangeChecks; }
   void mark_is_multiversioned() { _loop_flags |= IsMultiversioned; }
   void mark_strip_mined() { _loop_flags |= StripMined; }
   void clear_strip_mined() { _loop_flags &= ~StripMined; }
+  void mark_strip_mined_short_cloned() { _loop_flags |= StripMinedShortCloned; }
 
   int unswitch_max() { return _unswitch_max; }
   int unswitch_count() { return _unswitch_count; }
 
   int has_been_range_checked() const { return _postloop_flags & LoopRCEChecked; }

@@ -457,10 +460,15 @@
 
   // Driver for various flavors of iteration splitting.  Returns false
   // if the current round of loop opts should stop.
   bool iteration_split_impl( PhaseIdealLoop *phase, Node_List &old_new );
 
+  // If profiling shows an inner strip mined loop runs for few
+  // iterations, make a copy without the outer strip mined loop and
+  // the safepoint
+  bool copy_strip_mined_short(PhaseIdealLoop *phase, Node_List &old_new);
+
   // Given dominators, try to find loops with calls that must always be
   // executed (call dominates loop tail).  These loops do not need non-call
   // safepoints (ncsfpt).
   void check_safepts(VectorSet &visited, Node_List &stack);
 
< prev index next >