mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Optimize exact sdiv by a constant power of 2 to ashr.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78714 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -3064,6 +3064,15 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) { | |||||||
|     // sdiv X, -1 == -X |     // sdiv X, -1 == -X | ||||||
|     if (RHS->isAllOnesValue()) |     if (RHS->isAllOnesValue()) | ||||||
|       return BinaryOperator::CreateNeg(*Context, Op0); |       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 |   // If the sign bits of both operands are zero (i.e. we can prove they are | ||||||
|   | |||||||
							
								
								
									
										15
									
								
								test/Transforms/InstCombine/exact-sdiv.ll
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								test/Transforms/InstCombine/exact-sdiv.ll
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user