1423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea/* 2423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * Copyright (C) 2013 The Android Open Source Project 3423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * 4423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * Licensed under the Apache License, Version 2.0 (the "License"); 5423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * you may not use this file except in compliance with the License. 6423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * You may obtain a copy of the License at 7423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * 8423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * http://www.apache.org/licenses/LICENSE-2.0 9423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * 10423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * Unless required by applicable law or agreed to in writing, software 11423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * distributed under the License is distributed on an "AS IS" BASIS, 12423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * See the License for the specific language governing permissions and 14423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea * limitations under the License. 15423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea */ 16423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea 17423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea#include "common_test.h" 18423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea#include "sea_ir/types/type_inference_visitor.h" 19423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea#include "sea_ir/ir/sea.h" 20423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea 21423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirleanamespace sea_ir { 22423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea 23423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirleaclass TestInstructionNode:public InstructionNode { 24423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea public: 25423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea explicit TestInstructionNode(std::vector<InstructionNode*> prods): InstructionNode(NULL), 26423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea producers_(prods) { } 27423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea std::vector<InstructionNode*> GetSSAProducers() { 28423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea return producers_; 29423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea } 30423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea protected: 31423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea std::vector<InstructionNode*> producers_; 32423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea}; 33423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea 34423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirleaclass TypeInferenceVisitorTest : public art::CommonTest { 35423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea}; 36423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea 37423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos SbirleaTEST_F(TypeInferenceVisitorTest, MergeIntWithByte) { 38423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TypeData td; 39423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea art::verifier::RegTypeCache type_cache(false); 40423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TypeInferenceVisitor tiv(NULL, &td, &type_cache); 41423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* int_type = &type_cache.Integer(); 42423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* byte_type = &type_cache.Byte(); 43423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* ib_type = tiv.MergeTypes(int_type, byte_type); 44423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* bi_type = tiv.MergeTypes(byte_type, int_type); 45423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea EXPECT_TRUE(ib_type == int_type); 46423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea EXPECT_TRUE(bi_type == int_type); 47423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea} 48423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea 49423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos SbirleaTEST_F(TypeInferenceVisitorTest, MergeIntWithShort) { 50423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TypeData td; 51423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea art::verifier::RegTypeCache type_cache(false); 52423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TypeInferenceVisitor tiv(NULL, &td, &type_cache); 53423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* int_type = &type_cache.Integer(); 54423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* short_type = &type_cache.Short(); 55423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* is_type = tiv.MergeTypes(int_type, short_type); 56423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* si_type = tiv.MergeTypes(short_type, int_type); 57423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea EXPECT_TRUE(is_type == int_type); 58423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea EXPECT_TRUE(si_type == int_type); 59423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea} 60423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea 61423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos SbirleaTEST_F(TypeInferenceVisitorTest, MergeMultipleInts) { 62423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea int N = 10; // Number of types to merge. 63423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TypeData td; 64423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea art::verifier::RegTypeCache type_cache(false); 65423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TypeInferenceVisitor tiv(NULL, &td, &type_cache); 66423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea std::vector<const Type*> types; 67423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea for (int i = 0; i < N; i++) { 68423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* new_type = &type_cache.Integer(); 69423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea types.push_back(new_type); 70423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea } 71423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* merged_type = tiv.MergeTypes(types); 72423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea EXPECT_TRUE(merged_type == &type_cache.Integer()); 73423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea} 74423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea 75423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos SbirleaTEST_F(TypeInferenceVisitorTest, MergeMultipleShorts) { 76423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea int N = 10; // Number of types to merge. 77423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TypeData td; 78423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea art::verifier::RegTypeCache type_cache(false); 79423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TypeInferenceVisitor tiv(NULL, &td, &type_cache); 80423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea std::vector<const Type*> types; 81423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea for (int i = 0; i < N; i++) { 82423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* new_type = &type_cache.Short(); 83423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea types.push_back(new_type); 84423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea } 85423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* merged_type = tiv.MergeTypes(types); 86423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea EXPECT_TRUE(merged_type == &type_cache.Short()); 87423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea} 88423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea 89423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos SbirleaTEST_F(TypeInferenceVisitorTest, MergeMultipleIntsWithShorts) { 90423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea int N = 10; // Number of types to merge. 91423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TypeData td; 92423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea art::verifier::RegTypeCache type_cache(false); 93423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TypeInferenceVisitor tiv(NULL, &td, &type_cache); 94423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea std::vector<const Type*> types; 95423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea for (int i = 0; i < N; i++) { 96423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* short_type = &type_cache.Short(); 97423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* int_type = &type_cache.Integer(); 98423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea types.push_back(short_type); 99423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea types.push_back(int_type); 100423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea } 101423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* merged_type = tiv.MergeTypes(types); 102423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea EXPECT_TRUE(merged_type == &type_cache.Integer()); 103423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea} 104423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea 105423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos SbirleaTEST_F(TypeInferenceVisitorTest, GetOperandTypes) { 106423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea int N = 10; // Number of types to merge. 107423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TypeData td; 108423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea art::verifier::RegTypeCache type_cache(false); 109423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TypeInferenceVisitor tiv(NULL, &td, &type_cache); 110423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea std::vector<const Type*> types; 111423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea std::vector<InstructionNode*> preds; 112423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea for (int i = 0; i < N; i++) { 113423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* short_type = &type_cache.Short(); 114423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea const Type* int_type = &type_cache.Integer(); 115423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TestInstructionNode* short_inst = 116423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea new TestInstructionNode(std::vector<InstructionNode*>()); 117423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TestInstructionNode* int_inst = 118423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea new TestInstructionNode(std::vector<InstructionNode*>()); 119423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea preds.push_back(short_inst); 120423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea preds.push_back(int_inst); 121423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea td.SetTypeOf(short_inst->Id(), short_type); 122423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea td.SetTypeOf(int_inst->Id(), int_type); 123423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea types.push_back(short_type); 124423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea types.push_back(int_type); 125423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea } 126423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea TestInstructionNode* inst_to_test = new TestInstructionNode(preds); 127423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea std::vector<const Type*> result = tiv.GetOperandTypes(inst_to_test); 128423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea EXPECT_TRUE(result.size() == types.size()); 129423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea EXPECT_TRUE(true == std::equal(types.begin(), types.begin() + 2, result.begin())); 130423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea} 131423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea 132423fb4d70f2ac36bf9f630146b4150771a8e7e76Dragos Sbirlea 13302e25119b15a6f619f17db99f5d05124a5807ff3Mathieu Chartier} // namespace sea_ir 134