forked from OSchip/llvm-project
				
			Factor out the code for mapping LLVM IR condition opcodes to
ISD condition opcodes into helper functions. llvm-svn: 57726
This commit is contained in:
		
							parent
							
								
									fe15bedff4
								
							
						
					
					
						commit
						d01ddb51ee
					
				| 
						 | 
					@ -1051,32 +1051,26 @@ static ISD::CondCode getICmpCondCode(ICmpInst::Predicate Pred) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// FindMergedConditions - If Cond is an expression like 
 | 
					/// EmitBranchForMergedCondition - Helper method for FindMergedConditions.
 | 
				
			||||||
void SelectionDAGLowering::FindMergedConditions(Value *Cond,
 | 
					/// This function emits a branch and is used at the leaves of an OR or an
 | 
				
			||||||
 | 
					/// AND operator tree.
 | 
				
			||||||
 | 
					///
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					SelectionDAGLowering::EmitBranchForMergedCondition(Value *Cond,
 | 
				
			||||||
                                                   MachineBasicBlock *TBB,
 | 
					                                                   MachineBasicBlock *TBB,
 | 
				
			||||||
                                                   MachineBasicBlock *FBB,
 | 
					                                                   MachineBasicBlock *FBB,
 | 
				
			||||||
                                                MachineBasicBlock *CurBB,
 | 
					                                                   MachineBasicBlock *CurBB) {
 | 
				
			||||||
                                                unsigned Opc) {
 | 
					 | 
				
			||||||
  // If this node is not part of the or/and tree, emit it as a branch.
 | 
					 | 
				
			||||||
  Instruction *BOp = dyn_cast<Instruction>(Cond);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (!BOp || !(isa<BinaryOperator>(BOp) || isa<CmpInst>(BOp)) || 
 | 
					 | 
				
			||||||
      (unsigned)BOp->getOpcode() != Opc || !BOp->hasOneUse() ||
 | 
					 | 
				
			||||||
      BOp->getParent() != CurBB->getBasicBlock() ||
 | 
					 | 
				
			||||||
      !InBlock(BOp->getOperand(0), CurBB->getBasicBlock()) ||
 | 
					 | 
				
			||||||
      !InBlock(BOp->getOperand(1), CurBB->getBasicBlock())) {
 | 
					 | 
				
			||||||
  const BasicBlock *BB = CurBB->getBasicBlock();
 | 
					  const BasicBlock *BB = CurBB->getBasicBlock();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // If the leaf of the tree is a comparison, merge the condition into
 | 
					  // If the leaf of the tree is a comparison, merge the condition into
 | 
				
			||||||
  // the caseblock.
 | 
					  // the caseblock.
 | 
				
			||||||
    if (isa<CmpInst>(Cond) &&
 | 
					  if (CmpInst *BOp = dyn_cast<CmpInst>(Cond)) {
 | 
				
			||||||
    // The operands of the cmp have to be in this block.  We don't know
 | 
					    // The operands of the cmp have to be in this block.  We don't know
 | 
				
			||||||
    // how to export them from some other block.  If this is the first block
 | 
					    // how to export them from some other block.  If this is the first block
 | 
				
			||||||
    // of the sequence, no exporting is needed.
 | 
					    // of the sequence, no exporting is needed.
 | 
				
			||||||
        (CurBB == CurMBB ||
 | 
					    if (CurBB == CurMBB ||
 | 
				
			||||||
        (isExportableFromCurrentBlock(BOp->getOperand(0), BB) &&
 | 
					        (isExportableFromCurrentBlock(BOp->getOperand(0), BB) &&
 | 
				
			||||||
          isExportableFromCurrentBlock(BOp->getOperand(1), BB)))) {
 | 
					         isExportableFromCurrentBlock(BOp->getOperand(1), BB))) {
 | 
				
			||||||
      BOp = cast<Instruction>(Cond);
 | 
					 | 
				
			||||||
      ISD::CondCode Condition;
 | 
					      ISD::CondCode Condition;
 | 
				
			||||||
      if (ICmpInst *IC = dyn_cast<ICmpInst>(Cond)) {
 | 
					      if (ICmpInst *IC = dyn_cast<ICmpInst>(Cond)) {
 | 
				
			||||||
        Condition = getICmpCondCode(IC->getPredicate());
 | 
					        Condition = getICmpCondCode(IC->getPredicate());
 | 
				
			||||||
| 
						 | 
					@ -1092,14 +1086,30 @@ void SelectionDAGLowering::FindMergedConditions(Value *Cond,
 | 
				
			||||||
      SwitchCases.push_back(CB);
 | 
					      SwitchCases.push_back(CB);
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Create a CaseBlock record representing this branch.
 | 
					  // Create a CaseBlock record representing this branch.
 | 
				
			||||||
  CaseBlock CB(ISD::SETEQ, Cond, ConstantInt::getTrue(),
 | 
					  CaseBlock CB(ISD::SETEQ, Cond, ConstantInt::getTrue(),
 | 
				
			||||||
               NULL, TBB, FBB, CurBB);
 | 
					               NULL, TBB, FBB, CurBB);
 | 
				
			||||||
  SwitchCases.push_back(CB);
 | 
					  SwitchCases.push_back(CB);
 | 
				
			||||||
    return;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// FindMergedConditions - If Cond is an expression like 
 | 
				
			||||||
 | 
					void SelectionDAGLowering::FindMergedConditions(Value *Cond,
 | 
				
			||||||
 | 
					                                                MachineBasicBlock *TBB,
 | 
				
			||||||
 | 
					                                                MachineBasicBlock *FBB,
 | 
				
			||||||
 | 
					                                                MachineBasicBlock *CurBB,
 | 
				
			||||||
 | 
					                                                unsigned Opc) {
 | 
				
			||||||
 | 
					  // If this node is not part of the or/and tree, emit it as a branch.
 | 
				
			||||||
 | 
					  Instruction *BOp = dyn_cast<Instruction>(Cond);
 | 
				
			||||||
 | 
					  if (!BOp || !(isa<BinaryOperator>(BOp) || isa<CmpInst>(BOp)) || 
 | 
				
			||||||
 | 
					      (unsigned)BOp->getOpcode() != Opc || !BOp->hasOneUse() ||
 | 
				
			||||||
 | 
					      BOp->getParent() != CurBB->getBasicBlock() ||
 | 
				
			||||||
 | 
					      !InBlock(BOp->getOperand(0), CurBB->getBasicBlock()) ||
 | 
				
			||||||
 | 
					      !InBlock(BOp->getOperand(1), CurBB->getBasicBlock())) {
 | 
				
			||||||
 | 
					    EmitBranchForMergedCondition(Cond, TBB, FBB, CurBB);
 | 
				
			||||||
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  //  Create TmpBB after CurBB.
 | 
					  //  Create TmpBB after CurBB.
 | 
				
			||||||
  MachineFunction::iterator BBI = CurBB;
 | 
					  MachineFunction::iterator BBI = CurBB;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -405,6 +405,9 @@ public:
 | 
				
			||||||
  void FindMergedConditions(Value *Cond, MachineBasicBlock *TBB,
 | 
					  void FindMergedConditions(Value *Cond, MachineBasicBlock *TBB,
 | 
				
			||||||
                            MachineBasicBlock *FBB, MachineBasicBlock *CurBB,
 | 
					                            MachineBasicBlock *FBB, MachineBasicBlock *CurBB,
 | 
				
			||||||
                            unsigned Opc);
 | 
					                            unsigned Opc);
 | 
				
			||||||
 | 
					  void EmitBranchForMergedCondition(Value *Cond, MachineBasicBlock *TBB,
 | 
				
			||||||
 | 
					                                    MachineBasicBlock *FBB,
 | 
				
			||||||
 | 
					                                    MachineBasicBlock *CurBB);
 | 
				
			||||||
  bool ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases);
 | 
					  bool ShouldEmitAsBranches(const std::vector<CaseBlock> &Cases);
 | 
				
			||||||
  bool isExportableFromCurrentBlock(Value *V, const BasicBlock *FromBB);
 | 
					  bool isExportableFromCurrentBlock(Value *V, const BasicBlock *FromBB);
 | 
				
			||||||
  void ExportFromCurrentBlock(Value *V);
 | 
					  void ExportFromCurrentBlock(Value *V);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue