diff src/jit-typeinfo.cc @ 15027:741d2dbcc117

Check trip count before compiling for loops. * src/jit-typeinfo.cc (octave_jit_cast_any_range, octave_jit_cast_range_any): New function. (octave_jit_paren_subsasgn_impl): Add return argument. (jit_typeinfo::jit_typeinfo): Update octave_jit_paren_subsasgn_impl call and add any <-> range casts. * src/pt-eval.cc (tree_evaluator::visit_simple_for_command): Try jit after computing loop bounds. * src/pt-jit.cc (jit_convert::jit_convert): Add and handle for bounds argument. (jit_convert::visit_binary_expression): Use next_shortcircut_result. (jit_convert::visit_simple_for_command): Use next_iterator and check for precomputed bounds. (jit_convert::find_variable, jit_convert::create_variable, jit_convert::next_name, tree_jit::trip_count, jit_info::initialize, jit_info::find): New function. (jit_convert::get_variable): Use find_variable and create_variable. (tree_jit::execute): Allow for precomputed loop bounds and check trip count. (jit_info::jit_info): Added new overload and defer work to initialize. (jit_info::execute): Support precomputed bounds. (jit_info::match): Support precomputed bounds. * src/pt-jit.h (jit_convert::jit_convert, jit_convert::execute, jit_info::execute, jit_info::match): New parameter. (jit_convert::find_variable, jit_convert::create_variable, tree_jit::trip_count, jit_info::initialize, jit_info::find): New declaration. (jit_convert::next_iterator, jit_convert::next_for_bounds, jit_convert::next_shortcircut_result, jit_convert::next_name): New function.
author Max Brister <max@2bass.com>
date Thu, 26 Jul 2012 17:03:15 -0500
parents ae3670d4df29
children bc32288f4a42
line wrap: on
line diff
--- a/src/jit-typeinfo.cc	Mon Jul 23 12:18:07 2012 +0400
+++ b/src/jit-typeinfo.cc	Thu Jul 26 17:03:15 2012 -0500
@@ -138,6 +138,25 @@
   obv->release ();
 }
 
+extern "C" octave_base_value *
+octave_jit_cast_any_range (jit_range *rng)
+{
+  Range temp (*rng);
+  octave_value ret (temp);
+  octave_base_value *rep = ret.internal_rep ();
+  rep->grab ();
+
+  return rep;
+}
+extern "C" void
+octave_jit_cast_range_any (jit_range *ret, octave_base_value *obv)
+{
+
+  jit_range r (obv->range_value ());
+  *ret = r;
+  obv->release ();
+}
+
 extern "C" double
 octave_jit_cast_scalar_any (octave_base_value *obv)
 {
@@ -210,8 +229,8 @@
 }
 
 extern "C" void
-octave_jit_paren_subsasgn_impl (jit_matrix *mat, octave_idx_type index,
-                                double value)
+octave_jit_paren_subsasgn_impl (jit_matrix *ret, jit_matrix *mat,
+                                octave_idx_type index, double value)
 {
   NDArray *array = mat->array;
   if (array->nelem () < index)
@@ -221,6 +240,7 @@
   data[index - 1] = value;
 
   mat->update ();
+  *ret = *mat;
 }
 
 extern "C" void
@@ -1291,7 +1311,8 @@
 
   jit_function resize_paren_subsasgn
     = create_function (jit_convention::external,
-                       "octave_jit_paren_subsasgn_impl", matrix, index, scalar);
+                       "octave_jit_paren_subsasgn_impl", matrix, matrix, index,
+                       scalar);
   resize_paren_subsasgn.add_mapping (engine, &octave_jit_paren_subsasgn_impl);
   fn = create_function (jit_convention::internal, "octave_jit_paren_subsasgn",
                         matrix, matrix, scalar, scalar);
@@ -1336,8 +1357,8 @@
 
     // resize on out of bounds access
     builder.SetInsertPoint (bounds_error);
-    llvm::Value *resize_result = resize_paren_subsasgn.call (builder, int_idx,
-                                                             value);
+    llvm::Value *resize_result = resize_paren_subsasgn.call (builder, mat,
+                                                             int_idx, value);
     builder.CreateBr (done);
 
     builder.SetInsertPoint (success);
@@ -1369,6 +1390,7 @@
   casts[scalar->type_id ()].stash_name ("(scalar)");
   casts[complex->type_id ()].stash_name ("(complex)");
   casts[matrix->type_id ()].stash_name ("(matrix)");
+  casts[any->type_id ()].stash_name ("(range)");
 
   // cast any <- matrix
   fn = create_function (jit_convention::external, "octave_jit_cast_any_matrix",
@@ -1382,6 +1404,18 @@
   fn.add_mapping (engine, &octave_jit_cast_matrix_any);
   casts[matrix->type_id ()].add_overload (fn);
 
+  // cast any <- range
+  fn = create_function (jit_convention::external, "octave_jit_cast_any_range",
+                        any, range);
+  fn.add_mapping (engine, &octave_jit_cast_any_range);
+  casts[any->type_id ()].add_overload (fn);
+
+  // cast range <- any
+  fn = create_function (jit_convention::external, "octave_jit_cast_range_any",
+                        range, any);
+  fn.add_mapping (engine, &octave_jit_cast_range_any);
+  casts[range->type_id ()].add_overload (fn);
+
   // cast any <- scalar
   fn = create_function (jit_convention::external, "octave_jit_cast_any_scalar",
                         any, scalar);