// Copyright (c) 2018 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 LIBSPIRV_OPT_REDUCE_LOAD_SIZE_H_
#define LIBSPIRV_OPT_REDUCE_LOAD_SIZE_H_

#include "ir_context.h"
#include "module.h"
#include "pass.h"

namespace spvtools {
namespace opt {

// See optimizer.hpp for documentation.
class ReduceLoadSize : public Pass {
 public:
  const char* name() const override { return "reduce-load-size"; }
  Status Process(ir::IRContext* irContext) override;

  // Return the mask of preserved Analyses.
  ir::IRContext::Analysis GetPreservedAnalyses() override {
    return ir::IRContext::kAnalysisInstrToBlockMapping |
           ir::IRContext::kAnalysisCombinators | ir::IRContext::kAnalysisCFG |
           ir::IRContext::kAnalysisDominatorAnalysis |
           ir::IRContext::kAnalysisLoopAnalysis |
           ir::IRContext::kAnalysisNameMap;
  }

 private:
  // Replaces |inst|, which must be an OpCompositeExtract instruction, with
  // an OpAccessChain and a load if possible.  This happens only if it is a load
  // feeding |inst|.  Returns true if the substitution happened.  The position
  // of the new instructions will be in the same place as the load feeding the
  // extract.
  bool ReplaceExtract(ir::Instruction* inst);

  // Returns true if the OpCompositeExtract instruction |inst| should be replace
  // or not.  This is determined by looking at the load that feeds |inst| if
  // it is a load.  |should_replace_cache_| is used to cache the results based
  // on the load feeding |inst|.
  bool ShouldReplaceExtract(ir::Instruction* inst);

  // Maps the result id of an OpLoad instruction to the result of whether or
  // not the OpCompositeExtract that use the id should be replaced.
  std::unordered_map<uint32_t, bool> should_replace_cache_;
};

}  // namespace opt
}  // namespace spvtools

#endif  // LIBSPIRV_OPT_REDUCE_LOAD_SIZE_H_
