mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	Revert "indvars: Improve LFTR by eliminating truncation when comparing
against a constant."
This reverts commit r186107. It didn't handle wrapping arithmetic in the
loop correctly and thus caused the following C program to count from
0 to UINT64_MAX instead of from 0 to 255 as intended:
  #include <stdio.h>
  int main() {
    unsigned char first = 0, last = 255;
    do { printf("%d\n", first); } while (first++ != last);
  }
Full test case and instructions to reproduce with just the -indvars pass
sent to the original review thread rather than to r186107's commit.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186152 91177308-0d34-0410-b5e6-96231b3b80d8
			
			
This commit is contained in:
		| @@ -1612,30 +1612,11 @@ LinearFunctionTestReplace(Loop *L, | |||||||
|                << "  IVCount:\t" << *IVCount << "\n"); |                << "  IVCount:\t" << *IVCount << "\n"); | ||||||
|  |  | ||||||
|   IRBuilder<> Builder(BI); |   IRBuilder<> Builder(BI); | ||||||
|  |   if (SE->getTypeSizeInBits(CmpIndVar->getType()) | ||||||
|   unsigned CmpIndVarSize = SE->getTypeSizeInBits(CmpIndVar->getType()); |       > SE->getTypeSizeInBits(ExitCnt->getType())) { | ||||||
|   unsigned ExitCntSize = SE->getTypeSizeInBits(ExitCnt->getType()); |  | ||||||
|   if (CmpIndVarSize > ExitCntSize) { |  | ||||||
|     const SCEVAddRecExpr *AR = cast<SCEVAddRecExpr>(SE->getSCEV(IndVar)); |  | ||||||
|     const SCEV *ARStart = AR->getStart(); |  | ||||||
|     const SCEV *ARStep = AR->getStepRecurrence(*SE); |  | ||||||
|     if (isa<SCEVConstant>(ARStart) && isa<SCEVConstant>(IVCount)) { |  | ||||||
|       const APInt &Start = cast<SCEVConstant>(ARStart)->getValue()->getValue(); |  | ||||||
|       const APInt &Count = cast<SCEVConstant>(IVCount)->getValue()->getValue(); |  | ||||||
|  |  | ||||||
|       APInt NewLimit; |  | ||||||
|       if (cast<SCEVConstant>(ARStep)->getValue()->isNegative()) |  | ||||||
|         NewLimit = Start - Count.zext(CmpIndVarSize); |  | ||||||
|       else |  | ||||||
|         NewLimit = Start + Count.zext(CmpIndVarSize); |  | ||||||
|       ExitCnt = ConstantInt::get(CmpIndVar->getType(), NewLimit); |  | ||||||
|  |  | ||||||
|       DEBUG(dbgs() << "  Widen RHS:\t" << *ExitCnt << "\n"); |  | ||||||
|     } else { |  | ||||||
|     CmpIndVar = Builder.CreateTrunc(CmpIndVar, ExitCnt->getType(), |     CmpIndVar = Builder.CreateTrunc(CmpIndVar, ExitCnt->getType(), | ||||||
|                                     "lftr.wideiv"); |                                     "lftr.wideiv"); | ||||||
|   } |   } | ||||||
|   } |  | ||||||
|  |  | ||||||
|   Value *Cond = Builder.CreateICmp(P, CmpIndVar, ExitCnt, "exitcond"); |   Value *Cond = Builder.CreateICmp(P, CmpIndVar, ExitCnt, "exitcond"); | ||||||
|   Value *OrigCond = BI->getCondition(); |   Value *OrigCond = BI->getCondition(); | ||||||
|   | |||||||
| @@ -1,25 +0,0 @@ | |||||||
| ;RUN: opt -S %s -indvars | FileCheck %s |  | ||||||
|  |  | ||||||
| ; Function Attrs: nounwind uwtable |  | ||||||
| define void @foo() #0 { |  | ||||||
| entry: |  | ||||||
|   br label %for.body |  | ||||||
|  |  | ||||||
| for.body:                                         ; preds = %entry, %for.body |  | ||||||
|   %i.01 = phi i16 [ 0, %entry ], [ %inc, %for.body ] |  | ||||||
|   %conv2 = sext i16 %i.01 to i32 |  | ||||||
|   call void @bar(i32 %conv2) #1 |  | ||||||
|   %inc = add i16 %i.01, 1 |  | ||||||
| ;CHECK-NOT: %lftr.wideiv = trunc i32 %indvars.iv.next to i16 |  | ||||||
| ;CHECK: %exitcond = icmp ne i32 %indvars.iv.next, 512 |  | ||||||
|   %cmp = icmp slt i16 %inc, 512 |  | ||||||
|   br i1 %cmp, label %for.body, label %for.end |  | ||||||
|  |  | ||||||
| for.end:                                          ; preds = %for.body |  | ||||||
|   ret void |  | ||||||
| } |  | ||||||
|  |  | ||||||
| declare void @bar(i32) |  | ||||||
|  |  | ||||||
| attributes #0 = { nounwind uwtable } |  | ||||||
| attributes #1 = { nounwind } |  | ||||||
		Reference in New Issue
	
	Block a user