Commit a734b360 authored by Robert Bradshaw's avatar Robert Bradshaw

(Cheaper) overflow check for const rhs.

parent 2da25603
......@@ -8013,7 +8013,10 @@ class NumBinopNode(BinopNode):
self.infix = False
if self.type.is_int and env.directives['overflowcheck'] and self.operator in ('+', '-', '*'):
self.overflow_check = True
self.func = self.type.overflow_check_binop(self.op_names[self.operator], env)
self.func = self.type.overflow_check_binop(
self.op_names[self.operator],
env,
const_rhs = self.operand2.has_constant_result())
self.is_temp = True
if not self.infix or (type1.is_numeric and type2.is_numeric):
self.operand1 = self.operand1.coerce_to(self.type, env)
......
......@@ -402,7 +402,9 @@ class CTypedefType(BaseType):
# delegation
return self.typedef_base_type.create_from_py_utility_code(env)
def overflow_check_binop(self, binop, env):
def overflow_check_binop(self, binop, env, const_rhs=False):
if const_rhs:
binop += "_const"
env.use_utility_code(UtilityCode.load("Common", "Overflow.c"))
type = self.declaration_code("")
name = self.specialization_name()
......@@ -1557,10 +1559,12 @@ class CIntType(CNumericType):
# be negative for signed ints, which is good.
return "0xbad0bad0"
def overflow_check_binop(self, binop, env):
def overflow_check_binop(self, binop, env, const_rhs=False):
env.use_utility_code(UtilityCode.load("Common", "Overflow.c"))
type = self.declaration_code("")
name = self.specialization_name()
if const_rhs:
binop += "_const"
if type in ('int', 'long', 'long long'):
env.use_utility_code(TempitaUtilityCode.load("BaseCaseSigned", "Overflow.c", context={'INT': type, 'NAME': name}))
elif type in ('unsigned int', 'unsigned long', 'unsigned long long'):
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment