X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FTargetSchedInfo.cpp;h=185f01ec9e859f578cf76c334de891420dc734a0;hb=233ad71051985511152385966f208eb2d83a8801;hp=6a3c9c717b23c918495822add67aa8461a324732;hpb=3058761d3d1b285a96b32994a4fae2e16d6ba745;p=oota-llvm.git diff --git a/lib/Target/TargetSchedInfo.cpp b/lib/Target/TargetSchedInfo.cpp index 6a3c9c717b2..185f01ec9e8 100644 --- a/lib/Target/TargetSchedInfo.cpp +++ b/lib/Target/TargetSchedInfo.cpp @@ -8,12 +8,6 @@ #include "llvm/Target/MachineSchedInfo.h" #include "llvm/Target/TargetMachine.h" -// External object describing the machine instructions -// Initialized only when the TargetMachine class is created -// and reset when that class is destroyed. -// -const MachineInstrDescriptor* TargetInstrDescriptors = 0; - resourceId_t MachineResource::nextId = 0; // Check if fromRVec and toRVec have *any* common entries. @@ -126,7 +120,7 @@ MachineSchedInfo::computeInstrResources(const std::vector& // First get the resource usage information from the class resource usages. for (MachineOpCode op = 0; op < numOpCodes; ++op) { InstrSchedClass sc = getSchedClass(op); - assert(sc >= 0 && sc < numSchedClasses); + assert(sc < numSchedClasses); instrRUsages[op] = instrRUForClasses[sc]; } @@ -151,11 +145,12 @@ MachineSchedInfo::computeIssueGaps(const std::vector& instrRUForClasses) { int numOpCodes = mii->getNumRealOpCodes(); - instrRUsages.resize(numOpCodes); - + issueGaps.resize(numOpCodes); + conflictLists.resize(numOpCodes); + assert(numOpCodes < (1 << MAX_OPCODE_SIZE) - 1 && "numOpCodes invalid for implementation of class OpCodePair!"); - + // First, compute issue gaps between pairs of classes based on common // resources usages for each class, because most instruction pairs will // usually behave the same as their class. @@ -168,27 +163,27 @@ MachineSchedInfo::computeIssueGaps(const std::vector& instrRUForClasses[toSC]); classPairGaps[fromSC][toSC] = classPairGap; } - + // Now, for each pair of instructions, use the class pair gap if both // instructions have identical resource usage as their respective classes. // If not, recompute the gap for the pair from scratch. - + longestIssueConflict = 0; - + for (MachineOpCode fromOp=0; fromOp < numOpCodes; fromOp++) for (MachineOpCode toOp=0; toOp < numOpCodes; toOp++) { - int instrPairGap = - (instrRUsages[fromOp].sameAsClass && instrRUsages[toOp].sameAsClass) - ? classPairGaps[getSchedClass(fromOp)][getSchedClass(toOp)] - : ComputeMinGap(instrRUsages[fromOp], instrRUsages[toOp]); - - if (instrPairGap > 0) - { - issueGaps[OpCodePair(fromOp,toOp)] = instrPairGap; - conflictLists[fromOp].push_back(toOp); - longestIssueConflict = std::max(longestIssueConflict, instrPairGap); - } + int instrPairGap = + (instrRUsages[fromOp].sameAsClass && instrRUsages[toOp].sameAsClass) + ? classPairGaps[getSchedClass(fromOp)][getSchedClass(toOp)] + : ComputeMinGap(instrRUsages[fromOp], instrRUsages[toOp]); + + if (instrPairGap > 0) + { + this->setGap(instrPairGap, fromOp, toOp); + conflictLists[fromOp].push_back(toOp); + longestIssueConflict=std::max(longestIssueConflict, instrPairGap); + } } }