transformer_test.cpp revision 4df77d18bf57187f8e7142c6f7a70a9cdd3d581e
14df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni/*
24df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Copyright 2017, The Android Open Source Project
34df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni *
44df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Licensed under the Apache License, Version 2.0 (the "License");
54df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * you may not use this file except in compliance with the License.
64df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * You may obtain a copy of the License at
74df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni *
84df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni *     http://www.apache.org/licenses/LICENSE-2.0
94df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni *
104df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * Unless required by applicable law or agreed to in writing, software
114df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * distributed under the License is distributed on an "AS IS" BASIS,
124df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * See the License for the specific language governing permissions and
144df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni * limitations under the License.
154df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni */
164df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
174df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include "transformer.h"
184df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
194df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include <stdint.h>
204df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
214df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include "file_utils.h"
224df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include "spirit.h"
234df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include "test_utils.h"
244df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include "word_stream.h"
254df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni#include "gtest/gtest.h"
264df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
274df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace android {
284df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace spirit {
294df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
304df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ninamespace {
314df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
324df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Niclass MulToAddTransformer : public Transformer {
334df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Nipublic:
344df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  Instruction *transform(IMulInst *mul) override {
354df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    auto ret = new IAddInst(mul->mResultType, mul->mOperand1, mul->mOperand2);
364df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    ret->setId(mul->getId());
374df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return ret;
384df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
394df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni};
404df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
414df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Niclass Deleter : public Transformer {
424df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Nipublic:
434df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  Instruction *transform(IMulInst *) override { return nullptr; }
444df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni};
454df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
464df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // annonymous namespace
474df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
484df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Niclass TransformerTest : public ::testing::Test {
494df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Niprotected:
504df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  virtual void SetUp() { mWordsGreyscale = readWords("greyscale.spv"); }
514df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
524df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  std::vector<uint32_t> mWordsGreyscale;
534df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
544df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Niprivate:
554df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  std::vector<uint32_t> readWords(const char *testFile) {
564df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    static const std::string testDataPath(
574df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni        "frameworks/rs/rsov/compiler/spirit/test_data/");
584df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    const std::string &fullPath = getAbsolutePath(testDataPath + testFile);
594df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni    return readFile<uint32_t>(fullPath);
604df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  }
614df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni};
624df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
634df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang NiTEST_F(TransformerTest, testMulToAdd) {
644df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  std::unique_ptr<InputWordStream> IS(InputWordStream::Create(mWordsGreyscale));
654df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  std::unique_ptr<Module> m(Deserialize<Module>(*IS));
664df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
674df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  ASSERT_NE(nullptr, m);
684df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
694df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  EXPECT_EQ(1, countEntity<IAddInst>(m.get()));
704df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  EXPECT_EQ(1, countEntity<IMulInst>(m.get()));
714df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
724df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  MulToAddTransformer trans;
734df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  std::unique_ptr<Module> m1(trans.applyTo(m.get()));
744df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
754df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  ASSERT_NE(nullptr, m1);
764df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
774df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  ASSERT_TRUE(m1->resolveIds());
784df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
794df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  EXPECT_EQ(2, countEntity<IAddInst>(m1.get()));
804df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  EXPECT_EQ(0, countEntity<IMulInst>(m1.get()));
814df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni}
824df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
834df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang NiTEST_F(TransformerTest, testDeletion) {
844df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  std::unique_ptr<InputWordStream> IS(InputWordStream::Create(mWordsGreyscale));
854df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  std::unique_ptr<Module> m(Deserialize<Module>(*IS));
864df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
874df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  ASSERT_NE(nullptr, m.get());
884df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
894df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  EXPECT_EQ(1, countEntity<IMulInst>(m.get()));
904df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
914df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  Deleter trans;
924df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  std::unique_ptr<Module> m1(trans.applyTo(m.get()));
934df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
944df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  ASSERT_NE(nullptr, m1.get());
954df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
964df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  EXPECT_EQ(1, countEntity<IAddInst>(m1.get()));
974df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni  EXPECT_EQ(0, countEntity<IMulInst>(m1.get()));
984df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni}
994df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni
1004df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // namespace spirit
1014df77d18bf57187f8e7142c6f7a70a9cdd3d581eYang Ni} // namespace android
102