mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-03 14:21:30 +00:00 
			
		
		
		
	allow pushing icmps through phis with multiple uses and across critical edges.
These are important to push up to encourage jump threading. This shrinks 176.gcc a bit. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82923 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -388,7 +388,11 @@ namespace {
 | 
				
			|||||||
    // which has a PHI node as operand #0, see if we can fold the instruction
 | 
					    // which has a PHI node as operand #0, see if we can fold the instruction
 | 
				
			||||||
    // into the PHI (which is only possible if all operands to the PHI are
 | 
					    // into the PHI (which is only possible if all operands to the PHI are
 | 
				
			||||||
    // constants).
 | 
					    // constants).
 | 
				
			||||||
    Instruction *FoldOpIntoPhi(Instruction &I);
 | 
					    //
 | 
				
			||||||
 | 
					    // If AllowAggressive is true, FoldOpIntoPhi will allow certain transforms
 | 
				
			||||||
 | 
					    // that would normally be unprofitable because they strongly encourage jump
 | 
				
			||||||
 | 
					    // threading.
 | 
				
			||||||
 | 
					    Instruction *FoldOpIntoPhi(Instruction &I, bool AllowAggressive = false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // FoldPHIArgOpIntoPHI - If all operands to a PHI node are the same "unary"
 | 
					    // FoldPHIArgOpIntoPHI - If all operands to a PHI node are the same "unary"
 | 
				
			||||||
    // operator and they all are only used by the PHI, PHI together their
 | 
					    // operator and they all are only used by the PHI, PHI together their
 | 
				
			||||||
@@ -1942,10 +1946,21 @@ static Instruction *FoldOpIntoSelect(Instruction &Op, SelectInst *SI,
 | 
				
			|||||||
/// FoldOpIntoPhi - Given a binary operator, cast instruction, or select which
 | 
					/// FoldOpIntoPhi - Given a binary operator, cast instruction, or select which
 | 
				
			||||||
/// has a PHI node as operand #0, see if we can fold the instruction into the
 | 
					/// has a PHI node as operand #0, see if we can fold the instruction into the
 | 
				
			||||||
/// PHI (which is only possible if all operands to the PHI are constants).
 | 
					/// PHI (which is only possible if all operands to the PHI are constants).
 | 
				
			||||||
Instruction *InstCombiner::FoldOpIntoPhi(Instruction &I) {
 | 
					///
 | 
				
			||||||
 | 
					/// If AllowAggressive is true, FoldOpIntoPhi will allow certain transforms
 | 
				
			||||||
 | 
					/// that would normally be unprofitable because they strongly encourage jump
 | 
				
			||||||
 | 
					/// threading.
 | 
				
			||||||
 | 
					Instruction *InstCombiner::FoldOpIntoPhi(Instruction &I,
 | 
				
			||||||
 | 
					                                         bool AllowAggressive) {
 | 
				
			||||||
 | 
					  AllowAggressive = false;
 | 
				
			||||||
  PHINode *PN = cast<PHINode>(I.getOperand(0));
 | 
					  PHINode *PN = cast<PHINode>(I.getOperand(0));
 | 
				
			||||||
  unsigned NumPHIValues = PN->getNumIncomingValues();
 | 
					  unsigned NumPHIValues = PN->getNumIncomingValues();
 | 
				
			||||||
  if (!PN->hasOneUse() || NumPHIValues == 0) return 0;
 | 
					  if (NumPHIValues == 0 ||
 | 
				
			||||||
 | 
					      // We normally only transform phis with a single use, unless we're trying
 | 
				
			||||||
 | 
					      // hard to make jump threading happen.
 | 
				
			||||||
 | 
					      (!PN->hasOneUse() && !AllowAggressive))
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  // Check to see if all of the operands of the PHI are simple constants
 | 
					  // Check to see if all of the operands of the PHI are simple constants
 | 
				
			||||||
  // (constantint/constantfp/undef).  If there is one non-constant value,
 | 
					  // (constantint/constantfp/undef).  If there is one non-constant value,
 | 
				
			||||||
@@ -1970,7 +1985,7 @@ Instruction *InstCombiner::FoldOpIntoPhi(Instruction &I) {
 | 
				
			|||||||
  // operation in that block.  However, if this is a critical edge, we would be
 | 
					  // operation in that block.  However, if this is a critical edge, we would be
 | 
				
			||||||
  // inserting the computation one some other paths (e.g. inside a loop).  Only
 | 
					  // inserting the computation one some other paths (e.g. inside a loop).  Only
 | 
				
			||||||
  // do this if the pred block is unconditionally branching into the phi block.
 | 
					  // do this if the pred block is unconditionally branching into the phi block.
 | 
				
			||||||
  if (NonConstBB) {
 | 
					  if (NonConstBB != 0 && !AllowAggressive) {
 | 
				
			||||||
    BranchInst *BI = dyn_cast<BranchInst>(NonConstBB->getTerminator());
 | 
					    BranchInst *BI = dyn_cast<BranchInst>(NonConstBB->getTerminator());
 | 
				
			||||||
    if (!BI || !BI->isUnconditional()) return 0;
 | 
					    if (!BI || !BI->isUnconditional()) return 0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@@ -5865,7 +5880,7 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
 | 
				
			|||||||
        // block.  If in the same block, we're encouraging jump threading.  If
 | 
					        // block.  If in the same block, we're encouraging jump threading.  If
 | 
				
			||||||
        // not, we are just pessimizing the code by making an i1 phi.
 | 
					        // not, we are just pessimizing the code by making an i1 phi.
 | 
				
			||||||
        if (LHSI->getParent() == I.getParent())
 | 
					        if (LHSI->getParent() == I.getParent())
 | 
				
			||||||
          if (Instruction *NV = FoldOpIntoPhi(I))
 | 
					          if (Instruction *NV = FoldOpIntoPhi(I, true))
 | 
				
			||||||
            return NV;
 | 
					            return NV;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      case Instruction::SIToFP:
 | 
					      case Instruction::SIToFP:
 | 
				
			||||||
@@ -6221,11 +6236,11 @@ Instruction *InstCombiner::visitICmpInst(ICmpInst &I) {
 | 
				
			|||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case Instruction::PHI:
 | 
					      case Instruction::PHI:
 | 
				
			||||||
        // Only fold icmp into the PHI if the phi and fcmp are in the same
 | 
					        // Only fold icmp into the PHI if the phi and icmp are in the same
 | 
				
			||||||
        // block.  If in the same block, we're encouraging jump threading.  If
 | 
					        // block.  If in the same block, we're encouraging jump threading.  If
 | 
				
			||||||
        // not, we are just pessimizing the code by making an i1 phi.
 | 
					        // not, we are just pessimizing the code by making an i1 phi.
 | 
				
			||||||
        if (LHSI->getParent() == I.getParent())
 | 
					        if (LHSI->getParent() == I.getParent())
 | 
				
			||||||
          if (Instruction *NV = FoldOpIntoPhi(I))
 | 
					          if (Instruction *NV = FoldOpIntoPhi(I, true))
 | 
				
			||||||
            return NV;
 | 
					            return NV;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      case Instruction::Select: {
 | 
					      case Instruction::Select: {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user