| 218 | }; |
| 219 | |
| 220 | void fusionContext ( Context & context, TextWriter & logs, bool enableFusion ) { |
| 221 | // log all functions |
| 222 | if ( enableFusion ) { |
| 223 | bool anyFusion = true; |
| 224 | while ( anyFusion) { |
| 225 | anyFusion = false; |
| 226 | for ( int g=0, gs=context.totalVariables; g!=gs; ++g ) { |
| 227 | GlobalVariable * var = context.globalVariables + g; |
| 228 | if ( var->init ) { |
| 229 | SimNodeCollector collector; |
| 230 | var->init->visit(collector); |
| 231 | SimFusion fuse(&context, logs, das::move(collector.info)); |
| 232 | var->init = var->init->visit(fuse); |
| 233 | anyFusion |= fuse.fused; |
| 234 | } |
| 235 | } |
| 236 | for ( int i=0, is=context.totalFunctions; i!=is; ++i ) { |
| 237 | SimFunction * fn = context.getFunction(i); |
| 238 | SimNodeCollector collector; |
| 239 | fn->code->visit(collector); |
| 240 | SimFusion fuse(&context, logs, das::move(collector.info)); |
| 241 | fn->code = fn->code->visit(fuse); |
| 242 | anyFusion |= fuse.fused; |
| 243 | } |
| 244 | } |
| 245 | } |
| 246 | } |
| 247 | |
| 248 | void registerFusion ( const char * OpName, const char * CTypeName, FusionPoint * node ) { |
| 249 | (**g_fusionEngine)[fuseName(OpName,CTypeName)].emplace_back(node); |