mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-10-18 19:20:05 +00:00
parent
12df3cafee
commit
1341b58a86
@ -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)) {
|
||||||
|
@ -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 &&
|
||||||
|
Loading…
Reference in New Issue
Block a user