diff options
Diffstat (limited to 'compiler/optimizing/nodes.h')
-rw-r--r-- | compiler/optimizing/nodes.h | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index 6ee4dfc1eb..a57bbdb5dd 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -1715,7 +1715,12 @@ class HDiv : public HBinaryOperation { HDiv(Primitive::Type result_type, HInstruction* left, HInstruction* right) : HBinaryOperation(result_type, left, right) {} - virtual int32_t Evaluate(int32_t x, int32_t y) const { return x / y; } + virtual int32_t Evaluate(int32_t x, int32_t y) const { + // Our graph structure ensures we never have 0 for `y` during constant folding. + DCHECK_NE(y, 0); + // Special case -1 to avoid getting a SIGFPE on x86. + return (y == -1) ? -x : x / y; + } virtual int64_t Evaluate(int64_t x, int64_t y) const { return x / y; } DECLARE_INSTRUCTION(Div); |