746 }; |
746 }; |
747 |
747 |
748 //------------------------------StrComp------------------------------------- |
748 //------------------------------StrComp------------------------------------- |
749 class StrCompNode: public Node { |
749 class StrCompNode: public Node { |
750 public: |
750 public: |
751 StrCompNode(Node *control, |
751 StrCompNode(Node* control, Node* char_array_mem, |
752 Node* char_array_mem, |
752 Node* s1, Node* c1, |
753 Node* value_mem, |
753 Node* s2, Node* c2): Node(control, char_array_mem, |
754 Node* count_mem, |
754 s1, c1, |
755 Node* offset_mem, |
755 s2, c2) {}; |
756 Node* s1, Node* s2): Node(control, |
|
757 char_array_mem, |
|
758 value_mem, |
|
759 count_mem, |
|
760 offset_mem, |
|
761 s1, s2) {}; |
|
762 virtual int Opcode() const; |
756 virtual int Opcode() const; |
763 virtual bool depends_only_on_test() const { return false; } |
757 virtual bool depends_only_on_test() const { return false; } |
764 virtual const Type* bottom_type() const { return TypeInt::INT; } |
758 virtual const Type* bottom_type() const { return TypeInt::INT; } |
765 // a StrCompNode (conservatively) aliases with everything: |
759 virtual const TypePtr* adr_type() const { return TypeAryPtr::CHARS; } |
766 virtual const TypePtr* adr_type() const { return TypePtr::BOTTOM; } |
|
767 virtual uint match_edge(uint idx) const; |
760 virtual uint match_edge(uint idx) const; |
768 virtual uint ideal_reg() const { return Op_RegI; } |
761 virtual uint ideal_reg() const { return Op_RegI; } |
769 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); |
762 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); |
770 }; |
763 }; |
771 |
764 |
772 //------------------------------StrEquals------------------------------------- |
765 //------------------------------StrEquals------------------------------------- |
773 class StrEqualsNode: public Node { |
766 class StrEqualsNode: public Node { |
774 public: |
767 public: |
775 StrEqualsNode(Node *control, |
768 StrEqualsNode(Node* control, Node* char_array_mem, |
776 Node* char_array_mem, |
769 Node* s1, Node* s2, Node* c): Node(control, char_array_mem, |
777 Node* value_mem, |
770 s1, s2, c) {}; |
778 Node* count_mem, |
|
779 Node* offset_mem, |
|
780 Node* s1, Node* s2): Node(control, |
|
781 char_array_mem, |
|
782 value_mem, |
|
783 count_mem, |
|
784 offset_mem, |
|
785 s1, s2) {}; |
|
786 virtual int Opcode() const; |
|
787 virtual bool depends_only_on_test() const { return false; } |
|
788 virtual const Type* bottom_type() const { return TypeInt::BOOL; } |
|
789 // a StrEqualsNode (conservatively) aliases with everything: |
|
790 virtual const TypePtr* adr_type() const { return TypePtr::BOTTOM; } |
|
791 virtual uint match_edge(uint idx) const; |
|
792 virtual uint ideal_reg() const { return Op_RegI; } |
|
793 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); |
|
794 }; |
|
795 |
|
796 //------------------------------StrIndexOf------------------------------------- |
|
797 class StrIndexOfNode: public Node { |
|
798 public: |
|
799 StrIndexOfNode(Node *control, |
|
800 Node* char_array_mem, |
|
801 Node* value_mem, |
|
802 Node* count_mem, |
|
803 Node* offset_mem, |
|
804 Node* s1, Node* s2): Node(control, |
|
805 char_array_mem, |
|
806 value_mem, |
|
807 count_mem, |
|
808 offset_mem, |
|
809 s1, s2) {}; |
|
810 virtual int Opcode() const; |
|
811 virtual bool depends_only_on_test() const { return false; } |
|
812 virtual const Type* bottom_type() const { return TypeInt::INT; } |
|
813 // a StrIndexOfNode (conservatively) aliases with everything: |
|
814 virtual const TypePtr* adr_type() const { return TypePtr::BOTTOM; } |
|
815 virtual uint match_edge(uint idx) const; |
|
816 virtual uint ideal_reg() const { return Op_RegI; } |
|
817 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); |
|
818 }; |
|
819 |
|
820 //------------------------------AryEq--------------------------------------- |
|
821 class AryEqNode: public Node { |
|
822 public: |
|
823 AryEqNode(Node *control, Node* s1, Node* s2): Node(control, s1, s2) {}; |
|
824 virtual int Opcode() const; |
771 virtual int Opcode() const; |
825 virtual bool depends_only_on_test() const { return false; } |
772 virtual bool depends_only_on_test() const { return false; } |
826 virtual const Type* bottom_type() const { return TypeInt::BOOL; } |
773 virtual const Type* bottom_type() const { return TypeInt::BOOL; } |
827 virtual const TypePtr* adr_type() const { return TypeAryPtr::CHARS; } |
774 virtual const TypePtr* adr_type() const { return TypeAryPtr::CHARS; } |
|
775 virtual uint match_edge(uint idx) const; |
|
776 virtual uint ideal_reg() const { return Op_RegI; } |
|
777 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); |
|
778 }; |
|
779 |
|
780 //------------------------------StrIndexOf------------------------------------- |
|
781 class StrIndexOfNode: public Node { |
|
782 public: |
|
783 StrIndexOfNode(Node* control, Node* char_array_mem, |
|
784 Node* s1, Node* c1, |
|
785 Node* s2, Node* c2): Node(control, char_array_mem, |
|
786 s1, c1, |
|
787 s2, c2) {}; |
|
788 virtual int Opcode() const; |
|
789 virtual bool depends_only_on_test() const { return false; } |
|
790 virtual const Type* bottom_type() const { return TypeInt::INT; } |
|
791 virtual const TypePtr* adr_type() const { return TypeAryPtr::CHARS; } |
|
792 virtual uint match_edge(uint idx) const; |
|
793 virtual uint ideal_reg() const { return Op_RegI; } |
|
794 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); |
|
795 }; |
|
796 |
|
797 //------------------------------AryEq--------------------------------------- |
|
798 class AryEqNode: public Node { |
|
799 public: |
|
800 AryEqNode(Node* control, Node* char_array_mem, |
|
801 Node* s1, Node* s2): Node(control, char_array_mem, s1, s2) {}; |
|
802 virtual int Opcode() const; |
|
803 virtual bool depends_only_on_test() const { return false; } |
|
804 virtual const Type* bottom_type() const { return TypeInt::BOOL; } |
|
805 virtual const TypePtr* adr_type() const { return TypeAryPtr::CHARS; } |
|
806 virtual uint match_edge(uint idx) const; |
828 virtual uint ideal_reg() const { return Op_RegI; } |
807 virtual uint ideal_reg() const { return Op_RegI; } |
829 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); |
808 virtual Node *Ideal(PhaseGVN *phase, bool can_reshape); |
830 }; |
809 }; |
831 |
810 |
832 //------------------------------MemBar----------------------------------------- |
811 //------------------------------MemBar----------------------------------------- |