diff --git a/loopy/codegen/instruction.py b/loopy/codegen/instruction.py index 0970fa5c4298061fc82e3d8ea1cf2b8460c3fb10..ecb500d901e7e101d78711e7ea22cb0dcd81c1d8 100644 --- a/loopy/codegen/instruction.py +++ b/loopy/codegen/instruction.py @@ -9,8 +9,19 @@ def generate_instruction_code(kernel, insn, codegen_state): ccm = codegen_state.c_code_mapper + expr = insn.expression + + if ccm.allow_complex: + # detect widen-to-complex in assignment, account for it. + expr_dtype = ccm.infer_type(expr) + var_dtype = kernel.get_var_descriptor(insn.get_assignee_var_name()).dtype + + if var_dtype.kind == "c" and expr_dtype.kind != "c": + from pymbolic import var + expr = var("%s_fromreal" % ccm.complex_type_name(var_dtype))(expr) + from cgen import Assign - insn_code = Assign(ccm(insn.assignee), ccm(insn.expression)) + insn_code = Assign(ccm(insn.assignee), ccm(expr)) from loopy.codegen.bounds import wrap_in_bounds_checks insn_code, impl_domain = wrap_in_bounds_checks( ccm, kernel.domain, kernel.insn_inames(insn),