[llvm-commits] [vector_llvm] CVS: llvm/include/llvm/Target/SubtargetFeature.h TargetInstrInfo.h TargetInstrItineraries.h TargetLowering.h TargetMachine.h

Robert Bocchino bocchino at cs.uiuc.edu
Wed Nov 16 10:32:09 PST 2005



Changes in directory llvm/include/llvm/Target:

SubtargetFeature.h updated: 1.3 -> 1.3.2.1
TargetInstrInfo.h updated: 1.80 -> 1.80.2.1
TargetInstrItineraries.h added (r1.6.2.2)
TargetLowering.h updated: 1.24 -> 1.24.2.1
TargetMachine.h updated: 1.57 -> 1.57.2.1
---
Log message:

Merged mainline into Vector LLVM branch


---
Diffs of the changes:  (+165 -81)

 SubtargetFeature.h       |  109 ++++++++++++++---------------------------------
 TargetInstrInfo.h        |    1 
 TargetInstrItineraries.h |   84 ++++++++++++++++++++++++++++++++++++
 TargetLowering.h         |   37 +++++++++++++++
 TargetMachine.h          |   15 +++++-
 5 files changed, 165 insertions(+), 81 deletions(-)


Index: llvm/include/llvm/Target/SubtargetFeature.h
diff -u llvm/include/llvm/Target/SubtargetFeature.h:1.3 llvm/include/llvm/Target/SubtargetFeature.h:1.3.2.1
--- llvm/include/llvm/Target/SubtargetFeature.h:1.3	Fri Sep  2 14:27:43 2005
+++ llvm/include/llvm/Target/SubtargetFeature.h	Wed Nov 16 12:31:58 2005
@@ -18,11 +18,9 @@
 #ifndef LLVM_TARGET_SUBTARGETFEATURE_H
 #define LLVM_TARGET_SUBTARGETFEATURE_H
 
-
 #include <string>
 #include <vector>
-#include <iostream>
-#include <cassert>
+#include <iosfwd>
 #include "llvm/Support/DataTypes.h"
 
 namespace llvm {
@@ -45,6 +43,21 @@
   
 //===----------------------------------------------------------------------===//
 ///
+/// SubtargetInfoKV - Used to provide key value pairs for CPU and arbitrary
+/// pointers.
+//
+struct SubtargetInfoKV {
+  const char *Key;                      // K-V key string
+  void *Value;                          // K-V pointer value
+  
+  // Compare routine for std binary search
+  bool operator<(const std::string &S) const {
+    return strcmp(Key, S.c_str()) < 0;
+  }
+};
+  
+//===----------------------------------------------------------------------===//
+///
 /// SubtargetFeatures - Manages the enabling and disabling of subtarget 
 /// specific features.  Features are encoded as a string of the form
 ///   "cpu,+attr1,+attr2,-attr3,...,+attrN"
@@ -57,87 +70,31 @@
 ///
 
 class SubtargetFeatures {
-private:
   std::vector<std::string> Features;    // Subtarget features as a vector
-
-  // Determine if a feature has a flag; '+' or '-'
-  static inline bool hasFlag(const std::string &Feature) {
-    assert(!Feature.empty() && "Empty string");
-    // Get first character
-    char Ch = Feature[0];
-    // Check if first character is '+' or '-' flag
-    return Ch == '+' || Ch =='-';
-  }
-  
-  // Return true if enable flag; '+'.
-  static inline bool isEnabled(const std::string &Feature) {
-    assert(!Feature.empty() && "Empty string");
-    // Get first character
-    char Ch = Feature[0];
-    // Check if first character is '+' for enabled
-    return Ch == '+';
-  }
-  
-  // Return a string with a prepended flag; '+' or '-'.
-  static inline std::string PrependFlag(const std::string &Feature,
-                                        bool IsEnabled) {
-    assert(!Feature.empty() && "Empty string");
-    if (hasFlag(Feature)) return Feature;
-    return std::string(IsEnabled ? "+" : "-") + Feature;
-  }
-  
-  // Return string stripped of flag.
-  static inline std::string StripFlag(const std::string &Feature) {
-    return hasFlag(Feature) ? Feature.substr(1) : Feature;
-  }
-
-  /// Splits a string of comma separated items in to a vector of strings.
-  static void Split(std::vector<std::string> &V, const std::string &S);
-  
-  /// Join a vector of strings into a string with a comma separating each
-  /// item.
-  static std::string Join(const std::vector<std::string> &V);
-  
-  /// Convert a string to lowercase.
-  static std::string toLower(const std::string &S);
-  
-  /// Find item in array using binary search.
-  static const SubtargetFeatureKV *Find(const std::string &S,
-                                        const SubtargetFeatureKV *A, size_t L);
-
 public:
-  /// Ctor.
-  SubtargetFeatures(const std::string Initial = std::string()) {
-    // Break up string into separate features
-    Split(Features, Initial);
-  }
+  SubtargetFeatures(const std::string &Initial = std::string());
 
   /// Features string accessors.
-  inline std::string getString() const { return Join(Features); }
-  void setString(const std::string &Initial) {
-    // Throw out old features
-    Features.clear();
-    // Break up string into separate features
-    Split(Features, toLower(Initial));
-  }
+  std::string getString() const;
+  void setString(const std::string &Initial);
 
-  /// Setting CPU string.  Replaces previous setting.  Setting to "" clears CPU.
-  void setCPU(std::string String) { Features[0] = toLower(String); }
+  /// Set the CPU string.  Replaces previous setting.  Setting to "" clears CPU.
+  void setCPU(const std::string &String);
+  
+  /// Setting CPU string only if no string is set.
+  void setCPUIfNone(const std::string &String);
   
   /// Adding Features.
   void AddFeature(const std::string &String, bool IsEnabled = true);
-
-  /// Display help for feature choices.
-  static void Help(const char *Heading,
-                   const SubtargetFeatureKV *Table, size_t TableSize);
-            
-  /// Parse feature string for quick usage.
-  static uint32_t Parse(const std::string &String,
-                        const std::string &DefaultCPU,
-                        const SubtargetFeatureKV *CPUTable,
-                        size_t CPUTableSize,
-                        const SubtargetFeatureKV *FeatureTable,
-                        size_t FeatureTableSize);
+           
+  /// Get feature bits.
+  uint32_t getBits(const SubtargetFeatureKV *CPUTable,
+                         size_t CPUTableSize,
+                   const SubtargetFeatureKV *FeatureTable,
+                         size_t FeatureTableSize);
+                         
+  /// Get info pointer
+  void *getInfo(const SubtargetInfoKV *Table, size_t TableSize);
   
   /// Print feature string.
   void print(std::ostream &OS) const;


Index: llvm/include/llvm/Target/TargetInstrInfo.h
diff -u llvm/include/llvm/Target/TargetInstrInfo.h:1.80 llvm/include/llvm/Target/TargetInstrInfo.h:1.80.2.1
--- llvm/include/llvm/Target/TargetInstrInfo.h:1.80	Fri Sep  2 13:16:20 2005
+++ llvm/include/llvm/Target/TargetInstrInfo.h	Wed Nov 16 12:31:58 2005
@@ -146,7 +146,6 @@
     return get(Opcode).numOperands;
   }
 
-
   InstrSchedClass getSchedClass(MachineOpCode Opcode) const {
     return get(Opcode).schedClass;
   }


Index: llvm/include/llvm/Target/TargetInstrItineraries.h
diff -c /dev/null llvm/include/llvm/Target/TargetInstrItineraries.h:1.6.2.2
*** /dev/null	Wed Nov 16 12:32:09 2005
--- llvm/include/llvm/Target/TargetInstrItineraries.h	Wed Nov 16 12:31:58 2005
***************
*** 0 ****
--- 1,84 ----
+ //===-- llvm/Target/TargetInstrItineraries.h - Scheduling -------*- C++ -*-===//
+ //
+ //                     The LLVM Compiler Infrastructure
+ //
+ // This file was developed by the James M. Laskey and is distributed under
+ // the University of Illinois Open Source License. See LICENSE.TXT for details.
+ //
+ //===----------------------------------------------------------------------===//
+ //
+ // This file describes the structures used for instruction itineraries and
+ // states.  This is used by schedulers to determine instruction states and
+ // latencies.
+ //
+ //===----------------------------------------------------------------------===//
+ 
+ #ifndef LLVM_TARGET_TARGETINSTRITINERARIES_H
+ #define LLVM_TARGET_TARGETINSTRITINERARIES_H
+ 
+ namespace llvm {
+ 
+ //===----------------------------------------------------------------------===//
+ // Instruction stage - These values represent a step in the execution of an
+ // instruction.  The latency represents the number of discrete time slots used
+ // need to complete the stage.  Units represent the choice of functional units
+ // that can be used to complete the stage.  Eg. IntUnit1, IntUnit2.
+ //
+ struct InstrStage {
+   unsigned Cycles;  // Length of stage in machine cycles
+   unsigned Units;   // Choice of functional units
+ };
+ 
+ 
+ //===----------------------------------------------------------------------===//
+ // Instruction itinerary - An itinerary represents a sequential series of steps
+ // required to complete an instruction.  Itineraries are represented as
+ // sequences of instruction stages.
+ //
+ struct InstrItinerary {
+   unsigned First;    // Index of first stage in itinerary
+   unsigned Last;     // Index of last + 1 stage in itinerary
+ };
+ 
+ 
+ 
+ //===----------------------------------------------------------------------===//
+ // Instruction itinerary Data - Itinerary data supplied by a subtarget to be
+ // used by a target.
+ //
+ struct InstrItineraryData {
+   InstrStage     *Stages;         // Array of stages selected
+   InstrItinerary *Itineratries;   // Array of itineraries selected
+ 
+ //
+ // Ctors.
+ //
+   InstrItineraryData() : Stages(0), Itineratries(0) {}
+   InstrItineraryData(InstrStage *S, InstrItinerary *I) : Stages(S), Itineratries(I) {}
+   
+   //
+   // isEmpty - Returns true if there are no itineraries.
+   //
+   inline bool isEmpty() const { return Itineratries == 0; }
+   
+   //
+   // begin - Return the first stage of the itinerary.
+   // 
+   inline InstrStage *begin(unsigned ItinClassIndx) const {
+     unsigned StageIdx = Itineratries[ItinClassIndx].First;
+     return Stages + StageIdx;
+   }
+ 
+   //
+   // end - Return the last+1 stage of the itinerary.
+   // 
+   inline InstrStage *end(unsigned ItinClassIndx) const {
+     unsigned StageIdx = Itineratries[ItinClassIndx].Last;
+     return Stages + StageIdx;
+   }
+ };
+ 
+ 
+ } // End llvm namespace
+ 
+ #endif


Index: llvm/include/llvm/Target/TargetLowering.h
diff -u llvm/include/llvm/Target/TargetLowering.h:1.24 llvm/include/llvm/Target/TargetLowering.h:1.24.2.1
--- llvm/include/llvm/Target/TargetLowering.h:1.24	Tue Sep 27 17:13:36 2005
+++ llvm/include/llvm/Target/TargetLowering.h	Wed Nov 16 12:31:58 2005
@@ -83,7 +83,15 @@
   /// isSetCCExpensive - Return true if the setcc operation is expensive for
   /// this target.
   bool isSetCCExpensive() const { return SetCCIsExpensive; }
-
+  
+  /// isIntDivCheap() - Return true if integer divide is usually cheaper than
+  /// a sequence of several shifts, adds, and multiplies for this target.
+  bool isIntDivCheap() const { return IntDivIsCheap; }
+
+  /// isPow2DivCheap() - Return true if pow2 div is cheaper than a chain of
+  /// srl/add/sra.
+  bool isPow2DivCheap() const { return Pow2DivIsCheap; }
+  
   /// getSetCCResultTy - Return the ValueType of the result of setcc operations.
   ///
   MVT::ValueType getSetCCResultTy() const { return SetCCResultTy; }
@@ -262,6 +270,16 @@
   /// setcc operations into other operations if possible.
   void setSetCCIsExpensive() { SetCCIsExpensive = true; }
 
+  /// setIntDivIsCheap - Tells the code generator that integer divide is
+  /// expensive, and if possible, should be replaced by an alternate sequence
+  /// of instructions not containing an integer divide.
+  void setIntDivIsCheap(bool isCheap = true) { IntDivIsCheap = isCheap; }
+  
+  /// setPow2DivIsCheap - Tells the code generator that it shouldn't generate
+  /// srl/add/sra for a signed divide by power of two, and let the target handle
+  /// it.
+  void setPow2DivIsCheap(bool isCheap = true) { Pow2DivIsCheap = isCheap; }
+  
   /// addRegisterClass - Add the specified register class as an available
   /// regclass for the specified value type.  This indicates the selector can
   /// handle values of that class natively.
@@ -311,6 +329,12 @@
               unsigned CallingConv, bool isTailCall, SDOperand Callee,
               ArgListTy &Args, SelectionDAG &DAG) = 0;
 
+  /// LowerReturnTo - This hook lowers a return instruction into the appropriate
+  /// legal ISD::RET node for the target's current ABI.  This method is optional
+  /// and is intended for targets that need non-standard behavior.
+  virtual SDOperand LowerReturnTo(SDOperand Chain, SDOperand Op, 
+                                  SelectionDAG &DAG);
+  
   /// LowerVAStart - This lowers the llvm.va_start intrinsic.  If not
   /// implemented, this method prints a message and aborts.  This method should
   /// return the modified chain value.  Note that VAListPtr* correspond to the
@@ -385,6 +409,17 @@
   /// setcc operations into other operations if possible.
   bool SetCCIsExpensive;
 
+  /// IntDivIsCheap - Tells the code generator not to expand integer divides by
+  /// constants into a sequence of muls, adds, and shifts.  This is a hack until
+  /// a real cost model is in place.  If we ever optimize for size, this will be
+  /// set to true unconditionally.
+  bool IntDivIsCheap;
+  
+  /// Pow2DivIsCheap - Tells the code generator that it shouldn't generate
+  /// srl/add/sra for a signed divide by power of two, and let the target handle
+  /// it.
+  bool Pow2DivIsCheap;
+  
   /// SetCCResultTy - The type that SetCC operations use.  This defaults to the
   /// PointerTy.
   MVT::ValueType SetCCResultTy;


Index: llvm/include/llvm/Target/TargetMachine.h
diff -u llvm/include/llvm/Target/TargetMachine.h:1.57 llvm/include/llvm/Target/TargetMachine.h:1.57.2.1
--- llvm/include/llvm/Target/TargetMachine.h:1.57	Fri Aug  5 16:53:21 2005
+++ llvm/include/llvm/Target/TargetMachine.h	Wed Nov 16 12:31:58 2005
@@ -15,6 +15,7 @@
 #define LLVM_TARGET_TARGETMACHINE_H
 
 #include "llvm/Target/TargetData.h"
+#include "llvm/Target/TargetInstrItineraries.h"
 #include <cassert>
 
 namespace llvm {
@@ -122,6 +123,13 @@
   /// otherwise return null.
   ///
   virtual TargetJITInfo *getJITInfo() { return 0; }
+  
+  /// getInstrItineraryData - Returns instruction itinerary data for the target
+  /// or specific subtarget.
+  ///
+  virtual const InstrItineraryData getInstrItineraryData() const {  
+    return InstrItineraryData();
+  }
 
   // These are deprecated interfaces.
   virtual const TargetSchedInfo        *getSchedInfo() const { return 0; }
@@ -135,11 +143,12 @@
 
   /// addPassesToEmitFile - Add passes to the specified pass manager to get
   /// the specified file emitted.  Typically this will involve several steps of
-  /// code generation.  This method should return true if emission of this file
-  /// type is not supported.
+  /// code generation.  If Fast is set to true, the code generator should emit
+  /// code as fast as possible, without regard for compile time.  This method
+  /// should return true if emission of this file type is not supported.
   ///
   virtual bool addPassesToEmitFile(PassManager &PM, std::ostream &Out,
-                                   CodeGenFileType FileType) {
+                                   CodeGenFileType FileType, bool Fast) {
     return true;
   }
 






More information about the llvm-commits mailing list