mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Switch on the use of arbitrary precision integers in scalar evolution. This will
bail after 256-bits to avoid producing code that the backends can't handle. Previously, we capped it at 64-bits, preferring to miscompile in those cases. This change also reverts much of r52248 because the invariants the code was expecting are now being met. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53812 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -538,20 +538,12 @@ static SCEVHandle BinomialCoefficient(SCEVHandle It, unsigned K, | |||||||
|  |  | ||||||
|   assert(K < 9 && "We cannot handle such long AddRecs yet."); |   assert(K < 9 && "We cannot handle such long AddRecs yet."); | ||||||
|    |    | ||||||
|   // FIXME: A temporary hack to remove in future.  Arbitrary precision integers |  | ||||||
|   // aren't supported by the code generator yet.  For the dividend, the bitwidth |  | ||||||
|   // we use is the smallest power of 2 greater or equal to K*W and less or equal |  | ||||||
|   // to 64.  Note that setting the upper bound for bitwidth may still lead to |  | ||||||
|   // miscompilation in some cases. |  | ||||||
|   unsigned DividendBits = 1U << Log2_32_Ceil(K * It->getBitWidth()); |  | ||||||
|   if (DividendBits > 64) |  | ||||||
|     DividendBits = 64; |  | ||||||
| #if 0 // Waiting for the APInt support in the code generator... |  | ||||||
|   unsigned DividendBits = K * It->getBitWidth(); |   unsigned DividendBits = K * It->getBitWidth(); | ||||||
| #endif |   if (DividendBits > 256) | ||||||
|  |     return new SCEVCouldNotCompute(); | ||||||
|  |  | ||||||
|   const IntegerType *DividendTy = IntegerType::get(DividendBits); |   const IntegerType *DividendTy = IntegerType::get(DividendBits); | ||||||
|   const SCEVHandle ExIt = SE.getTruncateOrZeroExtend(It, DividendTy); |   const SCEVHandle ExIt = SE.getZeroExtendExpr(It, DividendTy); | ||||||
|  |  | ||||||
|   // The final number of bits we need to perform the division is the maximum of |   // The final number of bits we need to perform the division is the maximum of | ||||||
|   // dividend and divisor bitwidths. |   // dividend and divisor bitwidths. | ||||||
| @@ -573,12 +565,7 @@ static SCEVHandle BinomialCoefficient(SCEVHandle It, unsigned K, | |||||||
|       Dividend *= N-(K-1); |       Dividend *= N-(K-1); | ||||||
|     if (DividendTy != DivisionTy) |     if (DividendTy != DivisionTy) | ||||||
|       Dividend = Dividend.zext(DivisionTy->getBitWidth()); |       Dividend = Dividend.zext(DivisionTy->getBitWidth()); | ||||||
|  |     return SE.getConstant(Dividend.udiv(Divisor).trunc(It->getBitWidth())); | ||||||
|     APInt Result = Dividend.udiv(Divisor); |  | ||||||
|     if (Result.getBitWidth() != It->getBitWidth()) |  | ||||||
|       Result = Result.trunc(It->getBitWidth()); |  | ||||||
|  |  | ||||||
|     return SE.getConstant(Result); |  | ||||||
|   } |   } | ||||||
|    |    | ||||||
|   SCEVHandle Dividend = ExIt; |   SCEVHandle Dividend = ExIt; | ||||||
| @@ -587,11 +574,10 @@ static SCEVHandle BinomialCoefficient(SCEVHandle It, unsigned K, | |||||||
|       SE.getMulExpr(Dividend, |       SE.getMulExpr(Dividend, | ||||||
|                     SE.getMinusSCEV(ExIt, SE.getIntegerSCEV(i, DividendTy))); |                     SE.getMinusSCEV(ExIt, SE.getIntegerSCEV(i, DividendTy))); | ||||||
|  |  | ||||||
|   return SE.getTruncateOrZeroExtend( |   if (DividendTy != DivisionTy) | ||||||
|              SE.getUDivExpr( |     Dividend = SE.getZeroExtendExpr(Dividend, DivisionTy); | ||||||
|                  SE.getTruncateOrZeroExtend(Dividend, DivisionTy), |   return SE.getTruncateExpr(SE.getUDivExpr(Dividend, SE.getConstant(Divisor)), | ||||||
|                  SE.getConstant(Divisor) |                             It->getType()); | ||||||
|              ), It->getType()); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| /// evaluateAtIteration - Return the value of this chain of recurrences at | /// evaluateAtIteration - Return the value of this chain of recurrences at | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user