< prev index next > src/hotspot/share/opto/loopnode.hpp
Print this page
HasAtomicPostLoop = 1<<11,
StripMined = 1<<12,
SubwordLoop = 1<<13,
ProfileTripFailed = 1<<14,
LoopNestInnerLoop = 1<<15,
- LoopNestLongOuterLoop = 1<<16 };
+ LoopNestLongOuterLoop = 1<<16,
+ FlatArrays = 1<<17};
char _unswitch_count;
enum { _unswitch_max=3 };
// Expected trip count from profile data
float _profile_trip_cnt;
bool is_strip_mined() const { return _loop_flags & StripMined; }
bool is_profile_trip_failed() const { return _loop_flags & ProfileTripFailed; }
bool is_subword_loop() const { return _loop_flags & SubwordLoop; }
bool is_loop_nest_inner_loop() const { return _loop_flags & LoopNestInnerLoop; }
bool is_loop_nest_outer_loop() const { return _loop_flags & LoopNestLongOuterLoop; }
+ bool is_flat_arrays() const { return _loop_flags & FlatArrays; }
void mark_partial_peel_failed() { _loop_flags |= PartialPeelFailed; }
void mark_was_slp() { _loop_flags |= WasSlpAnalyzed; }
void mark_passed_slp() { _loop_flags |= PassedSlpAnalysis; }
void mark_do_unroll_only() { _loop_flags |= DoUnrollOnly; }
void clear_strip_mined() { _loop_flags &= ~StripMined; }
void mark_profile_trip_failed() { _loop_flags |= ProfileTripFailed; }
void mark_subword_loop() { _loop_flags |= SubwordLoop; }
void mark_loop_nest_inner_loop() { _loop_flags |= LoopNestInnerLoop; }
void mark_loop_nest_outer_loop() { _loop_flags |= LoopNestLongOuterLoop; }
+ void mark_flat_arrays() { _loop_flags |= FlatArrays; }
int unswitch_max() { return _unswitch_max; }
int unswitch_count() { return _unswitch_count; }
void set_unswitch_count(int val) {
// Create a slow version of the loop by cloning the loop
// and inserting an if to select fast-slow versions.
// Return the inserted if.
IfNode* create_slow_version_of_loop(IdealLoopTree *loop,
- Node_List &old_new,
- IfNode* unswitch_iff,
- CloneLoopMode mode);
+ Node_List &old_new,
+ Node_List &unswitch_iffs,
+ CloneLoopMode mode);
// Clone a loop and return the clone head (clone_loop_head).
// Added nodes include int(1), int(0) - disconnected, If, IfTrue, IfFalse,
// This routine was created for usage in CountedLoopReserveKit.
//
// insert a clone of the test that selects which version to
// execute.
void do_unswitching (IdealLoopTree *loop, Node_List &old_new);
// Find candidate "if" for unswitching
- IfNode* find_unswitching_candidate(const IdealLoopTree *loop) const;
+ IfNode* find_unswitching_candidate(const IdealLoopTree *loop, Node_List& unswitch_iffs) const;
// Range Check Elimination uses this function!
// Constrain the main loop iterations so the affine function:
// low_limit <= scale_con * I + offset < upper_limit
// always holds true. That is, either increase the number of iterations in
bool split_up( Node *n, Node *blk1, Node *blk2 );
void sink_use( Node *use, Node *post_loop );
Node* place_outside_loop(Node* useblock, IdealLoopTree* loop) const;
Node* try_move_store_before_loop(Node* n, Node *n_ctrl);
void try_move_store_after_loop(Node* n);
+ void move_flat_array_check_out_of_loop(Node* n);
bool identical_backtoback_ifs(Node *n);
+ bool flat_array_element_type_check(Node *n);
bool can_split_if(Node *n_ctrl);
bool cannot_split_division(const Node* n, const Node* region) const;
static bool is_divisor_counted_loop_phi(const Node* divisor, const Node* loop);
bool loop_phi_backedge_type_contains_zero(const Node* phi_divisor, const Type* zero) const;
< prev index next >