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