247 private: |
247 private: |
248 IdealLoopTree* _lpt; // Current loop tree node |
248 IdealLoopTree* _lpt; // Current loop tree node |
249 LoopNode* _lp; // Current LoopNode |
249 LoopNode* _lp; // Current LoopNode |
250 Node* _bb; // Current basic block |
250 Node* _bb; // Current basic block |
251 PhiNode* _iv; // Induction var |
251 PhiNode* _iv; // Induction var |
|
252 bool _race_possible; // In cases where SDMU is true |
252 |
253 |
253 // Accessors |
254 // Accessors |
254 Arena* arena() { return _arena; } |
255 Arena* arena() { return _arena; } |
255 |
256 |
256 Node* bb() { return _bb; } |
257 Node* bb() { return _bb; } |
335 bool are_adjacent_refs(Node* s1, Node* s2); |
336 bool are_adjacent_refs(Node* s1, Node* s2); |
336 // Are s1 and s2 similar? |
337 // Are s1 and s2 similar? |
337 bool isomorphic(Node* s1, Node* s2); |
338 bool isomorphic(Node* s1, Node* s2); |
338 // Is there no data path from s1 to s2 or s2 to s1? |
339 // Is there no data path from s1 to s2 or s2 to s1? |
339 bool independent(Node* s1, Node* s2); |
340 bool independent(Node* s1, Node* s2); |
|
341 // Is there a data path between s1 and s2 and both are reductions? |
|
342 bool reduction(Node* s1, Node* s2); |
340 // Helper for independent |
343 // Helper for independent |
341 bool independent_path(Node* shallow, Node* deep, uint dp=0); |
344 bool independent_path(Node* shallow, Node* deep, uint dp=0); |
342 void set_alignment(Node* s1, Node* s2, int align); |
345 void set_alignment(Node* s1, Node* s2, int align); |
343 int data_size(Node* s); |
346 int data_size(Node* s); |
344 // Extend packset by following use->def and def->use links from pack members. |
347 // Extend packset by following use->def and def->use links from pack members. |
345 void extend_packlist(); |
348 void extend_packlist(); |
346 // Extend the packset by visiting operand definitions of nodes in pack p |
349 // Extend the packset by visiting operand definitions of nodes in pack p |
347 bool follow_use_defs(Node_List* p); |
350 bool follow_use_defs(Node_List* p); |
348 // Extend the packset by visiting uses of nodes in pack p |
351 // Extend the packset by visiting uses of nodes in pack p |
349 bool follow_def_uses(Node_List* p); |
352 bool follow_def_uses(Node_List* p); |
|
353 // For extended packsets, ordinally arrange uses packset by major component |
|
354 void order_def_uses(Node_List* p); |
350 // Estimate the savings from executing s1 and s2 as a pack |
355 // Estimate the savings from executing s1 and s2 as a pack |
351 int est_savings(Node* s1, Node* s2); |
356 int est_savings(Node* s1, Node* s2); |
352 int adjacent_profit(Node* s1, Node* s2); |
357 int adjacent_profit(Node* s1, Node* s2); |
353 int pack_cost(int ct); |
358 int pack_cost(int ct); |
354 int unpack_cost(int ct); |
359 int unpack_cost(int ct); |
417 void print_packset(); |
422 void print_packset(); |
418 void print_pack(Node_List* p); |
423 void print_pack(Node_List* p); |
419 void print_bb(); |
424 void print_bb(); |
420 void print_stmt(Node* s); |
425 void print_stmt(Node* s); |
421 char* blank(uint depth); |
426 char* blank(uint depth); |
422 }; |
427 |
|
428 void packset_sort(int n); |
|
429 }; |
|
430 |
423 |
431 |
424 |
432 |
425 //------------------------------SWPointer--------------------------- |
433 //------------------------------SWPointer--------------------------- |
426 // Information about an address for dependence checking and vector alignment |
434 // Information about an address for dependence checking and vector alignment |
427 class SWPointer VALUE_OBJ_CLASS_SPEC { |
435 class SWPointer VALUE_OBJ_CLASS_SPEC { |