forked from OSchip/llvm-project
				
			Simplify this code: if the unfolded load can't be hoisted, just delete
the new instructions and leave the old one in place. llvm-svn: 85393
This commit is contained in:
		
							parent
							
								
									5c5214626c
								
							
						
					
					
						commit
						57780dfdfc
					
				| 
						 | 
					@ -401,7 +401,7 @@ void MachineLICM::Hoist(MachineInstr *MI) {
 | 
				
			||||||
    const TargetRegisterClass *RC = TID.OpInfo[0].getRegClass(TRI);
 | 
					    const TargetRegisterClass *RC = TID.OpInfo[0].getRegClass(TRI);
 | 
				
			||||||
    // Ok, we're unfolding. Create a temporary register and do the unfold.
 | 
					    // Ok, we're unfolding. Create a temporary register and do the unfold.
 | 
				
			||||||
    unsigned Reg = RegInfo->createVirtualRegister(RC);
 | 
					    unsigned Reg = RegInfo->createVirtualRegister(RC);
 | 
				
			||||||
    SmallVector<MachineInstr *, 1> NewMIs;
 | 
					    SmallVector<MachineInstr *, 2> NewMIs;
 | 
				
			||||||
    bool Success =
 | 
					    bool Success =
 | 
				
			||||||
      TII->unfoldMemoryOperand(MF, MI, Reg,
 | 
					      TII->unfoldMemoryOperand(MF, MI, Reg,
 | 
				
			||||||
                               /*UnfoldLoad=*/true, /*UnfoldStore=*/false,
 | 
					                               /*UnfoldLoad=*/true, /*UnfoldStore=*/false,
 | 
				
			||||||
| 
						 | 
					@ -415,28 +415,15 @@ void MachineLICM::Hoist(MachineInstr *MI) {
 | 
				
			||||||
    MachineBasicBlock *MBB = MI->getParent();
 | 
					    MachineBasicBlock *MBB = MI->getParent();
 | 
				
			||||||
    MBB->insert(MI, NewMIs[0]);
 | 
					    MBB->insert(MI, NewMIs[0]);
 | 
				
			||||||
    MBB->insert(MI, NewMIs[1]);
 | 
					    MBB->insert(MI, NewMIs[1]);
 | 
				
			||||||
    MI->eraseFromParent();
 | 
					 | 
				
			||||||
    // If unfolding produced a load that wasn't loop-invariant or profitable to
 | 
					    // If unfolding produced a load that wasn't loop-invariant or profitable to
 | 
				
			||||||
    // hoist, re-fold it to undo the damage.
 | 
					    // hoist, discard the new instructions and bail.
 | 
				
			||||||
    if (!IsLoopInvariantInst(*NewMIs[0]) || !IsProfitableToHoist(*NewMIs[0])) {
 | 
					    if (!IsLoopInvariantInst(*NewMIs[0]) || !IsProfitableToHoist(*NewMIs[0])) {
 | 
				
			||||||
      SmallVector<unsigned, 1> Ops;
 | 
					 | 
				
			||||||
      for (unsigned i = 0, e = NewMIs[1]->getNumOperands(); i != e; ++i) {
 | 
					 | 
				
			||||||
        MachineOperand &MO = NewMIs[1]->getOperand(i);
 | 
					 | 
				
			||||||
        if (MO.isReg() && MO.getReg() == Reg) {
 | 
					 | 
				
			||||||
          assert(MO.isUse() &&
 | 
					 | 
				
			||||||
                 "Register defined by unfolded load is redefined "
 | 
					 | 
				
			||||||
                 "instead of just used!");
 | 
					 | 
				
			||||||
          Ops.push_back(i);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      MI = TII->foldMemoryOperand(MF, NewMIs[1], Ops, NewMIs[0]);
 | 
					 | 
				
			||||||
      assert(MI && "Re-fold failed!");
 | 
					 | 
				
			||||||
      MBB->insert(NewMIs[1], MI);
 | 
					 | 
				
			||||||
      NewMIs[0]->eraseFromParent();
 | 
					      NewMIs[0]->eraseFromParent();
 | 
				
			||||||
      NewMIs[1]->eraseFromParent();
 | 
					      NewMIs[1]->eraseFromParent();
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // Otherwise we successfully unfolded a load that we can hoist.
 | 
					    // Otherwise we successfully unfolded a load that we can hoist.
 | 
				
			||||||
 | 
					    MI->eraseFromParent();
 | 
				
			||||||
    MI = NewMIs[0];
 | 
					    MI = NewMIs[0];
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue