--- old/src/share/vm/opto/loopnode.hpp 2016-02-08 18:02:47.641919400 -0800 +++ new/src/share/vm/opto/loopnode.hpp 2016-02-08 18:02:47.413919400 -0800 @@ -67,7 +67,9 @@ HasReductions=128, WasSlpAnalyzed=256, PassedSlpAnalysis=512, - DoUnrollOnly=1024 }; + DoUnrollOnly=1024, + VectorizedLoop=2048, + HasAtomicPostLoop=4096 }; char _unswitch_count; enum { _unswitch_max=3 }; @@ -86,6 +88,8 @@ void mark_was_slp() { _loop_flags |= WasSlpAnalyzed; } void mark_passed_slp() { _loop_flags |= PassedSlpAnalysis; } void mark_do_unroll_only() { _loop_flags |= DoUnrollOnly; } + void mark_loop_vectorized() { _loop_flags |= VectorizedLoop; } + void mark_has_atomic_post_loop() { _loop_flags |= HasAtomicPostLoop; } int unswitch_max() { return _unswitch_max; } int unswitch_count() { return _unswitch_count; } @@ -221,6 +225,8 @@ int has_passed_slp () const { return (_loop_flags&PassedSlpAnalysis) == PassedSlpAnalysis; } int do_unroll_only () const { return (_loop_flags&DoUnrollOnly) == DoUnrollOnly; } int is_main_no_pre_loop() const { return _loop_flags & MainHasNoPreLoop; } + int is_vectorized_loop () const { return (_loop_flags & VectorizedLoop) == VectorizedLoop; } + int has_atomic_post_loop () const { return (_loop_flags & HasAtomicPostLoop) == HasAtomicPostLoop; } void set_main_no_pre_loop() { _loop_flags |= MainHasNoPreLoop; } int main_idx() const { return _main_idx; } @@ -893,6 +899,8 @@ // Add pre and post loops around the given loop. These loops are used // during RCE, unrolling and aligning loops. void insert_pre_post_loops( IdealLoopTree *loop, Node_List &old_new, bool peel_only ); + // Add a vector post loop between a vector main loop and the current post loop + void insert_vector_post_loop(IdealLoopTree *loop, Node_List &old_new); // If Node n lives in the back_ctrl block, we clone a private version of n // in preheader_ctrl block and return that, otherwise return n. Node *clone_up_backedge_goo( Node *back_ctrl, Node *preheader_ctrl, Node *n, VectorSet &visited, Node_Stack &clones );