From a501ab1aa6dd50c04ba8d066a482684070727d75 Mon Sep 17 00:00:00 2001 From: Matt Pharr Date: Fri, 16 Sep 2011 17:40:05 -0700 Subject: [PATCH] Fix parenthesization bugs in cost estimates. Also added the debugging print that helped find these issues. Revert inlining some functions in examples --- examples/rt/rt.ispc | 28 ++++++++++++++-------------- examples/stencil/stencil.ispc | 2 +- expr.cpp | 4 ++-- module.cpp | 5 ++++- stmt.cpp | 2 +- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/examples/rt/rt.ispc b/examples/rt/rt.ispc index 8376e36a..92ca2421 100644 --- a/examples/rt/rt.ispc +++ b/examples/rt/rt.ispc @@ -70,9 +70,9 @@ static inline float Dot(const float3 a, const float3 b) { } -static inline void generateRay(uniform const float raster2camera[4][4], - uniform const float camera2world[4][4], - float x, float y, reference Ray ray) { +static void generateRay(uniform const float raster2camera[4][4], + uniform const float camera2world[4][4], + float x, float y, reference Ray ray) { ray.mint = 0.f; ray.maxt = 1e30f; @@ -177,8 +177,8 @@ static inline bool TriIntersect(const reference Triangle tri, reference Ray ray) } -static inline bool BVHIntersect(const LinearBVHNode nodes[], const Triangle tris[], - reference Ray r) { +bool BVHIntersect(const LinearBVHNode nodes[], const Triangle tris[], + reference Ray r) { Ray ray = r; bool hit = false; // Follow ray through BVH nodes to find primitive intersections @@ -226,15 +226,15 @@ static inline bool BVHIntersect(const LinearBVHNode nodes[], const Triangle tris } -static inline void raytrace_tile(uniform int x0, uniform int x1, - uniform int y0, uniform int y1, - uniform int width, uniform int height, - uniform int baseWidth, uniform int baseHeight, - const uniform float raster2camera[4][4], - const uniform float camera2world[4][4], - uniform float image[], uniform int id[], - const LinearBVHNode nodes[], - const Triangle triangles[]) { +static void raytrace_tile(uniform int x0, uniform int x1, + uniform int y0, uniform int y1, + uniform int width, uniform int height, + uniform int baseWidth, uniform int baseHeight, + const uniform float raster2camera[4][4], + const uniform float camera2world[4][4], + uniform float image[], uniform int id[], + const LinearBVHNode nodes[], + const Triangle triangles[]) { uniform float widthScale = (float)(baseWidth) / (float)(width); uniform float heightScale = (float)(baseHeight) / (float)(height); diff --git a/examples/stencil/stencil.ispc b/examples/stencil/stencil.ispc index 849f9a39..d707640c 100644 --- a/examples/stencil/stencil.ispc +++ b/examples/stencil/stencil.ispc @@ -32,7 +32,7 @@ */ -static inline void +static void stencil_step(uniform int x0, uniform int x1, uniform int y0, uniform int y1, uniform int z0, uniform int z1, diff --git a/expr.cpp b/expr.cpp index 2cfb2d95..5a4bca85 100644 --- a/expr.cpp +++ b/expr.cpp @@ -1455,8 +1455,8 @@ int BinaryExpr::EstimateCost() const { return ((arg0 ? arg0->EstimateCost() : 0) + (arg1 ? arg1->EstimateCost() : 0) + - (op == Div || op == Mod) ? COST_COMPLEX_ARITH_OP : - COST_SIMPLE_ARITH_LOGIC_OP); + ((op == Div || op == Mod) ? COST_COMPLEX_ARITH_OP : + COST_SIMPLE_ARITH_LOGIC_OP)); } diff --git a/module.cpp b/module.cpp index df596cf6..dabda818 100644 --- a/module.cpp +++ b/module.cpp @@ -707,9 +707,12 @@ lEmitFunctionCode(FunctionEmitContext *ctx, llvm::Function *function, // Finally, we can generate code for the function if (code != NULL) { + int costEstimate = code->EstimateCost(); bool checkMask = (ft->isTask == true) || ((function->hasFnAttr(llvm::Attribute::AlwaysInline) == false) && - code->EstimateCost() > 16); + costEstimate > 16); + Debug(code->pos, "Estimated cost for function \"%s\" = %d\n", + funSym->name.c_str(), costEstimate); // If the body of the function is non-trivial, then we wrap the // entire thing around a varying "cif (true)" test in order to reap // the side-effect benefit of checking to see if the execution mask diff --git a/stmt.cpp b/stmt.cpp index 07c60571..928d50df 100644 --- a/stmt.cpp +++ b/stmt.cpp @@ -1177,7 +1177,7 @@ ForStmt::EstimateCost() const { (test ? test->EstimateCost() : 0) + (step ? step->EstimateCost() : 0) + (stmts ? stmts->EstimateCost() : 0) + - uniformTest ? COST_UNIFORM_LOOP : COST_VARYING_LOOP); + (uniformTest ? COST_UNIFORM_LOOP : COST_VARYING_LOOP)); }