Optimize exact sdiv by a constant power of 2 to ashr.
llvm-svn: 78714
This commit is contained in:
		
							parent
							
								
									9f94459d24
								
							
						
					
					
						commit
						dbae4db67a
					
				| 
						 | 
				
			
			@ -3064,6 +3064,15 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) {
 | 
			
		|||
    // sdiv X, -1 == -X
 | 
			
		||||
    if (RHS->isAllOnesValue())
 | 
			
		||||
      return BinaryOperator::CreateNeg(*Context, Op0);
 | 
			
		||||
 | 
			
		||||
    // sdiv X, C  --> ashr X, log2(C)
 | 
			
		||||
    if (cast<SDivOperator>(&I)->isExact() &&
 | 
			
		||||
        RHS->getValue().isNonNegative() &&
 | 
			
		||||
        RHS->getValue().isPowerOf2()) {
 | 
			
		||||
      Value *ShAmt = llvm::ConstantInt::get(RHS->getType(),
 | 
			
		||||
                                            RHS->getValue().exactLogBase2());
 | 
			
		||||
      return BinaryOperator::CreateAShr(Op0, ShAmt, I.getName());
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // If the sign bits of both operands are zero (i.e. we can prove they are
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,15 @@
 | 
			
		|||
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | FileCheck %s
 | 
			
		||||
 | 
			
		||||
; CHECK: define i32 @foo
 | 
			
		||||
; CHECK: sdiv i32 %x, 8
 | 
			
		||||
define i32 @foo(i32 %x) {
 | 
			
		||||
  %y = sdiv i32 %x, 8
 | 
			
		||||
  ret i32 %y
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; CHECK: define i32 @bar
 | 
			
		||||
; CHECK: ashr i32 %x, 3
 | 
			
		||||
define i32 @bar(i32 %x) {
 | 
			
		||||
  %y = sdiv exact i32 %x, 8
 | 
			
		||||
  ret i32 %y
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue