Fix a regression introduced into the MBlaze delay slot filler.
llvm-svn: 122379
This commit is contained in:
		
							parent
							
								
									5ab8d4b5e5
								
							
						
					
					
						commit
						8143c61b91
					
				| 
						 | 
				
			
			@ -90,6 +90,20 @@ static bool hasImmInstruction(MachineBasicBlock::iterator &candidate) {
 | 
			
		|||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static unsigned getLastRealOperand(MachineBasicBlock::iterator &instr) {
 | 
			
		||||
  switch (instr->getOpcode()) {
 | 
			
		||||
  default: return instr->getNumOperands();
 | 
			
		||||
 | 
			
		||||
  // These instructions have a variable number of operands but the first two
 | 
			
		||||
  // are the "real" operands that we care about during hazard detection.
 | 
			
		||||
  case MBlaze::BRLID:
 | 
			
		||||
  case MBlaze::BRALID:
 | 
			
		||||
  case MBlaze::BRLD:
 | 
			
		||||
  case MBlaze::BRALD:
 | 
			
		||||
    return 2;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool delayHasHazard(MachineBasicBlock::iterator &candidate,
 | 
			
		||||
                           MachineBasicBlock::iterator &slot) {
 | 
			
		||||
  // Hazard check
 | 
			
		||||
| 
						 | 
				
			
			@ -111,17 +125,23 @@ static bool delayHasHazard(MachineBasicBlock::iterator &candidate,
 | 
			
		|||
  //    contains a store operation.
 | 
			
		||||
  bool a_is_memory = desc.mayLoad() || desc.mayStore();
 | 
			
		||||
 | 
			
		||||
  // Determine the number of operands in the slot instruction and in the
 | 
			
		||||
  // candidate instruction.
 | 
			
		||||
  const unsigned aend = getLastRealOperand(a);
 | 
			
		||||
  const unsigned bend = getLastRealOperand(b);
 | 
			
		||||
 | 
			
		||||
  // Check hazards type 1, 2 and 5 by scanning the middle bit
 | 
			
		||||
  MachineBasicBlock::iterator m = a;
 | 
			
		||||
  for (++m; m != b; ++m) {
 | 
			
		||||
    for (unsigned aop = 0, aend = a->getNumOperands(); aop<aend; ++aop) {
 | 
			
		||||
    for (unsigned aop = 0; aop<aend; ++aop) {
 | 
			
		||||
      bool aop_is_reg = a->getOperand(aop).isReg();
 | 
			
		||||
      if (!aop_is_reg) continue;
 | 
			
		||||
 | 
			
		||||
      bool aop_is_def = a->getOperand(aop).isDef();
 | 
			
		||||
      unsigned aop_reg = a->getOperand(aop).getReg();
 | 
			
		||||
 | 
			
		||||
      for (unsigned mop = 0, mend = m->getNumOperands(); mop<mend; ++mop) {
 | 
			
		||||
      const unsigned mend = getLastRealOperand(m);
 | 
			
		||||
      for (unsigned mop = 0; mop<mend; ++mop) {
 | 
			
		||||
        bool mop_is_reg = m->getOperand(mop).isReg();
 | 
			
		||||
        if (!mop_is_reg) continue;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -141,13 +161,12 @@ static bool delayHasHazard(MachineBasicBlock::iterator &candidate,
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  // Check hazard type 3 & 4
 | 
			
		||||
  for (unsigned aop = 0, aend = a->getNumOperands(); aop<aend; ++aop) {
 | 
			
		||||
  for (unsigned aop = 0; aop<aend; ++aop) {
 | 
			
		||||
    if (a->getOperand(aop).isReg()) {
 | 
			
		||||
      unsigned aop_reg = a->getOperand(aop).getReg();
 | 
			
		||||
 | 
			
		||||
      for (unsigned bop = 0, bend = b->getNumOperands(); bop<bend; ++bop) {
 | 
			
		||||
        if (b->getOperand(bop).isReg() && !b->getOperand(bop).isImplicit() &&
 | 
			
		||||
            !b->getOperand(bop).isKill()) {
 | 
			
		||||
      for (unsigned bop = 0; bop<bend; ++bop) {
 | 
			
		||||
        if (b->getOperand(bop).isReg() && !b->getOperand(bop).isImplicit()) {
 | 
			
		||||
          unsigned bop_reg = b->getOperand(bop).getReg();
 | 
			
		||||
          if (aop_reg == bop_reg)
 | 
			
		||||
            return true;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue