diff --git a/mypyc/irbuild/builder.py b/mypyc/irbuild/builder.py index 63930123135f..73b2b1b04036 100644 --- a/mypyc/irbuild/builder.py +++ b/mypyc/irbuild/builder.py @@ -376,8 +376,17 @@ def py_call( ) -> Value: return self.builder.py_call(function, arg_values, line, arg_kinds, arg_names) - def add_bool_branch(self, value: Value, true: BasicBlock, false: BasicBlock) -> None: - self.builder.add_bool_branch(value, true, false) + def add_bool_branch( + self, + value: Value, + true: BasicBlock, + false: BasicBlock, + rare: bool = False, + opt_value_none_rare: bool = False, + ) -> None: + self.builder.add_bool_branch( + value, true, false, rare=rare, opt_value_none_rare=opt_value_none_rare + ) def load_native_type_object(self, fullname: str) -> Value: return self.builder.load_native_type_object(fullname) diff --git a/mypyc/irbuild/callable_class.py b/mypyc/irbuild/callable_class.py index bbd1b909afb6..c36d672ee887 100644 --- a/mypyc/irbuild/callable_class.py +++ b/mypyc/irbuild/callable_class.py @@ -126,7 +126,7 @@ def add_get_to_callable_class(builder: IRBuilder, fn_info: FuncInfo) -> None: comparison = builder.translate_is_op( builder.read(instance), builder.none_object(), "is", line ) - builder.add_bool_branch(comparison, class_block, instance_block) + builder.add_bool_branch(comparison, class_block, instance_block, rare=True) builder.activate_block(class_block) builder.add(Return(builder.self())) diff --git a/mypyc/irbuild/classdef.py b/mypyc/irbuild/classdef.py index 324b44b95dc4..11ca1b9c259d 100644 --- a/mypyc/irbuild/classdef.py +++ b/mypyc/irbuild/classdef.py @@ -614,7 +614,7 @@ def setup_non_ext_dict( non_ext_dict = Register(dict_rprimitive) true_block, false_block, exit_block = BasicBlock(), BasicBlock(), BasicBlock() - builder.add_bool_branch(has_prepare, true_block, false_block) + builder.add_bool_branch(has_prepare, true_block, false_block, rare=True) builder.activate_block(true_block) cls_name = builder.load_str(cdef.name) diff --git a/mypyc/irbuild/function.py b/mypyc/irbuild/function.py index 738d19ea6748..53c51e0e4143 100644 --- a/mypyc/irbuild/function.py +++ b/mypyc/irbuild/function.py @@ -451,7 +451,7 @@ def generate_setattr_wrapper(builder: IRBuilder, cdef: ClassDef, setattr: FuncDe call_delattr, call_setattr = BasicBlock(), BasicBlock() null = Integer(0, object_rprimitive, line) is_delattr = builder.add(ComparisonOp(value_arg, null, ComparisonOp.EQ, line)) - builder.add_bool_branch(is_delattr, call_delattr, call_setattr) + builder.add_bool_branch(is_delattr, call_delattr, call_setattr, rare=True) builder.activate_block(call_delattr) delattr_symbol = cdef.info.get("__delattr__") diff --git a/mypyc/irbuild/generator.py b/mypyc/irbuild/generator.py index 4dcd748f6eff..5535c29a3cd7 100644 --- a/mypyc/irbuild/generator.py +++ b/mypyc/irbuild/generator.py @@ -208,7 +208,7 @@ def add_raise_exception_blocks_to_generator_class(builder: IRBuilder, line: int) error_block = BasicBlock() ok_block = BasicBlock() comparison = builder.translate_is_op(exc_type, builder.none_object(), "is not", line) - builder.add_bool_branch(comparison, error_block, ok_block) + builder.add_bool_branch(comparison, error_block, ok_block, rare=True) builder.activate_block(error_block) builder.call_c(raise_exception_with_tb_op, [exc_type, exc_val, exc_tb], line) diff --git a/mypyc/irbuild/ll_builder.py b/mypyc/irbuild/ll_builder.py index d33497d4987b..12366eb697e3 100644 --- a/mypyc/irbuild/ll_builder.py +++ b/mypyc/irbuild/ll_builder.py @@ -1999,15 +1999,23 @@ def bool_value(self, value: Value) -> Value: result = self.primitive_op(bool_op, [value], value.line) return result - def add_bool_branch(self, value: Value, true: BasicBlock, false: BasicBlock) -> None: + def add_bool_branch( + self, + value: Value, + true: BasicBlock, + false: BasicBlock, + *, + rare: bool = False, + opt_value_none_rare: bool = False, + ) -> None: opt_value_type = optional_value_type(value.type) if opt_value_type is None: bool_value = self.bool_value(value) - self.add(Branch(bool_value, true, false, Branch.BOOL)) + self.add(Branch(bool_value, true, false, Branch.BOOL, rare=rare)) else: # Special-case optional types is_none = self.translate_is_op(value, self.none_object(), "is not", value.line) - branch = Branch(is_none, true, false, Branch.BOOL) + branch = Branch(is_none, true, false, Branch.BOOL, rare=opt_value_none_rare) self.add(branch) always_truthy = False if isinstance(opt_value_type, RInstance): @@ -2024,7 +2032,7 @@ def add_bool_branch(self, value: Value, true: BasicBlock, false: BasicBlock) -> # unbox_or_cast instead of coerce because we want the # type to change even if it is a subtype. remaining = self.unbox_or_cast(value, opt_value_type, value.line) - self.add_bool_branch(remaining, true, false) + self.add_bool_branch(remaining, true, false, rare=rare) def call_c( self,