mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	When computing the demanded bits of Load SDNodes, make sure that we are looking at the loaded-value operand and not the ptr result (in case of pre-inc loads).
rdar://13348420 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177596 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -1917,7 +1917,8 @@ void SelectionDAG::ComputeMaskedBits(SDValue Op, APInt &KnownZero, | |||||||
|   } |   } | ||||||
|   case ISD::LOAD: { |   case ISD::LOAD: { | ||||||
|     LoadSDNode *LD = cast<LoadSDNode>(Op); |     LoadSDNode *LD = cast<LoadSDNode>(Op); | ||||||
|     if (ISD::isZEXTLoad(Op.getNode())) { |     // If this is a ZEXTLoad and we are looking at the loaded value. | ||||||
|  |     if (ISD::isZEXTLoad(Op.getNode()) && Op.getResNo() == 0) { | ||||||
|       EVT VT = LD->getMemoryVT(); |       EVT VT = LD->getMemoryVT(); | ||||||
|       unsigned MemBits = VT.getScalarType().getSizeInBits(); |       unsigned MemBits = VT.getScalarType().getSizeInBits(); | ||||||
|       KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - MemBits); |       KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - MemBits); | ||||||
| @@ -2287,6 +2288,8 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, unsigned Depth) const{ | |||||||
|     break; |     break; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   // If we are looking at the loaded value of the SDNode. | ||||||
|  |   if (Op.getResNo() == 0) { | ||||||
|     // Handle LOADX separately here. EXTLOAD case will fallthrough. |     // Handle LOADX separately here. EXTLOAD case will fallthrough. | ||||||
|     if (LoadSDNode *LD = dyn_cast<LoadSDNode>(Op)) { |     if (LoadSDNode *LD = dyn_cast<LoadSDNode>(Op)) { | ||||||
|       unsigned ExtType = LD->getExtensionType(); |       unsigned ExtType = LD->getExtensionType(); | ||||||
| @@ -2300,6 +2303,7 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, unsigned Depth) const{ | |||||||
|           return VTBits-Tmp; |           return VTBits-Tmp; | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   // Allow the target to implement this method for its nodes. |   // Allow the target to implement this method for its nodes. | ||||||
|   if (Op.getOpcode() >= ISD::BUILTIN_OP_END || |   if (Op.getOpcode() >= ISD::BUILTIN_OP_END || | ||||||
|   | |||||||
							
								
								
									
										35
									
								
								test/CodeGen/ARM/zextload_demandedbits.ll
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								test/CodeGen/ARM/zextload_demandedbits.ll
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | ; RUN: llc < %s -march=arm -mtriple="thumbv7-apple-ios3.0.0" | FileCheck %s | ||||||
|  |  | ||||||
|  | target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" | ||||||
|  |  | ||||||
|  | %struct.eggs = type { %struct.spam, i16 } | ||||||
|  | %struct.spam = type { [3 x i32] } | ||||||
|  | %struct.barney = type { [2 x i32], [2 x i32] } | ||||||
|  |  | ||||||
|  | ; Make sure that the sext op does not get lost due to ComputeMaskedBits. | ||||||
|  | ; CHECK: quux | ||||||
|  | ; CHECK: lsl | ||||||
|  | ; CHECK: asr | ||||||
|  | ; CHECK: bl | ||||||
|  | ; CHECK: pop | ||||||
|  | define void @quux(%struct.eggs* %arg) { | ||||||
|  | bb: | ||||||
|  |   %tmp1 = getelementptr inbounds %struct.eggs* %arg, i32 0, i32 1 | ||||||
|  |   %0 = load i16* %tmp1, align 2 | ||||||
|  |   %tobool = icmp eq i16 %0, 0 | ||||||
|  |   br i1 %tobool, label %bb16, label %bb3 | ||||||
|  |  | ||||||
|  | bb3:                                              ; preds = %bb | ||||||
|  |   %tmp4 = bitcast i16* %tmp1 to i8* | ||||||
|  |   %tmp5 = ptrtoint i16* %tmp1 to i32 | ||||||
|  |   %tmp6 = shl i32 %tmp5, 20 | ||||||
|  |   %tmp7 = ashr exact i32 %tmp6, 20 | ||||||
|  |   %tmp14 = getelementptr inbounds %struct.barney* undef, i32 %tmp7 | ||||||
|  |   %tmp15 = tail call i32 @widget(%struct.barney* %tmp14, i8* %tmp4, i32 %tmp7) | ||||||
|  |   br label %bb16 | ||||||
|  |  | ||||||
|  | bb16:                                             ; preds = %bb3, %bb | ||||||
|  |   ret void | ||||||
|  | } | ||||||
|  |  | ||||||
|  | declare i32 @widget(%struct.barney*, i8*, i32) | ||||||
		Reference in New Issue
	
	Block a user