Mercurial > hg > graal-compiler
comparison src/share/vm/opto/node.hpp @ 3842:c7b60b601eb4
7069452: Cleanup NodeFlags
Summary: Remove flags which duplicate information in Node::NodeClasses.
Reviewed-by: never
author | kvn |
---|---|
date | Wed, 27 Jul 2011 17:28:36 -0700 |
parents | e3cbc9ddd434 |
children | 95134e034042 |
comparison
equal
deleted
inserted
replaced
3841:0f34fdee809e | 3842:c7b60b601eb4 |
---|---|
65 class DecodeNNode; | 65 class DecodeNNode; |
66 class EncodePNode; | 66 class EncodePNode; |
67 class FastLockNode; | 67 class FastLockNode; |
68 class FastUnlockNode; | 68 class FastUnlockNode; |
69 class IfNode; | 69 class IfNode; |
70 class IfFalseNode; | |
71 class IfTrueNode; | |
70 class InitializeNode; | 72 class InitializeNode; |
71 class JVMState; | 73 class JVMState; |
72 class JumpNode; | 74 class JumpNode; |
73 class JumpProjNode; | 75 class JumpProjNode; |
74 class LoadNode; | 76 class LoadNode; |
81 class MachCallNode; | 83 class MachCallNode; |
82 class MachCallRuntimeNode; | 84 class MachCallRuntimeNode; |
83 class MachCallStaticJavaNode; | 85 class MachCallStaticJavaNode; |
84 class MachConstantBaseNode; | 86 class MachConstantBaseNode; |
85 class MachConstantNode; | 87 class MachConstantNode; |
88 class MachGotoNode; | |
86 class MachIfNode; | 89 class MachIfNode; |
87 class MachNode; | 90 class MachNode; |
88 class MachNullCheckNode; | 91 class MachNullCheckNode; |
92 class MachProjNode; | |
89 class MachReturnNode; | 93 class MachReturnNode; |
90 class MachSafePointNode; | 94 class MachSafePointNode; |
91 class MachSpillCopyNode; | 95 class MachSpillCopyNode; |
92 class MachTempNode; | 96 class MachTempNode; |
93 class Matcher; | 97 class Matcher; |
94 class MemBarNode; | 98 class MemBarNode; |
95 class MemNode; | 99 class MemNode; |
96 class MergeMemNode; | 100 class MergeMemNode; |
97 class MulNode; | |
98 class MultiNode; | 101 class MultiNode; |
99 class MultiBranchNode; | 102 class MultiBranchNode; |
100 class NeverBranchNode; | 103 class NeverBranchNode; |
101 class Node; | 104 class Node; |
102 class Node_Array; | 105 class Node_Array; |
125 class StoreNode; | 128 class StoreNode; |
126 class SubNode; | 129 class SubNode; |
127 class Type; | 130 class Type; |
128 class TypeNode; | 131 class TypeNode; |
129 class UnlockNode; | 132 class UnlockNode; |
133 class VectorNode; | |
134 class VectorLoadNode; | |
135 class VectorStoreNode; | |
130 class VectorSet; | 136 class VectorSet; |
131 class IfTrueNode; | |
132 class IfFalseNode; | |
133 typedef void (*NFunc)(Node&,void*); | 137 typedef void (*NFunc)(Node&,void*); |
134 extern "C" { | 138 extern "C" { |
135 typedef int (*C_sort_func_t)(const void *, const void *); | 139 typedef int (*C_sort_func_t)(const void *, const void *); |
136 } | 140 } |
137 | 141 |
572 DEFINE_CLASS_ID(MachNullCheck, Mach, 2) | 576 DEFINE_CLASS_ID(MachNullCheck, Mach, 2) |
573 DEFINE_CLASS_ID(MachIf, Mach, 3) | 577 DEFINE_CLASS_ID(MachIf, Mach, 3) |
574 DEFINE_CLASS_ID(MachTemp, Mach, 4) | 578 DEFINE_CLASS_ID(MachTemp, Mach, 4) |
575 DEFINE_CLASS_ID(MachConstantBase, Mach, 5) | 579 DEFINE_CLASS_ID(MachConstantBase, Mach, 5) |
576 DEFINE_CLASS_ID(MachConstant, Mach, 6) | 580 DEFINE_CLASS_ID(MachConstant, Mach, 6) |
577 | 581 DEFINE_CLASS_ID(MachGoto, Mach, 7) |
578 DEFINE_CLASS_ID(Proj, Node, 2) | 582 |
579 DEFINE_CLASS_ID(CatchProj, Proj, 0) | 583 DEFINE_CLASS_ID(Type, Node, 2) |
580 DEFINE_CLASS_ID(JumpProj, Proj, 1) | |
581 DEFINE_CLASS_ID(IfTrue, Proj, 2) | |
582 DEFINE_CLASS_ID(IfFalse, Proj, 3) | |
583 DEFINE_CLASS_ID(Parm, Proj, 4) | |
584 | |
585 DEFINE_CLASS_ID(Region, Node, 3) | |
586 DEFINE_CLASS_ID(Loop, Region, 0) | |
587 DEFINE_CLASS_ID(Root, Loop, 0) | |
588 DEFINE_CLASS_ID(CountedLoop, Loop, 1) | |
589 | |
590 DEFINE_CLASS_ID(Sub, Node, 4) | |
591 DEFINE_CLASS_ID(Cmp, Sub, 0) | |
592 DEFINE_CLASS_ID(FastLock, Cmp, 0) | |
593 DEFINE_CLASS_ID(FastUnlock, Cmp, 1) | |
594 | |
595 DEFINE_CLASS_ID(Type, Node, 5) | |
596 DEFINE_CLASS_ID(Phi, Type, 0) | 584 DEFINE_CLASS_ID(Phi, Type, 0) |
597 DEFINE_CLASS_ID(ConstraintCast, Type, 1) | 585 DEFINE_CLASS_ID(ConstraintCast, Type, 1) |
598 DEFINE_CLASS_ID(CheckCastPP, Type, 2) | 586 DEFINE_CLASS_ID(CheckCastPP, Type, 2) |
599 DEFINE_CLASS_ID(CMove, Type, 3) | 587 DEFINE_CLASS_ID(CMove, Type, 3) |
600 DEFINE_CLASS_ID(SafePointScalarObject, Type, 4) | 588 DEFINE_CLASS_ID(SafePointScalarObject, Type, 4) |
601 DEFINE_CLASS_ID(DecodeN, Type, 5) | 589 DEFINE_CLASS_ID(DecodeN, Type, 5) |
602 DEFINE_CLASS_ID(EncodeP, Type, 6) | 590 DEFINE_CLASS_ID(EncodeP, Type, 6) |
603 | 591 |
604 DEFINE_CLASS_ID(Mem, Node, 6) | 592 DEFINE_CLASS_ID(Proj, Node, 3) |
593 DEFINE_CLASS_ID(CatchProj, Proj, 0) | |
594 DEFINE_CLASS_ID(JumpProj, Proj, 1) | |
595 DEFINE_CLASS_ID(IfTrue, Proj, 2) | |
596 DEFINE_CLASS_ID(IfFalse, Proj, 3) | |
597 DEFINE_CLASS_ID(Parm, Proj, 4) | |
598 DEFINE_CLASS_ID(MachProj, Proj, 5) | |
599 | |
600 DEFINE_CLASS_ID(Mem, Node, 4) | |
605 DEFINE_CLASS_ID(Load, Mem, 0) | 601 DEFINE_CLASS_ID(Load, Mem, 0) |
602 DEFINE_CLASS_ID(VectorLoad, Load, 0) | |
606 DEFINE_CLASS_ID(Store, Mem, 1) | 603 DEFINE_CLASS_ID(Store, Mem, 1) |
604 DEFINE_CLASS_ID(VectorStore, Store, 0) | |
607 DEFINE_CLASS_ID(LoadStore, Mem, 2) | 605 DEFINE_CLASS_ID(LoadStore, Mem, 2) |
606 | |
607 DEFINE_CLASS_ID(Region, Node, 5) | |
608 DEFINE_CLASS_ID(Loop, Region, 0) | |
609 DEFINE_CLASS_ID(Root, Loop, 0) | |
610 DEFINE_CLASS_ID(CountedLoop, Loop, 1) | |
611 | |
612 DEFINE_CLASS_ID(Sub, Node, 6) | |
613 DEFINE_CLASS_ID(Cmp, Sub, 0) | |
614 DEFINE_CLASS_ID(FastLock, Cmp, 0) | |
615 DEFINE_CLASS_ID(FastUnlock, Cmp, 1) | |
608 | 616 |
609 DEFINE_CLASS_ID(MergeMem, Node, 7) | 617 DEFINE_CLASS_ID(MergeMem, Node, 7) |
610 DEFINE_CLASS_ID(Bool, Node, 8) | 618 DEFINE_CLASS_ID(Bool, Node, 8) |
611 DEFINE_CLASS_ID(AddP, Node, 9) | 619 DEFINE_CLASS_ID(AddP, Node, 9) |
612 DEFINE_CLASS_ID(BoxLock, Node, 10) | 620 DEFINE_CLASS_ID(BoxLock, Node, 10) |
613 DEFINE_CLASS_ID(Add, Node, 11) | 621 DEFINE_CLASS_ID(Add, Node, 11) |
614 DEFINE_CLASS_ID(Mul, Node, 12) | 622 DEFINE_CLASS_ID(Vector, Node, 12) |
615 DEFINE_CLASS_ID(ClearArray, Node, 13) | 623 DEFINE_CLASS_ID(ClearArray, Node, 13) |
616 | 624 |
617 _max_classes = ClassMask_ClearArray | 625 _max_classes = ClassMask_ClearArray |
618 }; | 626 }; |
619 #undef DEFINE_CLASS_ID | 627 #undef DEFINE_CLASS_ID |
620 | 628 |
621 // Flags are sorted by usage frequency. | 629 // Flags are sorted by usage frequency. |
622 enum NodeFlags { | 630 enum NodeFlags { |
623 Flag_is_Copy = 0x01, // should be first bit to avoid shift | 631 Flag_is_Copy = 0x01, // should be first bit to avoid shift |
624 Flag_is_Call = Flag_is_Copy << 1, | 632 Flag_rematerialize = Flag_is_Copy << 1, |
625 Flag_rematerialize = Flag_is_Call << 1, | |
626 Flag_needs_anti_dependence_check = Flag_rematerialize << 1, | 633 Flag_needs_anti_dependence_check = Flag_rematerialize << 1, |
627 Flag_is_macro = Flag_needs_anti_dependence_check << 1, | 634 Flag_is_macro = Flag_needs_anti_dependence_check << 1, |
628 Flag_is_Con = Flag_is_macro << 1, | 635 Flag_is_Con = Flag_is_macro << 1, |
629 Flag_is_cisc_alternate = Flag_is_Con << 1, | 636 Flag_is_cisc_alternate = Flag_is_Con << 1, |
630 Flag_is_Branch = Flag_is_cisc_alternate << 1, | 637 Flag_is_Branch = Flag_is_cisc_alternate << 1, |
631 Flag_is_block_start = Flag_is_Branch << 1, | 638 Flag_is_dead_loop_safe = Flag_is_Branch << 1, |
632 Flag_is_Goto = Flag_is_block_start << 1, | |
633 Flag_is_dead_loop_safe = Flag_is_Goto << 1, | |
634 Flag_may_be_short_branch = Flag_is_dead_loop_safe << 1, | 639 Flag_may_be_short_branch = Flag_is_dead_loop_safe << 1, |
635 Flag_is_safepoint_node = Flag_may_be_short_branch << 1, | 640 _max_flags = (Flag_may_be_short_branch << 1) - 1 // allow flags combination |
636 Flag_is_pc_relative = Flag_is_safepoint_node << 1, | |
637 Flag_is_Vector = Flag_is_pc_relative << 1, | |
638 _max_flags = (Flag_is_Vector << 1) - 1 // allow flags combination | |
639 }; | 641 }; |
640 | 642 |
641 private: | 643 private: |
642 jushort _class_id; | 644 jushort _class_id; |
643 jushort _flags; | 645 jushort _flags; |
667 | 669 |
668 // Virtual inherited Node size | 670 // Virtual inherited Node size |
669 virtual uint size_of() const; | 671 virtual uint size_of() const; |
670 | 672 |
671 // Other interesting Node properties | 673 // Other interesting Node properties |
672 | |
673 // Special case: is_Call() returns true for both CallNode and MachCallNode. | |
674 bool is_Call() const { | |
675 return (_flags & Flag_is_Call) != 0; | |
676 } | |
677 | |
678 CallNode* isa_Call() const { | |
679 return is_Call() ? as_Call() : NULL; | |
680 } | |
681 | |
682 CallNode *as_Call() const { // Only for CallNode (not for MachCallNode) | |
683 assert((_class_id & ClassMask_Call) == Class_Call, "invalid node class"); | |
684 return (CallNode*)this; | |
685 } | |
686 | |
687 #define DEFINE_CLASS_QUERY(type) \ | 674 #define DEFINE_CLASS_QUERY(type) \ |
688 bool is_##type() const { \ | 675 bool is_##type() const { \ |
689 return ((_class_id & ClassMask_##type) == Class_##type); \ | 676 return ((_class_id & ClassMask_##type) == Class_##type); \ |
690 } \ | 677 } \ |
691 type##Node *as_##type() const { \ | 678 type##Node *as_##type() const { \ |
701 DEFINE_CLASS_QUERY(AddP) | 688 DEFINE_CLASS_QUERY(AddP) |
702 DEFINE_CLASS_QUERY(Allocate) | 689 DEFINE_CLASS_QUERY(Allocate) |
703 DEFINE_CLASS_QUERY(AllocateArray) | 690 DEFINE_CLASS_QUERY(AllocateArray) |
704 DEFINE_CLASS_QUERY(Bool) | 691 DEFINE_CLASS_QUERY(Bool) |
705 DEFINE_CLASS_QUERY(BoxLock) | 692 DEFINE_CLASS_QUERY(BoxLock) |
693 DEFINE_CLASS_QUERY(Call) | |
706 DEFINE_CLASS_QUERY(CallDynamicJava) | 694 DEFINE_CLASS_QUERY(CallDynamicJava) |
707 DEFINE_CLASS_QUERY(CallJava) | 695 DEFINE_CLASS_QUERY(CallJava) |
708 DEFINE_CLASS_QUERY(CallLeaf) | 696 DEFINE_CLASS_QUERY(CallLeaf) |
709 DEFINE_CLASS_QUERY(CallRuntime) | 697 DEFINE_CLASS_QUERY(CallRuntime) |
710 DEFINE_CLASS_QUERY(CallStaticJava) | 698 DEFINE_CLASS_QUERY(CallStaticJava) |
738 DEFINE_CLASS_QUERY(MachCallLeaf) | 726 DEFINE_CLASS_QUERY(MachCallLeaf) |
739 DEFINE_CLASS_QUERY(MachCallRuntime) | 727 DEFINE_CLASS_QUERY(MachCallRuntime) |
740 DEFINE_CLASS_QUERY(MachCallStaticJava) | 728 DEFINE_CLASS_QUERY(MachCallStaticJava) |
741 DEFINE_CLASS_QUERY(MachConstantBase) | 729 DEFINE_CLASS_QUERY(MachConstantBase) |
742 DEFINE_CLASS_QUERY(MachConstant) | 730 DEFINE_CLASS_QUERY(MachConstant) |
731 DEFINE_CLASS_QUERY(MachGoto) | |
743 DEFINE_CLASS_QUERY(MachIf) | 732 DEFINE_CLASS_QUERY(MachIf) |
744 DEFINE_CLASS_QUERY(MachNullCheck) | 733 DEFINE_CLASS_QUERY(MachNullCheck) |
734 DEFINE_CLASS_QUERY(MachProj) | |
745 DEFINE_CLASS_QUERY(MachReturn) | 735 DEFINE_CLASS_QUERY(MachReturn) |
746 DEFINE_CLASS_QUERY(MachSafePoint) | 736 DEFINE_CLASS_QUERY(MachSafePoint) |
747 DEFINE_CLASS_QUERY(MachSpillCopy) | 737 DEFINE_CLASS_QUERY(MachSpillCopy) |
748 DEFINE_CLASS_QUERY(MachTemp) | 738 DEFINE_CLASS_QUERY(MachTemp) |
749 DEFINE_CLASS_QUERY(Mem) | 739 DEFINE_CLASS_QUERY(Mem) |
750 DEFINE_CLASS_QUERY(MemBar) | 740 DEFINE_CLASS_QUERY(MemBar) |
751 DEFINE_CLASS_QUERY(MergeMem) | 741 DEFINE_CLASS_QUERY(MergeMem) |
752 DEFINE_CLASS_QUERY(Mul) | |
753 DEFINE_CLASS_QUERY(Multi) | 742 DEFINE_CLASS_QUERY(Multi) |
754 DEFINE_CLASS_QUERY(MultiBranch) | 743 DEFINE_CLASS_QUERY(MultiBranch) |
755 DEFINE_CLASS_QUERY(Parm) | 744 DEFINE_CLASS_QUERY(Parm) |
756 DEFINE_CLASS_QUERY(PCTable) | 745 DEFINE_CLASS_QUERY(PCTable) |
757 DEFINE_CLASS_QUERY(Phi) | 746 DEFINE_CLASS_QUERY(Phi) |
762 DEFINE_CLASS_QUERY(SafePointScalarObject) | 751 DEFINE_CLASS_QUERY(SafePointScalarObject) |
763 DEFINE_CLASS_QUERY(Start) | 752 DEFINE_CLASS_QUERY(Start) |
764 DEFINE_CLASS_QUERY(Store) | 753 DEFINE_CLASS_QUERY(Store) |
765 DEFINE_CLASS_QUERY(Sub) | 754 DEFINE_CLASS_QUERY(Sub) |
766 DEFINE_CLASS_QUERY(Type) | 755 DEFINE_CLASS_QUERY(Type) |
756 DEFINE_CLASS_QUERY(Vector) | |
757 DEFINE_CLASS_QUERY(VectorLoad) | |
758 DEFINE_CLASS_QUERY(VectorStore) | |
767 DEFINE_CLASS_QUERY(Unlock) | 759 DEFINE_CLASS_QUERY(Unlock) |
768 | 760 |
769 #undef DEFINE_CLASS_QUERY | 761 #undef DEFINE_CLASS_QUERY |
770 | 762 |
771 // duplicate of is_MachSpillCopy() | 763 // duplicate of is_MachSpillCopy() |
772 bool is_SpillCopy () const { | 764 bool is_SpillCopy () const { |
773 return ((_class_id & ClassMask_MachSpillCopy) == Class_MachSpillCopy); | 765 return ((_class_id & ClassMask_MachSpillCopy) == Class_MachSpillCopy); |
774 } | 766 } |
775 | 767 |
776 bool is_Con () const { return (_flags & Flag_is_Con) != 0; } | 768 bool is_Con () const { return (_flags & Flag_is_Con) != 0; } |
777 bool is_Goto() const { return (_flags & Flag_is_Goto) != 0; } | |
778 // The data node which is safe to leave in dead loop during IGVN optimization. | 769 // The data node which is safe to leave in dead loop during IGVN optimization. |
779 bool is_dead_loop_safe() const { | 770 bool is_dead_loop_safe() const { |
780 return is_Phi() || (is_Proj() && in(0) == NULL) || | 771 return is_Phi() || (is_Proj() && in(0) == NULL) || |
781 ((_flags & (Flag_is_dead_loop_safe | Flag_is_Con)) != 0 && | 772 ((_flags & (Flag_is_dead_loop_safe | Flag_is_Con)) != 0 && |
782 (!is_Proj() || !in(0)->is_Allocate())); | 773 (!is_Proj() || !in(0)->is_Allocate())); |
793 // depend for their correct sequencing on more than one test. | 784 // depend for their correct sequencing on more than one test. |
794 // (In that case, hoisting to a dominating test may silently | 785 // (In that case, hoisting to a dominating test may silently |
795 // skip some other important test.) | 786 // skip some other important test.) |
796 virtual bool depends_only_on_test() const { assert(!is_CFG(), ""); return true; }; | 787 virtual bool depends_only_on_test() const { assert(!is_CFG(), ""); return true; }; |
797 | 788 |
798 // defined for MachNodes that match 'If' | 'Goto' | 'CountedLoopEnd' | 789 // defined for MachNodes that match 'If' | 'Goto' | 'CountedLoopEnd' | 'Jump' |
799 bool is_Branch() const { return (_flags & Flag_is_Branch) != 0; } | 790 bool is_Branch() const { return (_flags & Flag_is_Branch) != 0; } |
800 | 791 |
801 // When building basic blocks, I need to have a notion of block beginning | 792 // When building basic blocks, I need to have a notion of block beginning |
802 // Nodes, next block selector Nodes (block enders), and next block | 793 // Nodes, next block selector Nodes (block enders), and next block |
803 // projections. These calls need to work on their machine equivalents. The | 794 // projections. These calls need to work on their machine equivalents. The |
804 // Ideal beginning Nodes are RootNode, RegionNode and StartNode. | 795 // Ideal beginning Nodes are RootNode, RegionNode and StartNode. |
805 bool is_block_start() const { | 796 bool is_block_start() const { |
806 if ( is_Region() ) | 797 if ( is_Region() ) |
807 return this == (const Node*)in(0); | 798 return this == (const Node*)in(0); |
808 else | 799 else |
809 return (_flags & Flag_is_block_start) != 0; | 800 return is_Start(); |
810 } | 801 } |
811 | 802 |
812 // The Ideal control projection Nodes are IfTrue/IfFalse, JumpProjNode, Root, | 803 // The Ideal control projection Nodes are IfTrue/IfFalse, JumpProjNode, Root, |
813 // Goto and Return. This call also returns the block ending Node. | 804 // Goto and Return. This call also returns the block ending Node. |
814 virtual const Node *is_block_proj() const; | 805 virtual const Node *is_block_proj() const; |
815 | 806 |
816 // The node is a "macro" node which needs to be expanded before matching | 807 // The node is a "macro" node which needs to be expanded before matching |
817 bool is_macro() const { return (_flags & Flag_is_macro) != 0; } | 808 bool is_macro() const { return (_flags & Flag_is_macro) != 0; } |
818 | |
819 // Value is a vector of primitive values | |
820 bool is_Vector() const { return (_flags & Flag_is_Vector) != 0; } | |
821 | 809 |
822 //----------------- Optimization | 810 //----------------- Optimization |
823 | 811 |
824 // Get the worst-case Type output for this Node. | 812 // Get the worst-case Type output for this Node. |
825 virtual const class Type *bottom_type() const; | 813 virtual const class Type *bottom_type() const; |