1// Copyright (c) 2019 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#ifndef SOURCE_FUZZ_TRANSFORMATION_SET_SELECTION_CONTROL_H_
16#define SOURCE_FUZZ_TRANSFORMATION_SET_SELECTION_CONTROL_H_
17
18#include "source/fuzz/protobufs/spirvfuzz_protobufs.h"
19#include "source/fuzz/transformation.h"
20#include "source/fuzz/transformation_context.h"
21#include "source/opt/ir_context.h"
22
23namespace spvtools {
24namespace fuzz {
25
26class TransformationSetSelectionControl : public Transformation {
27 public:
28  explicit TransformationSetSelectionControl(
29      protobufs::TransformationSetSelectionControl message);
30
31  TransformationSetSelectionControl(uint32_t block_id,
32                                    uint32_t selection_control);
33
34  // - |message_.block_id| must be a block containing an OpSelectionMerge
35  //   instruction.
36  // - |message_.selection_control| must be one of None, Flatten or
37  //   DontFlatten.
38  bool IsApplicable(
39      opt::IRContext* ir_context,
40      const TransformationContext& transformation_context) const override;
41
42  // - The selection control operand of the OpSelectionMergeInstruction in
43  //   |message_.block_id| is overwritten with |message_.selection_control|.
44  void Apply(opt::IRContext* ir_context,
45             TransformationContext* transformation_context) const override;
46
47  std::unordered_set<uint32_t> GetFreshIds() const override;
48
49  protobufs::Transformation ToMessage() const override;
50
51 private:
52  protobufs::TransformationSetSelectionControl message_;
53};
54
55}  // namespace fuzz
56}  // namespace spvtools
57
58#endif  // SOURCE_FUZZ_TRANSFORMATION_SET_SELECTION_CONTROL_H_
59