ARMSubtarget.cpp revision 31d157ae1ac2cd9c787dc3c1d28e64c682803844
131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- ARMSubtarget.cpp - ARM Subtarget Information ----------------------===//
2a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
3a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//                     The LLVM Compiler Infrastructure
4a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
8a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===//
9a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
105b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng// This file implements the ARM specific subclass of TargetSubtargetInfo.
11a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
12a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===//
13a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
14a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "ARMSubtarget.h"
15b72d2a92b75daa9cbac7338aff0cd8ae04c2b4bdEvan Cheng#include "ARMBaseRegisterInfo.h"
16e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng#include "llvm/GlobalValue.h"
175b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng#include "llvm/Target/TargetSubtargetInfo.h"
1854fc124d72512d65d62565cabcd85c7b07496513Bob Wilson#include "llvm/Support/CommandLine.h"
19c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin#include "llvm/ADT/SmallVector.h"
2094214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
2194214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng#define GET_SUBTARGETINFO_TARGET_DESC
22ebdeeab812beec0385b445f3d4c41a114e0d972fEvan Cheng#define GET_SUBTARGETINFO_CTOR
23385e930d55f3ecd3c9538823dfa5896a12461845Evan Cheng#include "ARMGenSubtargetInfo.inc"
2494214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
25a8e2989ece6dc46df59b0768184028257f913843Evan Chengusing namespace llvm;
26a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
2754fc124d72512d65d62565cabcd85c7b07496513Bob Wilsonstatic cl::opt<bool>
2854fc124d72512d65d62565cabcd85c7b07496513Bob WilsonReserveR9("arm-reserve-r9", cl::Hidden,
2954fc124d72512d65d62565cabcd85c7b07496513Bob Wilson          cl::desc("Reserve R9, making it unavailable as GPR"));
3054fc124d72512d65d62565cabcd85c7b07496513Bob Wilson
315cdc3a949af0cef7f2163f8a7acbf3049c226321Anton Korobeynikovstatic cl::opt<bool>
3253519f015e3e84e9f57b677cc8724805a6009b73Evan ChengDarwinUseMOVT("arm-darwin-use-movt", cl::init(true), cl::Hidden);
335cdc3a949af0cef7f2163f8a7acbf3049c226321Anton Korobeynikov
3402aba73a9ec04d0de9424422249af3948ca9573aBob Wilsonstatic cl::opt<bool>
3502aba73a9ec04d0de9424422249af3948ca9573aBob WilsonStrictAlign("arm-strict-align", cl::Hidden,
3602aba73a9ec04d0de9424422249af3948ca9573aBob Wilson            cl::desc("Disallow all unaligned memory accesses"));
3702aba73a9ec04d0de9424422249af3948ca9573aBob Wilson
38276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan ChengARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU,
3994ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng                           const std::string &FS)
400ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  : ARMGenSubtargetInfo(TT, CPU, FS)
413ef1c8759a20167457eb7fd82ebcaffe7ccaa1d1Evan Cheng  , ARMProcFamily(Others)
4239dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng  , HasV4TOps(false)
4339dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng  , HasV5TOps(false)
4439dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng  , HasV5TEOps(false)
4539dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng  , HasV6Ops(false)
4639dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng  , HasV6T2Ops(false)
4739dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng  , HasV7Ops(false)
4839dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng  , HasVFPv2(false)
4939dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng  , HasVFPv3(false)
504b4e62219be91839091f9e35d8accf877f925d81Anton Korobeynikov  , HasVFPv4(false)
5139dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng  , HasNEON(false)
524b4e62219be91839091f9e35d8accf877f925d81Anton Korobeynikov  , HasNEONVFPv4(false)
537ec7a0e96b34fedf11445c1dde27a4fac8e8a1a7Jim Grosbach  , UseNEONForSinglePrecisionFP(false)
5448575f6ea7d5cd21ab29ca370f58fcf9ca31400bEvan Cheng  , SlowFPVMLx(false)
550e3ee43ea058a35ab5ce69cceafd316d49eaad34Benjamin Kramer  , HasVMLxForwarding(false)
569de1ac267e197d40cec7a14041f2bf69498536c9Evan Cheng  , SlowFPBrcc(false)
57963b03c1a9f6a9742671459f103ee9a566c6de58Evan Cheng  , InThumbMode(false)
5894ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng  , HasThumb2(false)
59acad68da50581de905a994ed3c6b9c197bcea687James Molloy  , IsMClass(false)
607b4d31176efe6894bcfaa05257dd5783acda5ddcEvan Cheng  , NoARM(false)
610dad89fa94536284d51f60868326294b725a0c61David Goodwin  , PostRAScheduler(false)
6254fc124d72512d65d62565cabcd85c7b07496513Bob Wilson  , IsR9Reserved(ReserveR9)
635de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  , UseMovt(false)
646d2f9cec715c50bca44816d9bdea97f8b63bf2a0Bob Wilson  , SupportsTailCall(false)
65631379e79c0971c5bac13629b8caf8912ed4c35cAnton Korobeynikov  , HasFP16(false)
6677f42b52781b6923924a93b8ab338d183887a592Bob Wilson  , HasD16(false)
6729402132f3e890a2771818f44987ede213297431Jim Grosbach  , HasHardwareDivide(false)
6829402132f3e890a2771818f44987ede213297431Jim Grosbach  , HasT2ExtractPack(false)
6911db068721d44fd5f9b0c2a3a4c90f813d2eae9cEvan Cheng  , HasDataBarrier(false)
709de1ac267e197d40cec7a14041f2bf69498536c9Evan Cheng  , Pref32BitThumb(false)
715dde893c2bac9e1569c38429f756c1d723e8edf2Bob Wilson  , AvoidCPSRPartialUpdate(false)
72dfed19fe2c34c1209108afa58e8ab014ffd894e2Evan Cheng  , HasMPExtension(false)
73fcba5e6b645df89ae6b93911fe0f80b08fa6b44cJim Grosbach  , FPOnlySP(false)
7402aba73a9ec04d0de9424422249af3948ca9573aBob Wilson  , AllowsUnalignedMem(false)
75a7603982dbf9e240ecc7ed6eddcd1cdb868107acJim Grosbach  , Thumb2DSP(false)
763630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  , stackAlignment(4)
77276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  , CPUString(CPU)
78b72d2a92b75daa9cbac7338aff0cd8ae04c2b4bdEvan Cheng  , TargetTriple(TT)
793630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  , TargetABI(ARM_ABI_APCS) {
80a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  // Determine default and user specified characteristics
81276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng  if (CPUString.empty())
82276365dd4bc0c2160f91fd8062ae1fc90c86c324Evan Cheng    CPUString = "generic";
834b1747430a2d67702958b95d6776396734f184a0Evan Cheng
844cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng  // Insert the architecture feature derived from the target triple into the
854cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng  // feature string. This is important for setting features that are implied
864cc446bc400b2ff58af81c91f5e145b81d6beb26Evan Cheng  // based on the architecture version.
87db068738e806753bc5735434cab9b9f930840c7aEvan Cheng  std::string ArchFS = ARM_MC::ParseARMTriple(TT);
8894ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng  if (!FS.empty()) {
8994ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng    if (!ArchFS.empty())
9094ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng      ArchFS = ArchFS + "," + FS;
9194ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng    else
9294ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng      ArchFS = FS;
9394ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng  }
940ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  ParseSubtargetFeatures(CPUString, ArchFS);
9594ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng
9694ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng  // Thumb2 implies at least V6T2. FIXME: Fix tests to explicitly specify a
9794ca42ff0407d71bacc41de4032d8dbe6358d33dEvan Cheng  // ARM version or CPU and then remove this.
9839dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng  if (!HasV6T2Ops && hasThumb2())
9939dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng    HasV4TOps = HasV5TOps = HasV5TEOps = HasV6Ops = HasV6T2Ops = true;
10066f6c79450a93d979128d8702c83841c8f715dc8Bob Wilson
10194214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng  // Initialize scheduling itinerary for the specified CPU.
10294214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng  InstrItins = getInstrItineraryForCPU(CPUString);
10394214703d97d8d9dfca88174ffc7e94820a85e62Evan Cheng
1042da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  // After parsing Itineraries, set ItinData.IssueWidth.
1052da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  computeIssueWidth();
1062da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick
1070ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng  if (TT.find("eabi") != std::string::npos)
1080ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng    TargetABI = ARM_ABI_AAPCS;
1090ddff1b5359433faf2eb1c4ff5320ddcbd42f52fEvan Cheng
1103630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  if (isAAPCS_ABI())
1113630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio    stackAlignment = 8;
1123630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio
113afff941211526a31f931aa9fcac84ae42ff60ef0Evan Cheng  if (!isTargetIOS())
1145de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng    UseMovt = hasV6T2Ops();
1155de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  else {
11639dfb0ff848be6b380ca81ff95d4ca4e0ae09c76Evan Cheng    IsR9Reserved = ReserveR9 | !HasV6Ops;
11753519f015e3e84e9f57b677cc8724805a6009b73Evan Cheng    UseMovt = DarwinUseMOVT && hasV6T2Ops();
1186d2f9cec715c50bca44816d9bdea97f8b63bf2a0Bob Wilson    const Triple &T = getTargetTriple();
119afff941211526a31f931aa9fcac84ae42ff60ef0Evan Cheng    SupportsTailCall = !T.isOSVersionLT(5, 0);
1205de5d4b6d0eb3fd379fa571d82f6fa764460b3b8Evan Cheng  }
121471850ab84301dd47cab2bf8d694fcb5766c1169David Goodwin
122d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng  if (!isThumb() || hasThumb2())
123d3dd50fec00fbbb76edbfaff4d613f1248d21c9eEvan Cheng    PostRAScheduler = true;
12402aba73a9ec04d0de9424422249af3948ca9573aBob Wilson
12502aba73a9ec04d0de9424422249af3948ca9573aBob Wilson  // v6+ may or may not support unaligned mem access depending on the system
12602aba73a9ec04d0de9424422249af3948ca9573aBob Wilson  // configuration.
12702aba73a9ec04d0de9424422249af3948ca9573aBob Wilson  if (!StrictAlign && hasV6Ops() && isTargetDarwin())
12802aba73a9ec04d0de9424422249af3948ca9573aBob Wilson    AllowsUnalignedMem = true;
129a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}
130e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng
131e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng/// GVIsIndirectSymbol - true if the GV will be accessed via an indirect symbol.
13263476a80404125e5196b6c09113c1d4796da0604Evan Chengbool
13346510a73e977273ec67747eb34cbdb43f815e451Dan GohmanARMSubtarget::GVIsIndirectSymbol(const GlobalValue *GV,
13446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman                                 Reloc::Model RelocM) const {
13563476a80404125e5196b6c09113c1d4796da0604Evan Cheng  if (RelocM == Reloc::Static)
136e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng    return false;
13763476a80404125e5196b6c09113c1d4796da0604Evan Cheng
138f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  // Materializable GVs (in JIT lazy compilation mode) do not require an extra
139f0356fe140af1a30587b9a86bcfb1b2c51b8ce20Jeffrey Yasskin  // load from stub.
140af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng  bool isDecl = GV->hasAvailableExternallyLinkage();
141af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng  if (GV->isDeclaration() && !GV->isMaterializable())
142af05c69ba024b1838ae6f1071d6fd0f9fe33999fEvan Cheng    isDecl = true;
14363476a80404125e5196b6c09113c1d4796da0604Evan Cheng
14463476a80404125e5196b6c09113c1d4796da0604Evan Cheng  if (!isTargetDarwin()) {
14563476a80404125e5196b6c09113c1d4796da0604Evan Cheng    // Extra load is needed for all externally visible.
14663476a80404125e5196b6c09113c1d4796da0604Evan Cheng    if (GV->hasLocalLinkage() || GV->hasHiddenVisibility())
14763476a80404125e5196b6c09113c1d4796da0604Evan Cheng      return false;
14863476a80404125e5196b6c09113c1d4796da0604Evan Cheng    return true;
14963476a80404125e5196b6c09113c1d4796da0604Evan Cheng  } else {
15063476a80404125e5196b6c09113c1d4796da0604Evan Cheng    if (RelocM == Reloc::PIC_) {
15163476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // If this is a strong reference to a definition, it is definitely not
15263476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // through a stub.
15363476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!isDecl && !GV->isWeakForLinker())
15463476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return false;
15563476a80404125e5196b6c09113c1d4796da0604Evan Cheng
15663476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // Unless we have a symbol with hidden visibility, we have to go through a
15763476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // normal $non_lazy_ptr stub because this symbol might be resolved late.
15863476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!GV->hasHiddenVisibility())  // Non-hidden $non_lazy_ptr reference.
15963476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return true;
16063476a80404125e5196b6c09113c1d4796da0604Evan Cheng
16163476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // If symbol visibility is hidden, we have a stub for common symbol
16263476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // references and external declarations.
16363476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (isDecl || GV->hasCommonLinkage())
16463476a80404125e5196b6c09113c1d4796da0604Evan Cheng        // Hidden $non_lazy_ptr reference.
16563476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return true;
16663476a80404125e5196b6c09113c1d4796da0604Evan Cheng
16763476a80404125e5196b6c09113c1d4796da0604Evan Cheng      return false;
16863476a80404125e5196b6c09113c1d4796da0604Evan Cheng    } else {
16963476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // If this is a strong reference to a definition, it is definitely not
17063476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // through a stub.
17163476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!isDecl && !GV->isWeakForLinker())
17263476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return false;
1736e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
17463476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // Unless we have a symbol with hidden visibility, we have to go through a
17563476a80404125e5196b6c09113c1d4796da0604Evan Cheng      // normal $non_lazy_ptr stub because this symbol might be resolved late.
17663476a80404125e5196b6c09113c1d4796da0604Evan Cheng      if (!GV->hasHiddenVisibility())  // Non-hidden $non_lazy_ptr reference.
17763476a80404125e5196b6c09113c1d4796da0604Evan Cheng        return true;
17863476a80404125e5196b6c09113c1d4796da0604Evan Cheng    }
17963476a80404125e5196b6c09113c1d4796da0604Evan Cheng  }
18063476a80404125e5196b6c09113c1d4796da0604Evan Cheng
18163476a80404125e5196b6c09113c1d4796da0604Evan Cheng  return false;
182e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng}
183c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin
184654d5440a477b1f6c89b051107e041a331f78e27Owen Andersonunsigned ARMSubtarget::getMispredictionPenalty() const {
185654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson  // If we have a reasonable estimate of the pipeline depth, then we can
186654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson  // estimate the penalty of a misprediction based on that.
187654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson  if (isCortexA8())
188654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson    return 13;
189654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson  else if (isCortexA9())
190654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson    return 8;
1916e8f4c404825b79f9b9176483653f1aa927dfbdeAndrew Trick
192654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson  // Otherwise, just return a sensible default.
193654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson  return 10;
194654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson}
195654d5440a477b1f6c89b051107e041a331f78e27Owen Anderson
1962da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trickvoid ARMSubtarget::computeIssueWidth() {
1972da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  unsigned allStage1Units = 0;
1982da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  for (const InstrItinerary *itin = InstrItins.Itineraries;
1992da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick       itin->FirstStage != ~0U; ++itin) {
2002da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick    const InstrStage *IS = InstrItins.Stages + itin->FirstStage;
2012da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick    allStage1Units |= IS->getUnits();
2022da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  }
2032da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  InstrItins.IssueWidth = 0;
2042da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  while (allStage1Units) {
2052da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick    ++InstrItins.IssueWidth;
2062da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick    // clear the lowest bit
2072da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick    allStage1Units ^= allStage1Units & ~(allStage1Units - 1);
2082da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick  }
2096018deefe823598a3bbe03de9af354d269ae2130Andrew Trick  assert(InstrItins.IssueWidth <= 2 && "itinerary bug, too many stage 1 units");
2102da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick}
2112da8bc8a5f7705ac131184cd247f48500da0d74eAndrew Trick
212c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwinbool ARMSubtarget::enablePostRAScheduler(
213c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin           CodeGenOpt::Level OptLevel,
2145b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng           TargetSubtargetInfo::AntiDepBreakMode& Mode,
21587d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin           RegClassVector& CriticalPathRCs) const {
2165b1b4489cf3a0f56f8be0673fc5cc380a32d277bEvan Cheng  Mode = TargetSubtargetInfo::ANTIDEP_CRITICAL;
21787d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin  CriticalPathRCs.clear();
21887d21b92fc42f6b3bd8567a83fc5b5191c1205e5David Goodwin  CriticalPathRCs.push_back(&ARM::GPRRegClass);
219c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin  return PostRAScheduler && OptLevel >= CodeGenOpt::Default;
220c2e8a7e8d2ab156afaa8ab0d0317dd9ee3db7d30David Goodwin}
221