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,15 +1086,31 @@ 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); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// 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; |     return; | ||||||
|   } |   } | ||||||
|    |    | ||||||
|    |  | ||||||
|   //  Create TmpBB after CurBB.
 |   //  Create TmpBB after CurBB.
 | ||||||
|   MachineFunction::iterator BBI = CurBB; |   MachineFunction::iterator BBI = CurBB; | ||||||
|   MachineFunction &MF = DAG.getMachineFunction(); |   MachineFunction &MF = DAG.getMachineFunction(); | ||||||
|  |  | ||||||
|  | @ -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
	
	 Dan Gohman
						Dan Gohman