// Copyright (c) 2020 Stefano Milizia
// Copyright (c) 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef SOURCE_FUZZ_TRANSFORMATION_RECORD_SYNONYMOUS_CONSTANTS_H
#define SOURCE_FUZZ_TRANSFORMATION_RECORD_SYNONYMOUS_CONSTANTS_H

#include "source/fuzz/transformation.h"

namespace spvtools {
namespace fuzz {

class TransformationRecordSynonymousConstants : public Transformation {
 public:
  explicit TransformationRecordSynonymousConstants(
      const protobufs::TransformationRecordSynonymousConstants& message);

  TransformationRecordSynonymousConstants(uint32_t constant1_id,
                                          uint32_t constant2_id);

  // - |message_.constant_id| and |message_.synonym_id| are distinct ids
  //   of constants
  // - |message_.constant_id| and |message_.synonym_id| refer to constants
  //   that are equal or equivalent.
  //   TODO(https://github.com/KhronosGroup/SPIRV-Tools/issues/3536): Signed and
  //   unsigned integers are currently considered non-equivalent
  //   Two integers with the same width and value are equal, even if one is
  //   signed and the other is not.
  //   Constants are equivalent:
  //   - if both of them represent zero-like values of the same type
  //   - if they are composite constants with the same type and their
  //     components are pairwise equivalent.
  bool IsApplicable(
      opt::IRContext* ir_context,
      const TransformationContext& transformation_context) const override;

  // Adds the fact that |message_.constant_id| and |message_.synonym_id|
  // are synonyms to the fact manager. The module is not changed.
  void Apply(opt::IRContext* ir_context,
             TransformationContext* transformation_context) const override;

  protobufs::Transformation ToMessage() const override;

 private:
  protobufs::TransformationRecordSynonymousConstants message_;

  // Returns true if the two given constants are equivalent
  // (the description of IsApplicable specifies the conditions they must satisfy
  // to be considered equivalent)
  static bool AreEquivalentConstants(opt::IRContext* ir_context,
                                     uint32_t constant_id1,
                                     uint32_t constant_id2);
};

}  // namespace fuzz
}  // namespace spvtools

#endif  // SOURCE_FUZZ_TRANSFORMATION_RECORD_SYNONYMOUS_CONSTANTS
