comparison src/interp-core/pt-jit.cc @ 15147:98a65d9e426f

Remove uneeded release overloads * jit-typeinfo.cc (jit_typeinfo::jit_typeinfo): Remove overloads for scalar, complex, and index release. * pt-jit.cc (jit_convert::release_temp, jit_convert::release_dead_phi, jit_convert::convert_llvm::visit): Only release when required.
author Max Brister <max@2bass.com>
date Fri, 10 Aug 2012 16:19:27 -0500
parents 709e8928e68c
children 1b2fbc30e4e7
comparison
equal deleted inserted replaced
15146:709e8928e68c 15147:98a65d9e426f
1143 // check for temporaries that require release and live across 1143 // check for temporaries that require release and live across
1144 // multiple blocks 1144 // multiple blocks
1145 if (instr->needs_release ()) 1145 if (instr->needs_release ())
1146 { 1146 {
1147 jit_block *fu_block = instr->first_use_block (); 1147 jit_block *fu_block = instr->first_use_block ();
1148 if (fu_block && fu_block != &ablock) 1148 if (fu_block && fu_block != &ablock && instr->needs_release ())
1149 temp.insert (instr); 1149 temp.insert (instr);
1150 } 1150 }
1151 1151
1152 if (isa<jit_call> (instr)) 1152 if (isa<jit_call> (instr))
1153 { 1153 {
1154 // place releases for temporary arguments 1154 // place releases for temporary arguments
1155 for (size_t i = 0; i < instr->argument_count (); ++i) 1155 for (size_t i = 0; i < instr->argument_count (); ++i)
1156 { 1156 {
1157 jit_value *arg = instr->argument (i); 1157 jit_value *arg = instr->argument (i);
1158 if (arg->needs_release ()) 1158 if (! arg->needs_release ())
1159 { 1159 continue;
1160 jit_call *release = create<jit_call> (&jit_typeinfo::release, 1160
1161 arg); 1161 jit_call *release = create<jit_call> (&jit_typeinfo::release,
1162 release->infer (); 1162 arg);
1163 ablock.insert_after (iter, release); 1163 release->infer ();
1164 ++iter; 1164 ablock.insert_after (iter, release);
1165 temp.erase (arg); 1165 ++iter;
1166 } 1166 temp.erase (arg);
1167 } 1167 }
1168 } 1168 }
1169 } 1169 }
1170 1170
1171 if (! temp.size () || ! isa<jit_error_check> (ablock.terminator ())) 1171 if (! temp.size () || ! isa<jit_error_check> (ablock.terminator ()))
1200 // instead of releasing on assign, release on all incomming branches, 1200 // instead of releasing on assign, release on all incomming branches,
1201 // this can get rid of casts inside loops 1201 // this can get rid of casts inside loops
1202 for (size_t i = 0; i < phi->argument_count (); ++i) 1202 for (size_t i = 0; i < phi->argument_count (); ++i)
1203 { 1203 {
1204 jit_value *arg = phi->argument (i); 1204 jit_value *arg = phi->argument (i);
1205 if (! arg->needs_release ())
1206 continue;
1207
1205 jit_block *inc = phi->incomming (i); 1208 jit_block *inc = phi->incomming (i);
1206 jit_block *split = inc->maybe_split (*this, ablock); 1209 jit_block *split = inc->maybe_split (*this, ablock);
1207 jit_terminator *term = split->terminator (); 1210 jit_terminator *term = split->terminator ();
1208 jit_call *release = create<jit_call> (jit_typeinfo::release, arg); 1211 jit_call *release = create<jit_call> (jit_typeinfo::release, arg);
1209 release->infer (); 1212 release->infer ();
1509 1512
1510 jit_value *overwrite = assign.overwrite (); 1513 jit_value *overwrite = assign.overwrite ();
1511 if (isa<jit_assign_base> (overwrite)) 1514 if (isa<jit_assign_base> (overwrite))
1512 { 1515 {
1513 const jit_function& ol = jit_typeinfo::get_release (overwrite->type ()); 1516 const jit_function& ol = jit_typeinfo::get_release (overwrite->type ());
1514 ol.call (builder, overwrite); 1517 if (ol.valid ())
1518 ol.call (builder, overwrite);
1515 } 1519 }
1516 } 1520 }
1517 1521
1518 void 1522 void
1519 jit_convert::convert_llvm::visit (jit_argument&) 1523 jit_convert::convert_llvm::visit (jit_argument&)