Mercurial > octave-nkf
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&) |