Sched itinerary fix: Avoid static initializers.
authorAndrew Trick <atrick@apple.com>
Fri, 8 Jun 2012 18:25:47 +0000 (18:25 +0000)
committerAndrew Trick <atrick@apple.com>
Fri, 8 Jun 2012 18:25:47 +0000 (18:25 +0000)
This fixes an accidental dependence on static initialization order that I introduced yesterday.

Thank you Lang!!!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@158215 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCInstrItineraries.h
utils/TableGen/SubtargetEmitter.cpp

index 62e19143482de5e3f4d69a222c9fd83d0f78cc9f..05baddd918adf9ff18460b33ed049ad5621ea1ac 100644 (file)
@@ -111,6 +111,7 @@ struct InstrItineraryProps {
   // IssueWidth is the maximum number of instructions that may be scheduled in
   // the same per-cycle group.
   unsigned IssueWidth;
+  static const unsigned DefaultIssueWidth = 1;
 
   // MinLatency is the minimum latency between a register write
   // followed by a data dependent read. This determines which
@@ -133,12 +134,14 @@ struct InstrItineraryProps {
   //      Optional InstrItinerary OperandCycles provides expected latency.
   //      TODO: can't yet specify both min and expected latency per operand.
   int MinLatency;
+  static const unsigned DefaultMinLatency = -1;
 
   // LoadLatency is the expected latency of load instructions.
   //
   // If MinLatency >= 0, this may be overriden for individual load opcodes by
   // InstrItinerary OperandCycles.
   unsigned LoadLatency;
+  static const unsigned DefaultLoadLatency = 4;
 
   // HighLatency is the expected latency of "very high latency" operations.
   // See TargetInstrInfo::isHighLatencyDef().
@@ -146,9 +149,16 @@ struct InstrItineraryProps {
   // likely to have some impact on scheduling heuristics.
   // If MinLatency >= 0, this may be overriden by InstrItinData OperandCycles.
   unsigned HighLatency;
-
-  InstrItineraryProps(): IssueWidth(1), MinLatency(-1), LoadLatency(4),
-                         HighLatency(10) {}
+  static const unsigned DefaultHighLatency = 10;
+
+  // Default's must be specified as static const literals so that tablegenerated
+  // target code can use it in static initializers. The defaults need to be
+  // initialized in this default ctor because some clients directly instantiate
+  // InstrItineraryData instead of using a generated itinerary.
+  InstrItineraryProps(): IssueWidth(DefaultMinLatency),
+                         MinLatency(DefaultMinLatency),
+                         LoadLatency(DefaultLoadLatency),
+                         HighLatency(DefaultHighLatency) {}
 
   InstrItineraryProps(unsigned iw, int ml, unsigned ll, unsigned hl):
     IssueWidth(iw), MinLatency(ml), LoadLatency(ll), HighLatency(hl) {}
index 764fc88c2e50c1e6f1b0a31d31b64ec4d9040163..5911d9856f669c135fd9d595bfc45e1d3f757430 100644 (file)
@@ -485,7 +485,7 @@ void SubtargetEmitter::EmitItineraryProp(raw_ostream &OS, const Record *R,
   if (V >= 0)
     OS << V << Separator << " // " << Name;
   else
-    OS << "DefaultItineraryProps." << Name << Separator;
+    OS << "InstrItineraryProps::Default" << Name << Separator;
   OS << '\n';
 }
 
@@ -496,7 +496,6 @@ void SubtargetEmitter::
 EmitProcessorData(raw_ostream &OS,
                   std::vector<Record*> &ItinClassList,
                   std::vector<std::vector<InstrItinerary> > &ProcList) {
-  OS << "static const llvm::InstrItineraryProps " << "DefaultItineraryProps;";
 
   // Get an iterator for processor itinerary stages
   std::vector<std::vector<InstrItinerary> >::iterator