forked from OSchip/llvm-project
				
			Decompose FP-to-UInt casts into FP-to-ULong-toUInt.
llvm-svn: 3957
This commit is contained in:
		
							parent
							
								
									2a351d54a0
								
							
						
					
					
						commit
						46aeb8c7c2
					
				| 
						 | 
				
			
			@ -146,6 +146,7 @@ namespace {
 | 
			
		|||
    void visitInstruction(Instruction &I);   // common work for every instr. 
 | 
			
		||||
    void visitGetElementPtrInst(GetElementPtrInst &I);
 | 
			
		||||
    void visitLoadInst(LoadInst &I);
 | 
			
		||||
    void visitCastInst(CastInst &I);
 | 
			
		||||
    void visitStoreInst(StoreInst &I);
 | 
			
		||||
 | 
			
		||||
    // Helper functions for visiting operands of every instruction
 | 
			
		||||
| 
						 | 
				
			
			@ -228,6 +229,33 @@ PreSelection::visitStoreInst(StoreInst &I)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// Cast instructions: make multi-step casts explicit
 | 
			
		||||
// -- float/double to uint32_t:
 | 
			
		||||
//    If target does not have a float-to-unsigned instruction, we
 | 
			
		||||
//    need to convert to uint64_t and then to uint32_t, or we may
 | 
			
		||||
//    overflow the signed int representation for legal uint32_t
 | 
			
		||||
//    values.  Expand this without checking target.
 | 
			
		||||
// 
 | 
			
		||||
void
 | 
			
		||||
PreSelection::visitCastInst(CastInst &I)
 | 
			
		||||
{ 
 | 
			
		||||
  CastInst* castI = NULL;
 | 
			
		||||
 | 
			
		||||
  // Check for a global and put its address into a register before this instr
 | 
			
		||||
  if (I.getType() == Type::UIntTy &&
 | 
			
		||||
      I.getOperand(0)->getType()->isFloatingPoint())
 | 
			
		||||
    { // insert a cast-fp-to-long before I, and then replace the operand of I
 | 
			
		||||
      castI = new CastInst(I.getOperand(0), Type::LongTy, "fp2Long2Uint", &I);
 | 
			
		||||
      I.setOperand(0, castI);           // replace fp operand with long
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  // Perform other transformations common to all instructions
 | 
			
		||||
  visitInstruction(I);
 | 
			
		||||
  if (castI)
 | 
			
		||||
    visitInstruction(*castI);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// visitOperands() transforms individual operands of all instructions:
 | 
			
		||||
// -- Load "large" int constants into a virtual register.  What is large
 | 
			
		||||
//    depends on the type of instruction and on the target architecture.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue