ExpressionPtr IclHostPlugin::PostVisit(const clang::Expr* expr, const insieme::core::ExpressionPtr& irExpr, insieme::frontend::conversion::Converter& convFact) { NodeManager& mgr = irExpr->getNodeManager(); IRBuilder builder(mgr); const core::lang::BasicGenerator& gen = builder.getLangBasic(); iclRunKernel = irp::callExpr(pattern::any, irp::literal("icl_run_kernel"), var("derefKernel", irp::callExpr(pattern::any, pattern::atom(gen.getRefDeref()), pattern::single(var("kernel", pattern::any)))) << *pattern::any << irp::callExpr(pattern::any, pattern::atom(gen.getVarlistPack()), pattern::single(irp::tupleExpr(pattern::any << irp::expressions(*var("args", pattern::any)))))); core::pattern::TreePattern derefOfIclBuffer = irp::callExpr(pattern::atom(builder.refType( builder.arrayType(builder.genericType("_icl_buffer")))), pattern::atom(gen.getRefDeref()), pattern::single(var("buffer", pattern::any))); NodeMap replacements; irp::matchAllPairs(iclRunKernel, irExpr, [&](const NodePtr& matchPtr, const NodeMatch& runKernel) { // remove deref from buffers for(NodePtr arg : runKernel["args"].getFlattened()) { MatchOpt match = derefOfIclBuffer.matchPointer(arg); if(match) { replacements[match.get().getRoot()] = match.get()["buffer"].getValue(); } } }); if(!replacements.empty()) return transform::replaceAll(mgr, irExpr, replacements).as<ExpressionPtr>(); return irExpr; }