src/share/vm/opto/mathexactnode.hpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/share/vm/opto/mathexactnode.hpp
src/share/vm/opto/mathexactnode.hpp
Print this page
rev 5902 : 8027754: Enable loop optimizations for loops with MathExact inside
*** 25,154 ****
#ifndef SHARE_VM_OPTO_MATHEXACTNODE_HPP
#define SHARE_VM_OPTO_MATHEXACTNODE_HPP
#include "opto/multnode.hpp"
#include "opto/node.hpp"
#include "opto/subnode.hpp"
#include "opto/type.hpp"
- class BoolNode;
- class IfNode;
- class Node;
-
class PhaseGVN;
class PhaseTransform;
! class MathExactNode : public MultiNode {
public:
! MathExactNode(Node* ctrl, Node* in1);
! MathExactNode(Node* ctrl, Node* in1, Node* in2);
! enum {
! result_proj_node = 0,
! flags_proj_node = 1
! };
! virtual int Opcode() const;
! virtual Node* Identity(PhaseTransform* phase) { return this; }
! virtual Node* Ideal(PhaseGVN* phase, bool can_reshape) { return NULL; }
! virtual const Type* Value(PhaseTransform* phase) const { return bottom_type(); }
! virtual uint hash() const { return NO_HASH; }
! virtual bool is_CFG() const { return false; }
! virtual uint ideal_reg() const { return NotAMachineReg; }
! ProjNode* result_node() const { return proj_out(result_proj_node); }
! ProjNode* flags_node() const { return proj_out(flags_proj_node); }
! Node* control_node() const;
! Node* non_throwing_branch() const;
! protected:
! IfNode* if_node() const;
! BoolNode* bool_node() const;
! Node* no_overflow(PhaseGVN *phase, Node* new_result);
! };
!
! class MathExactINode : public MathExactNode {
! public:
! MathExactINode(Node* ctrl, Node* in1) : MathExactNode(ctrl, in1) {}
! MathExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactNode(ctrl, in1, in2) {}
! virtual int Opcode() const;
! virtual Node* match(const ProjNode* proj, const Matcher* m);
! virtual const Type* bottom_type() const { return TypeTuple::INT_CC_PAIR; }
};
! class MathExactLNode : public MathExactNode {
public:
! MathExactLNode(Node* ctrl, Node* in1) : MathExactNode(ctrl, in1) {}
! MathExactLNode(Node* ctrl, Node* in1, Node* in2) : MathExactNode(ctrl, in1, in2) {}
! virtual int Opcode() const;
! virtual Node* match(const ProjNode* proj, const Matcher* m);
! virtual const Type* bottom_type() const { return TypeTuple::LONG_CC_PAIR; }
! };
! class AddExactINode : public MathExactINode {
! public:
! AddExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactINode(ctrl, in1, in2) {}
! virtual int Opcode() const;
! virtual Node *Ideal(PhaseGVN *phase, bool can_reshape);
! };
!
! class AddExactLNode : public MathExactLNode {
! public:
! AddExactLNode(Node* ctrl, Node* in1, Node* in2) : MathExactLNode(ctrl, in1, in2) {}
! virtual int Opcode() const;
virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
};
! class SubExactINode : public MathExactINode {
public:
! SubExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactINode(ctrl, in1, in2) {}
! virtual int Opcode() const;
virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
};
! class SubExactLNode : public MathExactLNode {
public:
! SubExactLNode(Node* ctrl, Node* in1, Node* in2) : MathExactLNode(ctrl, in1, in2) {}
virtual int Opcode() const;
! virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
};
! class NegExactINode : public MathExactINode {
public:
! NegExactINode(Node* ctrl, Node* in1) : MathExactINode(ctrl, in1) {}
virtual int Opcode() const;
! virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
};
! class NegExactLNode : public MathExactLNode {
public:
! NegExactLNode(Node* ctrl, Node* in1) : MathExactLNode(ctrl, in1) {}
virtual int Opcode() const;
! virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
};
! class MulExactINode : public MathExactINode {
public:
! MulExactINode(Node* ctrl, Node* in1, Node* in2) : MathExactINode(ctrl, in1, in2) {}
virtual int Opcode() const;
! virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
};
! class MulExactLNode : public MathExactLNode {
public:
! MulExactLNode(Node* ctrl, Node* in1, Node* in2) : MathExactLNode(ctrl, in1, in2) {}
virtual int Opcode() const;
! virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
};
! class FlagsProjNode : public ProjNode {
public:
! FlagsProjNode(Node* src, uint con) : ProjNode(src, con) {
! init_class_id(Class_FlagsProj);
! }
virtual int Opcode() const;
- virtual bool is_CFG() const { return false; }
- virtual const Type* bottom_type() const { return TypeInt::CC; }
- virtual uint ideal_reg() const { return Op_RegFlags; }
- };
#endif
--- 25,137 ----
#ifndef SHARE_VM_OPTO_MATHEXACTNODE_HPP
#define SHARE_VM_OPTO_MATHEXACTNODE_HPP
#include "opto/multnode.hpp"
#include "opto/node.hpp"
+ #include "opto/addnode.hpp"
#include "opto/subnode.hpp"
#include "opto/type.hpp"
class PhaseGVN;
class PhaseTransform;
! class OverflowNode : public CmpNode {
public:
! OverflowNode(Node* in1, Node* in2) : CmpNode(in1, in2) {}
! virtual uint ideal_reg() const { return Op_RegFlags; }
! virtual const Type* sub(const Type* t1, const Type* t2) const;
};
! class OverflowINode : public OverflowNode {
public:
! typedef TypeInt TypeClass;
! OverflowINode(Node* in1, Node* in2) : OverflowNode(in1, in2) {}
virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
+ virtual const Type* Value(PhaseTransform* phase) const;
+
+ virtual bool will_overflow(jint v1, jint v2) const = 0;
+ virtual bool can_overflow(const Type* t1, const Type* t2) const = 0;
};
!
! class OverflowLNode : public OverflowNode {
public:
! typedef TypeLong TypeClass;
!
! OverflowLNode(Node* in1, Node* in2) : OverflowNode(in1, in2) {}
virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
+ virtual const Type* Value(PhaseTransform* phase) const;
+
+ virtual bool will_overflow(jlong v1, jlong v2) const = 0;
+ virtual bool can_overflow(const Type* t1, const Type* t2) const = 0;
};
! class OverflowAddINode : public OverflowINode {
public:
! typedef AddINode MathOp;
!
! OverflowAddINode(Node* in1, Node* in2) : OverflowINode(in1, in2) {}
virtual int Opcode() const;
!
! virtual bool will_overflow(jint v1, jint v2) const;
! virtual bool can_overflow(const Type* t1, const Type* t2) const;
};
! class OverflowSubINode : public OverflowINode {
public:
! typedef SubINode MathOp;
!
! OverflowSubINode(Node* in1, Node* in2) : OverflowINode(in1, in2) {}
virtual int Opcode() const;
!
! virtual bool will_overflow(jint v1, jint v2) const;
! virtual bool can_overflow(const Type* t1, const Type* t2) const;
};
! class OverflowMulINode : public OverflowINode {
public:
! typedef MulINode MathOp;
!
! OverflowMulINode(Node* in1, Node* in2) : OverflowINode(in1, in2) {}
virtual int Opcode() const;
!
! virtual bool will_overflow(jint v1, jint v2) const;
! virtual bool can_overflow(const Type* t1, const Type* t2) const;
};
! class OverflowAddLNode : public OverflowLNode {
public:
! typedef AddLNode MathOp;
!
! OverflowAddLNode(Node* in1, Node* in2) : OverflowLNode(in1, in2) {}
virtual int Opcode() const;
!
! virtual bool will_overflow(jlong v1, jlong v2) const;
! virtual bool can_overflow(const Type* t1, const Type* t2) const;
};
! class OverflowSubLNode : public OverflowLNode {
public:
! typedef SubLNode MathOp;
!
! OverflowSubLNode(Node* in1, Node* in2) : OverflowLNode(in1, in2) {}
virtual int Opcode() const;
!
! virtual bool will_overflow(jlong v1, jlong v2) const;
! virtual bool can_overflow(const Type* t1, const Type* t2) const;
};
! class OverflowMulLNode : public OverflowLNode {
public:
! typedef MulLNode MathOp;
+ OverflowMulLNode(Node* in1, Node* in2) : OverflowLNode(in1, in2) {}
virtual int Opcode() const;
+ virtual bool will_overflow(jlong v1, jlong v2) const;
+ virtual bool can_overflow(const Type* t1, const Type* t2) const;
+ };
#endif
src/share/vm/opto/mathexactnode.hpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File