spirv-fuzz: Fix MaybeGetZeroConstant (#3740)

Fixes #3739.
This commit is contained in:
Vasyl Teliman 2020-08-25 11:50:00 +03:00 committed by GitHub
parent 12df3cafee
commit 1341b58a86
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 41 deletions

View File

@ -296,8 +296,6 @@ uint32_t FuzzerPass::FindOrCreateIntegerConstant(
uint32_t FuzzerPass::FindOrCreateFloatConstant( uint32_t FuzzerPass::FindOrCreateFloatConstant(
const std::vector<uint32_t>& words, uint32_t width, bool is_irrelevant) { const std::vector<uint32_t>& words, uint32_t width, bool is_irrelevant) {
auto float_type_id = FindOrCreateFloatType(width); auto float_type_id = FindOrCreateFloatType(width);
opt::analysis::FloatConstant float_constant(
GetIRContext()->get_type_mgr()->GetType(float_type_id)->AsFloat(), words);
if (auto constant_id = fuzzerutil::MaybeGetScalarConstant( if (auto constant_id = fuzzerutil::MaybeGetScalarConstant(
GetIRContext(), *GetTransformationContext(), words, float_type_id, GetIRContext(), *GetTransformationContext(), words, float_type_id,
is_irrelevant)) { is_irrelevant)) {

View File

@ -970,35 +970,34 @@ uint32_t MaybeGetZeroConstant(
opt::IRContext* ir_context, opt::IRContext* ir_context,
const TransformationContext& transformation_context, const TransformationContext& transformation_context,
uint32_t scalar_or_composite_type_id, bool is_irrelevant) { uint32_t scalar_or_composite_type_id, bool is_irrelevant) {
const auto* type = const auto* type_inst =
ir_context->get_type_mgr()->GetType(scalar_or_composite_type_id); ir_context->get_def_use_mgr()->GetDef(scalar_or_composite_type_id);
assert(type && "|scalar_or_composite_type_id| is invalid"); assert(type_inst && "|scalar_or_composite_type_id| is invalid");
switch (type->kind()) { switch (type_inst->opcode()) {
case opt::analysis::Type::kBool: case SpvOpTypeBool:
return MaybeGetBoolConstant(ir_context, transformation_context, false, return MaybeGetBoolConstant(ir_context, transformation_context, false,
is_irrelevant); is_irrelevant);
case opt::analysis::Type::kFloat: case SpvOpTypeFloat:
case opt::analysis::Type::kInteger: { case SpvOpTypeInt: {
const auto width = type_inst->GetSingleWordInOperand(0);
std::vector<uint32_t> words = {0}; std::vector<uint32_t> words = {0};
if ((type->AsInteger() && type->AsInteger()->width() > 32) || if (width > 32) {
(type->AsFloat() && type->AsFloat()->width() > 32)) {
words.push_back(0); words.push_back(0);
} }
return MaybeGetScalarConstant(ir_context, transformation_context, words, return MaybeGetScalarConstant(ir_context, transformation_context, words,
scalar_or_composite_type_id, is_irrelevant); scalar_or_composite_type_id, is_irrelevant);
} }
case opt::analysis::Type::kStruct: { case SpvOpTypeStruct: {
std::vector<uint32_t> component_ids; std::vector<uint32_t> component_ids;
for (const auto* component_type : type->AsStruct()->element_types()) { for (uint32_t i = 0; i < type_inst->NumInOperands(); ++i) {
auto component_type_id = const auto component_type_id = type_inst->GetSingleWordInOperand(i);
ir_context->get_type_mgr()->GetId(component_type);
assert(component_type_id && "Component type is invalid");
auto component_id = auto component_id =
MaybeGetZeroConstant(ir_context, transformation_context, MaybeGetZeroConstant(ir_context, transformation_context,
component_type_id, is_irrelevant); component_type_id, is_irrelevant);
if (component_id == 0 && is_irrelevant) { if (component_id == 0 && is_irrelevant) {
// Irrelevant constants can use either relevant or irrelevant // Irrelevant constants can use either relevant or irrelevant
// constituents. // constituents.
@ -1017,14 +1016,9 @@ uint32_t MaybeGetZeroConstant(
ir_context, transformation_context, component_ids, ir_context, transformation_context, component_ids,
scalar_or_composite_type_id, is_irrelevant); scalar_or_composite_type_id, is_irrelevant);
} }
case opt::analysis::Type::kMatrix: case SpvOpTypeMatrix:
case opt::analysis::Type::kVector: { case SpvOpTypeVector: {
const auto* component_type = type->AsVector() const auto component_type_id = type_inst->GetSingleWordInOperand(0);
? type->AsVector()->element_type()
: type->AsMatrix()->element_type();
auto component_type_id =
ir_context->get_type_mgr()->GetId(component_type);
assert(component_type_id && "Component type is invalid");
auto component_id = MaybeGetZeroConstant( auto component_id = MaybeGetZeroConstant(
ir_context, transformation_context, component_type_id, is_irrelevant); ir_context, transformation_context, component_type_id, is_irrelevant);
@ -1040,23 +1034,21 @@ uint32_t MaybeGetZeroConstant(
return 0; return 0;
} }
auto component_count = type->AsVector() const auto component_count = type_inst->GetSingleWordInOperand(1);
? type->AsVector()->element_count()
: type->AsMatrix()->element_count();
return MaybeGetCompositeConstant( return MaybeGetCompositeConstant(
ir_context, transformation_context, ir_context, transformation_context,
std::vector<uint32_t>(component_count, component_id), std::vector<uint32_t>(component_count, component_id),
scalar_or_composite_type_id, is_irrelevant); scalar_or_composite_type_id, is_irrelevant);
} }
case opt::analysis::Type::kArray: { case SpvOpTypeArray: {
auto component_type_id = const auto component_type_id = type_inst->GetSingleWordInOperand(0);
ir_context->get_type_mgr()->GetId(type->AsArray()->element_type());
assert(component_type_id && "Component type is invalid");
auto component_id = MaybeGetZeroConstant( auto component_id = MaybeGetZeroConstant(
ir_context, transformation_context, component_type_id, is_irrelevant); ir_context, transformation_context, component_type_id, is_irrelevant);
if (component_id == 0 && is_irrelevant) { if (component_id == 0 && is_irrelevant) {
// Irrelevant constants can use either relevant or irrelevant
// constituents.
component_id = MaybeGetZeroConstant(ir_context, transformation_context, component_id = MaybeGetZeroConstant(ir_context, transformation_context,
component_type_id, false); component_type_id, false);
} }
@ -1065,12 +1057,6 @@ uint32_t MaybeGetZeroConstant(
return 0; return 0;
} }
auto type_id = ir_context->get_type_mgr()->GetId(type);
assert(type_id && "|type| is invalid");
const auto* type_inst = ir_context->get_def_use_mgr()->GetDef(type_id);
assert(type_inst && "Array's type id is invalid");
return MaybeGetCompositeConstant( return MaybeGetCompositeConstant(
ir_context, transformation_context, ir_context, transformation_context,
std::vector<uint32_t>(GetArraySize(*type_inst, ir_context), std::vector<uint32_t>(GetArraySize(*type_inst, ir_context),
@ -1113,10 +1099,7 @@ uint32_t MaybeGetCompositeConstant(
bool is_irrelevant) { bool is_irrelevant) {
const auto* type = ir_context->get_type_mgr()->GetType(composite_type_id); const auto* type = ir_context->get_type_mgr()->GetType(composite_type_id);
(void)type; // Make compilers happy in release mode. (void)type; // Make compilers happy in release mode.
assert(type && assert(IsCompositeType(type) && "|composite_type_id| is invalid");
(type->AsArray() || type->AsStruct() || type->AsVector() ||
type->AsMatrix()) &&
"|composite_type_id| is invalid");
for (const auto& inst : ir_context->types_values()) { for (const auto& inst : ir_context->types_values()) {
if (inst.opcode() == SpvOpConstantComposite && if (inst.opcode() == SpvOpConstantComposite &&