From 476a0befb1c35bd1540ee029e03118a1f7f9dacb Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EB=B0=95=EC=A2=85=ED=98=84/=EB=8F=99=EC=9E=91=EC=A0=9C?= =?utf8?q?=EC=96=B4Lab=28SR=29/Staff=20Engineer/=EC=82=BC=EC=84=B1?= =?utf8?q?=EC=A0=84=EC=9E=90?= Date: Fri, 7 Dec 2018 16:32:13 +0900 Subject: [PATCH] [enco] Introduce Intrinsic Selection (#2553) This commit introduces the basic implementation of Intrinsic Selection pass. The current implementation is able to rewrite an "Eval" instruction for "Depthwise concat over features" as "ANNDepthConcatF" instruction. Signed-off-by: Jonghyun Park --- contrib/enco/core/src/Backend.cpp | 4 + .../core/src/Transforms/IntrinsicSelection.cpp | 100 +++++++++++++++++++++ .../enco/core/src/Transforms/IntrinsicSelection.h | 36 ++++++++ 3 files changed, 140 insertions(+) create mode 100644 contrib/enco/core/src/Transforms/IntrinsicSelection.cpp create mode 100644 contrib/enco/core/src/Transforms/IntrinsicSelection.h diff --git a/contrib/enco/core/src/Backend.cpp b/contrib/enco/core/src/Backend.cpp index c0409f2..9881984 100644 --- a/contrib/enco/core/src/Backend.cpp +++ b/contrib/enco/core/src/Backend.cpp @@ -25,6 +25,7 @@ #include "Transforms/Duplicate.h" #include "Transforms/FeatureUnification.h" #include "Transforms/AvgPoolLowering.h" +#include "Transforms/IntrinsicSelection.h" #include "Transforms/DataLayoutConversion.h" #include "Transforms/IndirectCopyElimination.h" #include "Transforms/IdenticalObjectReduction.h" @@ -107,6 +108,9 @@ void BackendImpl::compile(coco::Module *m, coco::Data *d) lower_avgpool(code(sess)); + // Select Intrinsic(API) + select_intrinsic(code(sess)); + // Insert data ordering if necessary convert_data_layout(code(sess)); diff --git a/contrib/enco/core/src/Transforms/IntrinsicSelection.cpp b/contrib/enco/core/src/Transforms/IntrinsicSelection.cpp new file mode 100644 index 0000000..7bf1c49 --- /dev/null +++ b/contrib/enco/core/src/Transforms/IntrinsicSelection.cpp @@ -0,0 +1,100 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "IntrinsicSelection.h" + +#include "coex/IR.h" + +namespace +{ + +/** + * @brief Return a backend-speicific coco (extend) instruction + * + * @note rewrite(ins) returns nullptr if selection fails + */ +coco::Instr *rewrite(coco::Instr *curr) +{ + auto m = curr->module(); + assert(m != nullptr); + + if (auto eval = coco::safe_cast(curr)) + { + if (auto concat_f = eval->op()->asConcatF()) + { + auto fst_load = concat_f->left()->asLoad(); + auto snd_load = concat_f->right()->asLoad(); + + if (fst_load && snd_load && (concat_f->axis() == coco::ConcatF::Axis::Depth)) + { + // Here is the pattern of interest + // + // %ofm = eval(ConcatF(Depth, Load(%left), Load(%right))) + // + auto fst_feature = fst_load->object()->asFeature(); + auto snd_feature = snd_load->object()->asFeature(); + assert((fst_feature != nullptr) && (snd_feature != nullptr)); + + auto out_feature = eval->out()->asFeature(); + assert(out_feature != nullptr); + + eval->out(nullptr); + + auto depth_concat = m->entity()->instr()->create(); + + depth_concat->out(out_feature); + depth_concat->fst(fst_feature); + depth_concat->snd(snd_feature); + + return depth_concat; + } + + return nullptr; + } + } + + return nullptr; +} + +} // namespace + +namespace enco +{ + +void select_intrinsic(enco::Code *code) +{ + auto m = code->module(); + + for (auto blk = m->block()->head(); blk; blk = blk->next()) + { + auto ins = blk->instr()->head(); + + while (ins) + { + if (auto rewritten_ins = rewrite(ins)) + { + rewritten_ins->insertBefore(ins); + ins->detach(); + + ins = rewritten_ins; + } + + ins = ins->next(); + } + } +} + +} // namespace enco diff --git a/contrib/enco/core/src/Transforms/IntrinsicSelection.h b/contrib/enco/core/src/Transforms/IntrinsicSelection.h new file mode 100644 index 0000000..e6e3018 --- /dev/null +++ b/contrib/enco/core/src/Transforms/IntrinsicSelection.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018 Samsung Electronics Co., Ltd. All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __INTRINSIC_SELECTION_H__ +#define __INTRINSIC_SELECTION_H__ + +#include "Code.h" + +namespace enco +{ + +/** + * @brief Select Intricsic (API) to be used + * + * This pass is analogue of "Instruction Selection" pass. This "Intrisic Selection" pass + * will replace a general coco IR instruction into a backend-specific coco (extended) IR + * instruction. + */ +void select_intrinsic(enco::Code *); + +} // namespace enco + +#endif // __INTRINSIC_SELECTION_H__ -- 2.7.4