16948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//===-------------------------- TargetRecip.cpp ---------------------------===//
26948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//
36948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
46948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//
56948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
66948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// License. See LICENSE.TXT for details.
76948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//
86948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
96948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//
106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// This class is used to customize machine-specific reciprocal estimate code
116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// generation in a target-independent way.
126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// If a target does not support operations in this specification, then code
136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// generation will default to using supported operations.
146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//
156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Target/TargetRecip.h"
186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/ADT/STLExtras.h"
19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/StringRef.h"
206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/Support/ErrorHandling.h"
216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarusing namespace llvm;
236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// These are the names of the individual reciprocal operations. These are
256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// the key strings for queries and command-line inputs.
266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// In addition, the command-line interface recognizes the global parameters
276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// "all", "none", and "default".
28f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstatic const char *const RecipOps[] = {
296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  "divd",
306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  "divf",
316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  "vec-divd",
326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  "vec-divf",
336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  "sqrtd",
346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  "sqrtf",
356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  "vec-sqrtd",
366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  "vec-sqrtf",
376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar};
386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// The uninitialized state is needed for the enabled settings and refinement
406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// steps because custom settings may arrive via the command-line before target
416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// defaults are set.
426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarTargetRecip::TargetRecip() {
436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned NumStrings = llvm::array_lengthof(RecipOps);
446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  for (unsigned i = 0; i < NumStrings; ++i)
456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    RecipMap.insert(std::make_pair(RecipOps[i], RecipParams()));
466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
48f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarstatic bool parseRefinementStep(StringRef In, size_t &Position,
496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                                uint8_t &Value) {
506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  const char RefStepToken = ':';
516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  Position = In.find(RefStepToken);
526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Position == StringRef::npos)
536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return false;
546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  StringRef RefStepString = In.substr(Position + 1);
566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // Allow exactly one numeric character for the additional refinement
576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // step parameter.
586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (RefStepString.size() == 1) {
596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    char RefStepChar = RefStepString[0];
606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (RefStepChar >= '0' && RefStepChar <= '9') {
616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Value = RefStepChar - '0';
626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return true;
636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  report_fatal_error("Invalid refinement step for -recip.");
666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool TargetRecip::parseGlobalParams(const std::string &Arg) {
696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  StringRef ArgSub = Arg;
706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // Look for an optional setting of the number of refinement steps needed
726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // for this type of reciprocal operation.
736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  size_t RefPos;
746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  uint8_t RefSteps;
756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  StringRef RefStepString;
766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (parseRefinementStep(ArgSub, RefPos, RefSteps)) {
776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // Split the string for further processing.
786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    RefStepString = ArgSub.substr(RefPos + 1);
796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    ArgSub = ArgSub.substr(0, RefPos);
806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool Enable;
826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  bool UseDefaults;
836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (ArgSub == "all") {
846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    UseDefaults = false;
856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Enable = true;
866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  } else if (ArgSub == "none") {
876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    UseDefaults = false;
886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Enable = false;
896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  } else if (ArgSub == "default") {
906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    UseDefaults = true;
916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  } else {
926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // Any other string is invalid or an individual setting.
936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return false;
946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // All enable values will be initialized to target defaults if 'default' was
976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // specified.
986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (!UseDefaults)
996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    for (auto &KV : RecipMap)
1006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      KV.second.Enabled = Enable;
1016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // Custom refinement count was specified with all, none, or default.
1036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (!RefStepString.empty())
1046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    for (auto &KV : RecipMap)
1056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      KV.second.RefinementSteps = RefSteps;
1066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return true;
1086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
1096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarvoid TargetRecip::parseIndividualParams(const std::vector<std::string> &Args) {
1116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  static const char DisabledPrefix = '!';
1126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned NumArgs = Args.size();
1136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  for (unsigned i = 0; i != NumArgs; ++i) {
1156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    StringRef Val = Args[i];
1166948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    bool IsDisabled = Val[0] == DisabledPrefix;
1186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // Ignore the disablement token for string matching.
1196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (IsDisabled)
1206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Val = Val.substr(1);
1216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    size_t RefPos;
1236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    uint8_t RefSteps;
1246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    StringRef RefStepString;
1256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (parseRefinementStep(Val, RefPos, RefSteps)) {
1266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      // Split the string for further processing.
1276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      RefStepString = Val.substr(RefPos + 1);
1286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Val = Val.substr(0, RefPos);
1296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
1306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    RecipIter Iter = RecipMap.find(Val);
1326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (Iter == RecipMap.end()) {
1336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      // Try again specifying float suffix.
1346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Iter = RecipMap.find(Val.str() + 'f');
1356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      if (Iter == RecipMap.end()) {
1366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        Iter = RecipMap.find(Val.str() + 'd');
1376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        assert(Iter == RecipMap.end() && "Float entry missing from map");
1386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        report_fatal_error("Invalid option for -recip.");
1396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      }
1406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      // The option was specified without a float or double suffix.
1426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      if (RecipMap[Val.str() + 'd'].Enabled != Uninitialized) {
1436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        // Make sure that the double entry was not already specified.
1446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        // The float entry will be checked below.
1456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        report_fatal_error("Duplicate option for -recip.");
1466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      }
1476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
1486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (Iter->second.Enabled != Uninitialized)
1506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      report_fatal_error("Duplicate option for -recip.");
1516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // Mark the matched option as found. Do not allow duplicate specifiers.
1536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    Iter->second.Enabled = !IsDisabled;
1546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (!RefStepString.empty())
1556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      Iter->second.RefinementSteps = RefSteps;
1566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    // If the precision was not specified, the double entry is also initialized.
1586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (Val.back() != 'f' && Val.back() != 'd') {
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      RecipParams &Params = RecipMap[Val.str() + 'd'];
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Params.Enabled = !IsDisabled;
1616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      if (!RefStepString.empty())
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        Params.RefinementSteps = RefSteps;
1636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
1646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
1656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
1666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga NainarTargetRecip::TargetRecip(const std::vector<std::string> &Args) :
1686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  TargetRecip() {
1696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  unsigned NumArgs = Args.size();
1706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  // Check if "all", "default", or "none" was specified.
1726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (NumArgs == 1 && parseGlobalParams(Args[0]))
1736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    return;
1746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  parseIndividualParams(Args);
1766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
1776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
178f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool TargetRecip::isEnabled(StringRef Key) const {
1796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ConstRecipIter Iter = RecipMap.find(Key);
1806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  assert(Iter != RecipMap.end() && "Unknown name for reciprocal map");
1816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  assert(Iter->second.Enabled != Uninitialized &&
1826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar         "Enablement setting was not initialized");
1836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return Iter->second.Enabled;
1846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
1856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
186f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarunsigned TargetRecip::getRefinementSteps(StringRef Key) const {
1876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  ConstRecipIter Iter = RecipMap.find(Key);
1886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  assert(Iter != RecipMap.end() && "Unknown name for reciprocal map");
1896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  assert(Iter->second.RefinementSteps != Uninitialized &&
1906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar         "Refinement step setting was not initialized");
1916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return Iter->second.RefinementSteps;
1926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
1936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar/// Custom settings (previously initialized values) override target defaults.
195f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarvoid TargetRecip::setDefaults(StringRef Key, bool Enable,
1966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar                              unsigned RefSteps) {
1976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  if (Key == "all") {
1986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    for (auto &KV : RecipMap) {
1996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      RecipParams &RP = KV.second;
2006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      if (RP.Enabled == Uninitialized)
2016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        RP.Enabled = Enable;
2026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      if (RP.RefinementSteps == Uninitialized)
2036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar        RP.RefinementSteps = RefSteps;
2046948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    }
2056948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  } else {
2066948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    RecipParams &RP = RecipMap[Key];
2076948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (RP.Enabled == Uninitialized)
2086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      RP.Enabled = Enable;
2096948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (RP.RefinementSteps == Uninitialized)
2106948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      RP.RefinementSteps = RefSteps;
2116948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
2126948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
2136948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
2146948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarbool TargetRecip::operator==(const TargetRecip &Other) const {
2156948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  for (const auto &KV : RecipMap) {
216f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    StringRef Op = KV.first;
2176948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    const RecipParams &RP = KV.second;
2186948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    const RecipParams &OtherRP = Other.RecipMap.find(Op)->second;
2196948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (RP.RefinementSteps != OtherRP.RefinementSteps)
2206948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return false;
2216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    if (RP.Enabled != OtherRP.Enabled)
2226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      return false;
2236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  }
2246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return true;
2256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
226