From 889a99bda50536ad32070829f07f11aa22f8a13f Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Tue, 14 Nov 2017 13:27:54 -0600 Subject: [PATCH] First go at fixing sized-integer code gen, fails because of https://github.com/numpy/numpy/issues/9438 (#99 on gitlab) --- loopy/target/c/codegen/expression.py | 17 +++++++++++++++-- test/test_target.py | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/loopy/target/c/codegen/expression.py b/loopy/target/c/codegen/expression.py index 5d269a8bc..93ebf51db 100644 --- a/loopy/target/c/codegen/expression.py +++ b/loopy/target/c/codegen/expression.py @@ -361,16 +361,29 @@ class ExpressionToCExpressionMapper(IdentityMapper): return var("%s_new" % cast_type)(expr.real, expr.imag) else: + def map_integer_literal(expr): + if isinstance(expr, np.integer): + # If someone went to the trouble of supplying a sized + # integer, trust them. + + from loopy.types import NumpyType + return Literal("(%s) (%s)" % ( + self.codegen_state.ast_builder.dtype_to_ctype( + NumpyType(type(expr))), + int(expr))) + else: + return Literal(str(int(expr))) + from loopy.symbolic import Literal if type_context == "f": return Literal(repr(float(expr))+"f") elif type_context == "d": return Literal(repr(float(expr))) elif type_context == "i": - return int(expr) + return map_integer_literal(expr) else: if is_integer(expr): - return int(expr) + return map_integer_literal(expr) raise RuntimeError("don't know how to generate code " "for constant '%s'" % expr) diff --git a/test/test_target.py b/test/test_target.py index ad0cb7439..f8f279d3e 100644 --- a/test/test_target.py +++ b/test/test_target.py @@ -240,6 +240,26 @@ def test_numba_cuda_target(): print(lp.generate_code_v2(knl).all_code()) +def test_sized_integer_c_codegen(ctx_factory): + ctx = ctx_factory() + queue = cl.CommandQueue(ctx) + + from pymbolic import var + knl = lp.make_kernel( + "{[i]: 0<=i 1: exec(sys.argv[1]) -- GitLab