diff options
author | 2014-09-18 15:25:07 +0100 | |
---|---|---|
committer | 2014-09-18 15:25:07 +0100 | |
commit | 556c3d193134f6461f3e1fe17c032b087c5931a0 (patch) | |
tree | 436660c7155d0864c37f8aeabbc0f52e889a0cc2 /compiler/optimizing/nodes.h | |
parent | 6aa606c9284ac31961f4c5b20c3645ac78acfaad (diff) |
Initiate a constant propagation pass in the optimizing compiler.
- Perform constant folding on int and long additions and subtractions in
the optimizing compiler.
- Apply constant folding to conditions and comparisons.
Change-Id: Ic88783a3c975fda777c74c531e257fa777be42eb
Diffstat (limited to 'compiler/optimizing/nodes.h')
-rw-r--r-- | compiler/optimizing/nodes.h | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index b012cef3da..10d471c049 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -1007,6 +1007,15 @@ class HBinaryOperation : public HExpression<2> { virtual bool CanBeMoved() const { return true; } virtual bool InstructionDataEquals(HInstruction* other) const { return true; } + // Try to statically evaluate `operation` and return an HConstant + // containing the result of this evaluation. If `operation` cannot + // be evaluated as a constant, return nullptr. + HConstant* TryStaticEvaluation(ArenaAllocator* allocator) const; + + // Apply this operation to `x` and `y`. + virtual int32_t Evaluate(int32_t x, int32_t y) const = 0; + virtual int64_t Evaluate(int64_t x, int64_t y) const = 0; + DECLARE_INSTRUCTION(BinaryOperation); private: @@ -1035,6 +1044,9 @@ class HEqual : public HCondition { HEqual(HInstruction* first, HInstruction* second) : HCondition(first, second) {} + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x == y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x == y; } + DECLARE_INSTRUCTION(Equal); virtual IfCondition GetCondition() const { @@ -1050,6 +1062,9 @@ class HNotEqual : public HCondition { HNotEqual(HInstruction* first, HInstruction* second) : HCondition(first, second) {} + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x != y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x != y; } + DECLARE_INSTRUCTION(NotEqual); virtual IfCondition GetCondition() const { @@ -1065,6 +1080,9 @@ class HLessThan : public HCondition { HLessThan(HInstruction* first, HInstruction* second) : HCondition(first, second) {} + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x < y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x < y; } + DECLARE_INSTRUCTION(LessThan); virtual IfCondition GetCondition() const { @@ -1080,6 +1098,9 @@ class HLessThanOrEqual : public HCondition { HLessThanOrEqual(HInstruction* first, HInstruction* second) : HCondition(first, second) {} + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x <= y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x <= y; } + DECLARE_INSTRUCTION(LessThanOrEqual); virtual IfCondition GetCondition() const { @@ -1095,6 +1116,9 @@ class HGreaterThan : public HCondition { HGreaterThan(HInstruction* first, HInstruction* second) : HCondition(first, second) {} + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x > y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x > y; } + DECLARE_INSTRUCTION(GreaterThan); virtual IfCondition GetCondition() const { @@ -1110,6 +1134,9 @@ class HGreaterThanOrEqual : public HCondition { HGreaterThanOrEqual(HInstruction* first, HInstruction* second) : HCondition(first, second) {} + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x >= y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x >= y; } + DECLARE_INSTRUCTION(GreaterThanOrEqual); virtual IfCondition GetCondition() const { @@ -1131,6 +1158,19 @@ class HCompare : public HBinaryOperation { DCHECK_EQ(type, second->GetType()); } + virtual int32_t Evaluate(int32_t x, int32_t y) const { + return + x == y ? 0 : + x > y ? 1 : + -1; + } + virtual int64_t Evaluate(int64_t x, int64_t y) const { + return + x == y ? 0 : + x > y ? 1 : + -1; + } + DECLARE_INSTRUCTION(Compare); private: @@ -1347,6 +1387,9 @@ class HAdd : public HBinaryOperation { virtual bool IsCommutative() { return true; } + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x + y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x + y; } + DECLARE_INSTRUCTION(Add); private: @@ -1360,6 +1403,9 @@ class HSub : public HBinaryOperation { virtual bool IsCommutative() { return false; } + virtual int32_t Evaluate(int32_t x, int32_t y) const { return x + y; } + virtual int64_t Evaluate(int64_t x, int64_t y) const { return x + y; } + DECLARE_INSTRUCTION(Sub); private: |