mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	ValueTracking: Fix bugs in isKnownToBeAPowerOfTwo
(add nsw x, (and x, y)) isn't a power of two if x is zero, it's zero (add nsw x, (xor x, y)) isn't a power of two if y has bits set that aren't set in x git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185954 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -861,16 +861,14 @@ bool llvm::isKnownToBeAPowerOfTwo(Value *V, bool OrZero, unsigned Depth) { | |||||||
|         // Adding a power of two to the same power of two is a power of two or |         // Adding a power of two to the same power of two is a power of two or | ||||||
|         // zero. |         // zero. | ||||||
|         if (BinaryOperator *XBO = dyn_cast<BinaryOperator>(X)) |         if (BinaryOperator *XBO = dyn_cast<BinaryOperator>(X)) | ||||||
|           if (XBO->getOpcode() == Instruction::And || |           if (XBO->getOpcode() == Instruction::And) | ||||||
|               XBO->getOpcode() == Instruction::Xor) |  | ||||||
|             if (XBO->getOperand(0) == Y || XBO->getOperand(1) == Y) |             if (XBO->getOperand(0) == Y || XBO->getOperand(1) == Y) | ||||||
|               if (isKnownToBeAPowerOfTwo(Y, /*OrZero*/true, Depth)) |               if (isKnownToBeAPowerOfTwo(Y, OrZero, Depth)) | ||||||
|                 return true; |                 return true; | ||||||
|         if (BinaryOperator *YBO = dyn_cast<BinaryOperator>(Y)) |         if (BinaryOperator *YBO = dyn_cast<BinaryOperator>(Y)) | ||||||
|           if (YBO->getOpcode() == Instruction::And || |           if (YBO->getOpcode() == Instruction::And) | ||||||
|               YBO->getOpcode() == Instruction::Xor) |  | ||||||
|             if (YBO->getOperand(0) == X || YBO->getOperand(1) == X) |             if (YBO->getOperand(0) == X || YBO->getOperand(1) == X) | ||||||
|               if (isKnownToBeAPowerOfTwo(X, /*OrZero*/true, Depth)) |               if (isKnownToBeAPowerOfTwo(X, OrZero, Depth)) | ||||||
|                 return true; |                 return true; | ||||||
|       } |       } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -163,18 +163,3 @@ define i32 @test16(i32 %x, i32 %y) { | |||||||
| 	%rem = urem i32 %x, %add | 	%rem = urem i32 %x, %add | ||||||
| 	ret i32 %rem | 	ret i32 %rem | ||||||
| } | } | ||||||
|  |  | ||||||
| define i32 @test17(i16 %x, i32 %y) { |  | ||||||
| ; CHECK: @test17 |  | ||||||
| ; CHECK-NEXT: [[AND:%.*]] = and i16 %x, 4 |  | ||||||
| ; CHECK-NEXT: [[EXT:%.*]] = zext i16 [[AND]] to i32 |  | ||||||
| ; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i32 [[EXT]], 3 |  | ||||||
| ; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[SHL]], 63 |  | ||||||
| ; CHECK-NEXT: [[REM:%.*]] = and i32 [[XOR]], %y |  | ||||||
| ; CHECK-NEXT: ret i32 [[REM]] |  | ||||||
| 	%1 = and i16 %x, 4 |  | ||||||
| 	%2 = icmp ne i16 %1, 0 |  | ||||||
| 	%3 = select i1 %2, i32 32, i32 64 |  | ||||||
| 	%4 = urem i32 %y, %3 |  | ||||||
| 	ret i32 %4 |  | ||||||
| } |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user