//===- Scalarizer.h --- Scalarize vector operations -----------------------===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===----------------------------------------------------------------------===//
 
//
 
/// \file
 
/// This pass converts vector operations into scalar operations, in order
 
/// to expose optimization opportunities on the individual scalar operations.
 
/// It is mainly intended for targets that do not have vector units, but it
 
/// may also be useful for revectorizing code to different vector widths.
 
//
 
//===----------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_TRANSFORMS_SCALAR_SCALARIZER_H
 
#define LLVM_TRANSFORMS_SCALAR_SCALARIZER_H
 
 
 
#include "llvm/IR/PassManager.h"
 
#include <optional>
 
 
 
namespace llvm {
 
 
 
class Function;
 
class FunctionPass;
 
 
 
struct ScalarizerPassOptions {
 
  // These optional booleans correspond 1:1 to cl::opt<bool> options defined in
 
  // Scalarizer.cpp. When the cl::opt are specified, they take precedence.
 
  // When the cl::opt are not specified, the present optional booleans allow to
 
  // override the cl::opt's default values.
 
  std::optional<bool> ScalarizeVariableInsertExtract;
 
  std::optional<bool> ScalarizeLoadStore;
 
};
 
 
 
class ScalarizerPass : public PassInfoMixin<ScalarizerPass> {
 
  ScalarizerPassOptions Options;
 
 
 
public:
 
  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
 
 
 
  void setScalarizeVariableInsertExtract(bool Value) {
 
    Options.ScalarizeVariableInsertExtract = Value;
 
  }
 
  void setScalarizeLoadStore(bool Value) { Options.ScalarizeLoadStore = Value; }
 
};
 
 
 
/// Create a legacy pass manager instance of the Scalarizer pass
 
FunctionPass *createScalarizerPass();
 
 
 
}
 
 
 
#endif /* LLVM_TRANSFORMS_SCALAR_SCALARIZER_H */