comparison src/share/vm/opto/block.hpp @ 3939:f6f3bb0ee072

7088955: add C2 IR support to the SA Reviewed-by: kvn
author never
date Sun, 11 Sep 2011 14:48:24 -0700
parents 95134e034042
children f03a3c8bd5e5
comparison
equal deleted inserted replaced
3938:e6b1331a51d2 3939:f6f3bb0ee072
1 /* 1 /*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
43 // Map dense integer indices to Blocks. Uses classic doubling-array trick. 43 // Map dense integer indices to Blocks. Uses classic doubling-array trick.
44 // Abstractly provides an infinite array of Block*'s, initialized to NULL. 44 // Abstractly provides an infinite array of Block*'s, initialized to NULL.
45 // Note that the constructor just zeros things, and since I use Arena 45 // Note that the constructor just zeros things, and since I use Arena
46 // allocation I do not need a destructor to reclaim storage. 46 // allocation I do not need a destructor to reclaim storage.
47 class Block_Array : public ResourceObj { 47 class Block_Array : public ResourceObj {
48 friend class VMStructs;
48 uint _size; // allocated size, as opposed to formal limit 49 uint _size; // allocated size, as opposed to formal limit
49 debug_only(uint _limit;) // limit to formal domain 50 debug_only(uint _limit;) // limit to formal domain
50 protected: 51 protected:
51 Block **_blocks; 52 Block **_blocks;
52 void grow( uint i ); // Grow array node to fit 53 void grow( uint i ); // Grow array node to fit
70 uint Max() const { debug_only(return _limit); return _size; } 71 uint Max() const { debug_only(return _limit); return _size; }
71 }; 72 };
72 73
73 74
74 class Block_List : public Block_Array { 75 class Block_List : public Block_Array {
76 friend class VMStructs;
75 public: 77 public:
76 uint _cnt; 78 uint _cnt;
77 Block_List() : Block_Array(Thread::current()->resource_area()), _cnt(0) {} 79 Block_List() : Block_Array(Thread::current()->resource_area()), _cnt(0) {}
78 void push( Block *b ) { map(_cnt++,b); } 80 void push( Block *b ) { map(_cnt++,b); }
79 Block *pop() { return _blocks[--_cnt]; } 81 Block *pop() { return _blocks[--_cnt]; }
85 void print(); 87 void print();
86 }; 88 };
87 89
88 90
89 class CFGElement : public ResourceObj { 91 class CFGElement : public ResourceObj {
92 friend class VMStructs;
90 public: 93 public:
91 float _freq; // Execution frequency (estimate) 94 float _freq; // Execution frequency (estimate)
92 95
93 CFGElement() : _freq(0.0f) {} 96 CFGElement() : _freq(0.0f) {}
94 virtual bool is_block() { return false; } 97 virtual bool is_block() { return false; }
100 //------------------------------Block------------------------------------------ 103 //------------------------------Block------------------------------------------
101 // This class defines a Basic Block. 104 // This class defines a Basic Block.
102 // Basic blocks are used during the output routines, and are not used during 105 // Basic blocks are used during the output routines, and are not used during
103 // any optimization pass. They are created late in the game. 106 // any optimization pass. They are created late in the game.
104 class Block : public CFGElement { 107 class Block : public CFGElement {
108 friend class VMStructs;
105 public: 109 public:
106 // Nodes in this block, in order 110 // Nodes in this block, in order
107 Node_List _nodes; 111 Node_List _nodes;
108 112
109 // Basic blocks have a Node which defines Control for all Nodes pinned in 113 // Basic blocks have a Node which defines Control for all Nodes pinned in
339 343
340 344
341 //------------------------------PhaseCFG--------------------------------------- 345 //------------------------------PhaseCFG---------------------------------------
342 // Build an array of Basic Block pointers, one per Node. 346 // Build an array of Basic Block pointers, one per Node.
343 class PhaseCFG : public Phase { 347 class PhaseCFG : public Phase {
348 friend class VMStructs;
344 private: 349 private:
345 // Build a proper looking cfg. Return count of basic blocks 350 // Build a proper looking cfg. Return count of basic blocks
346 uint build_cfg(); 351 uint build_cfg();
347 352
348 // Perform DFS search. 353 // Perform DFS search.
513 float get_prob() const { return _prob; } 518 float get_prob() const { return _prob; }
514 }; 519 };
515 520
516 //------------------------------CFGLoop------------------------------------------- 521 //------------------------------CFGLoop-------------------------------------------
517 class CFGLoop : public CFGElement { 522 class CFGLoop : public CFGElement {
523 friend class VMStructs;
518 int _id; 524 int _id;
519 int _depth; 525 int _depth;
520 CFGLoop *_parent; // root of loop tree is the method level "pseudo" loop, it's parent is null 526 CFGLoop *_parent; // root of loop tree is the method level "pseudo" loop, it's parent is null
521 CFGLoop *_sibling; // null terminated list 527 CFGLoop *_sibling; // null terminated list
522 CFGLoop *_child; // first child, use child's sibling to visit all immediately nested loops 528 CFGLoop *_child; // first child, use child's sibling to visit all immediately nested loops
564 570
565 //----------------------------------CFGEdge------------------------------------ 571 //----------------------------------CFGEdge------------------------------------
566 // A edge between two basic blocks that will be embodied by a branch or a 572 // A edge between two basic blocks that will be embodied by a branch or a
567 // fall-through. 573 // fall-through.
568 class CFGEdge : public ResourceObj { 574 class CFGEdge : public ResourceObj {
575 friend class VMStructs;
569 private: 576 private:
570 Block * _from; // Source basic block 577 Block * _from; // Source basic block
571 Block * _to; // Destination basic block 578 Block * _to; // Destination basic block
572 float _freq; // Execution frequency (estimate) 579 float _freq; // Execution frequency (estimate)
573 int _state; 580 int _state;
700 }; 707 };
701 708
702 //------------------------------PhaseBlockLayout------------------------------- 709 //------------------------------PhaseBlockLayout-------------------------------
703 // Rearrange blocks into some canonical order, based on edges and their frequencies 710 // Rearrange blocks into some canonical order, based on edges and their frequencies
704 class PhaseBlockLayout : public Phase { 711 class PhaseBlockLayout : public Phase {
712 friend class VMStructs;
705 PhaseCFG &_cfg; // Control flow graph 713 PhaseCFG &_cfg; // Control flow graph
706 714
707 GrowableArray<CFGEdge *> *edges; 715 GrowableArray<CFGEdge *> *edges;
708 Trace **traces; 716 Trace **traces;
709 Block **next; 717 Block **next;