forked from OSchip/llvm-project
				
			Revert "[SCEV] Clarify behavior around max backedge taken count"
This reverts commit r303497 since it breaks the msan bootstrap bot: http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-bootstrap/builds/1379/ llvm-svn: 303498
This commit is contained in:
		
							parent
							
								
									5207168383
								
							
						
					
					
						commit
						8963650cfa
					
				| 
						 | 
					@ -656,12 +656,10 @@ private:
 | 
				
			||||||
    /// Test whether this BackedgeTakenInfo contains complete information.
 | 
					    /// Test whether this BackedgeTakenInfo contains complete information.
 | 
				
			||||||
    bool hasFullInfo() const { return isComplete(); }
 | 
					    bool hasFullInfo() const { return isComplete(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /// Return an expression indicating the exact *backedge-taken*
 | 
					    /// Return an expression indicating the exact backedge-taken count of the
 | 
				
			||||||
    /// count of the loop if it is known or SCEVCouldNotCompute
 | 
					    /// loop if it is known or SCEVCouldNotCompute otherwise. This is the
 | 
				
			||||||
    /// otherwise.  If execution makes it to the backedge on every
 | 
					    /// number of times the loop header can be guaranteed to execute, minus
 | 
				
			||||||
    /// iteration (i.e. there are no abnormal exists like exception
 | 
					    /// one.
 | 
				
			||||||
    /// throws and thread exits) then this is the number of times the
 | 
					 | 
				
			||||||
    /// loop header will execute minus one.
 | 
					 | 
				
			||||||
    ///
 | 
					    ///
 | 
				
			||||||
    /// If the SCEV predicate associated with the answer can be different
 | 
					    /// If the SCEV predicate associated with the answer can be different
 | 
				
			||||||
    /// from AlwaysTrue, we must add a (non null) Predicates argument.
 | 
					    /// from AlwaysTrue, we must add a (non null) Predicates argument.
 | 
				
			||||||
| 
						 | 
					@ -1400,11 +1398,11 @@ public:
 | 
				
			||||||
  const SCEV *getExitCount(const Loop *L, BasicBlock *ExitingBlock);
 | 
					  const SCEV *getExitCount(const Loop *L, BasicBlock *ExitingBlock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// If the specified loop has a predictable backedge-taken count, return it,
 | 
					  /// If the specified loop has a predictable backedge-taken count, return it,
 | 
				
			||||||
  /// otherwise return a SCEVCouldNotCompute object. The backedge-taken count is
 | 
					  /// otherwise return a SCEVCouldNotCompute object. The backedge-taken count
 | 
				
			||||||
  /// the number of times the loop header will be branched to from within the
 | 
					  /// is the number of times the loop header will be branched to from within
 | 
				
			||||||
  /// loop, assuming there are no abnormal exists like exception throws. This is
 | 
					  /// the loop. This is one less than the trip count of the loop, since it
 | 
				
			||||||
  /// one less than the trip count of the loop, since it doesn't count the first
 | 
					  /// doesn't count the first iteration, when the header is branched to from
 | 
				
			||||||
  /// iteration, when the header is branched to from outside the loop.
 | 
					  /// outside the loop.
 | 
				
			||||||
  ///
 | 
					  ///
 | 
				
			||||||
  /// Note that it is not valid to call this method on a loop without a
 | 
					  /// Note that it is not valid to call this method on a loop without a
 | 
				
			||||||
  /// loop-invariant backedge-taken count (see
 | 
					  /// loop-invariant backedge-taken count (see
 | 
				
			||||||
| 
						 | 
					@ -1419,10 +1417,8 @@ public:
 | 
				
			||||||
  const SCEV *getPredicatedBackedgeTakenCount(const Loop *L,
 | 
					  const SCEV *getPredicatedBackedgeTakenCount(const Loop *L,
 | 
				
			||||||
                                              SCEVUnionPredicate &Predicates);
 | 
					                                              SCEVUnionPredicate &Predicates);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// When successful, this returns a SCEVConstant that is greater than or equal
 | 
					  /// Similar to getBackedgeTakenCount, except return the least SCEV value
 | 
				
			||||||
  /// to (i.e. a "conservative over-approximation") of the value returend by
 | 
					  /// that is known never to be less than the actual backedge taken count.
 | 
				
			||||||
  /// getBackedgeTakenCount.  If such a value cannot be computed, it returns the
 | 
					 | 
				
			||||||
  /// SCEVCouldNotCompute object.
 | 
					 | 
				
			||||||
  const SCEV *getMaxBackedgeTakenCount(const Loop *L);
 | 
					  const SCEV *getMaxBackedgeTakenCount(const Loop *L);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// Return true if the backedge taken count is either the value returned by
 | 
					  /// Return true if the backedge taken count is either the value returned by
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5947,8 +5947,6 @@ ScalarEvolution::BackedgeTakenInfo::getMax(ScalarEvolution *SE) const {
 | 
				
			||||||
  if (any_of(ExitNotTaken, PredicateNotAlwaysTrue) || !getMax())
 | 
					  if (any_of(ExitNotTaken, PredicateNotAlwaysTrue) || !getMax())
 | 
				
			||||||
    return SE->getCouldNotCompute();
 | 
					    return SE->getCouldNotCompute();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assert((isa<SCEVCouldNotCompute>(getMax()) || isa<SCEVConstant>(getMax())) &&
 | 
					 | 
				
			||||||
         "No point in having a non-constant max backedge taken count!");
 | 
					 | 
				
			||||||
  return getMax();
 | 
					  return getMax();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5974,11 +5972,7 @@ bool ScalarEvolution::BackedgeTakenInfo::hasOperand(const SCEV *S,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ScalarEvolution::ExitLimit::ExitLimit(const SCEV *E)
 | 
					ScalarEvolution::ExitLimit::ExitLimit(const SCEV *E)
 | 
				
			||||||
    : ExactNotTaken(E), MaxNotTaken(E), MaxOrZero(false) {
 | 
					    : ExactNotTaken(E), MaxNotTaken(E), MaxOrZero(false) {}
 | 
				
			||||||
  assert((isa<SCEVCouldNotCompute>(MaxNotTaken) ||
 | 
					 | 
				
			||||||
          isa<SCEVConstant>(MaxNotTaken)) &&
 | 
					 | 
				
			||||||
         "No point in having a non-constant max backedge taken count!");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
ScalarEvolution::ExitLimit::ExitLimit(
 | 
					ScalarEvolution::ExitLimit::ExitLimit(
 | 
				
			||||||
    const SCEV *E, const SCEV *M, bool MaxOrZero,
 | 
					    const SCEV *E, const SCEV *M, bool MaxOrZero,
 | 
				
			||||||
| 
						 | 
					@ -5987,9 +5981,6 @@ ScalarEvolution::ExitLimit::ExitLimit(
 | 
				
			||||||
  assert((isa<SCEVCouldNotCompute>(ExactNotTaken) ||
 | 
					  assert((isa<SCEVCouldNotCompute>(ExactNotTaken) ||
 | 
				
			||||||
          !isa<SCEVCouldNotCompute>(MaxNotTaken)) &&
 | 
					          !isa<SCEVCouldNotCompute>(MaxNotTaken)) &&
 | 
				
			||||||
         "Exact is not allowed to be less precise than Max");
 | 
					         "Exact is not allowed to be less precise than Max");
 | 
				
			||||||
  assert((isa<SCEVCouldNotCompute>(MaxNotTaken) ||
 | 
					 | 
				
			||||||
          isa<SCEVConstant>(MaxNotTaken)) &&
 | 
					 | 
				
			||||||
         "No point in having a non-constant max backedge taken count!");
 | 
					 | 
				
			||||||
  for (auto *PredSet : PredSetList)
 | 
					  for (auto *PredSet : PredSetList)
 | 
				
			||||||
    for (auto *P : *PredSet)
 | 
					    for (auto *P : *PredSet)
 | 
				
			||||||
      addPredicate(P);
 | 
					      addPredicate(P);
 | 
				
			||||||
| 
						 | 
					@ -5998,19 +5989,11 @@ ScalarEvolution::ExitLimit::ExitLimit(
 | 
				
			||||||
ScalarEvolution::ExitLimit::ExitLimit(
 | 
					ScalarEvolution::ExitLimit::ExitLimit(
 | 
				
			||||||
    const SCEV *E, const SCEV *M, bool MaxOrZero,
 | 
					    const SCEV *E, const SCEV *M, bool MaxOrZero,
 | 
				
			||||||
    const SmallPtrSetImpl<const SCEVPredicate *> &PredSet)
 | 
					    const SmallPtrSetImpl<const SCEVPredicate *> &PredSet)
 | 
				
			||||||
    : ExitLimit(E, M, MaxOrZero, {&PredSet}) {
 | 
					    : ExitLimit(E, M, MaxOrZero, {&PredSet}) {}
 | 
				
			||||||
  assert((isa<SCEVCouldNotCompute>(MaxNotTaken) ||
 | 
					 | 
				
			||||||
          isa<SCEVConstant>(MaxNotTaken)) &&
 | 
					 | 
				
			||||||
         "No point in having a non-constant max backedge taken count!");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
ScalarEvolution::ExitLimit::ExitLimit(const SCEV *E, const SCEV *M,
 | 
					ScalarEvolution::ExitLimit::ExitLimit(const SCEV *E, const SCEV *M,
 | 
				
			||||||
                                      bool MaxOrZero)
 | 
					                                      bool MaxOrZero)
 | 
				
			||||||
    : ExitLimit(E, M, MaxOrZero, None) {
 | 
					    : ExitLimit(E, M, MaxOrZero, None) {}
 | 
				
			||||||
  assert((isa<SCEVCouldNotCompute>(MaxNotTaken) ||
 | 
					 | 
				
			||||||
          isa<SCEVConstant>(MaxNotTaken)) &&
 | 
					 | 
				
			||||||
         "No point in having a non-constant max backedge taken count!");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Allocate memory for BackedgeTakenInfo and copy the not-taken count of each
 | 
					/// Allocate memory for BackedgeTakenInfo and copy the not-taken count of each
 | 
				
			||||||
/// computable exit into a persistent ExitNotTakenInfo array.
 | 
					/// computable exit into a persistent ExitNotTakenInfo array.
 | 
				
			||||||
| 
						 | 
					@ -6035,8 +6018,6 @@ ScalarEvolution::BackedgeTakenInfo::BackedgeTakenInfo(
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return ExitNotTakenInfo(ExitBB, EL.ExactNotTaken, std::move(Predicate));
 | 
					        return ExitNotTakenInfo(ExitBB, EL.ExactNotTaken, std::move(Predicate));
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
  assert((isa<SCEVCouldNotCompute>(MaxCount) || isa<SCEVConstant>(MaxCount)) &&
 | 
					 | 
				
			||||||
         "No point in having a non-constant max backedge taken count!");
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Invalidate this result and free the ExitNotTakenInfo array.
 | 
					/// Invalidate this result and free the ExitNotTakenInfo array.
 | 
				
			||||||
| 
						 | 
					@ -6298,7 +6279,7 @@ ScalarEvolution::ExitLimit ScalarEvolution::computeExitLimitFromCondImpl(
 | 
				
			||||||
      // to not.
 | 
					      // to not.
 | 
				
			||||||
      if (isa<SCEVCouldNotCompute>(MaxBECount) &&
 | 
					      if (isa<SCEVCouldNotCompute>(MaxBECount) &&
 | 
				
			||||||
          !isa<SCEVCouldNotCompute>(BECount))
 | 
					          !isa<SCEVCouldNotCompute>(BECount))
 | 
				
			||||||
        MaxBECount = getConstant(getUnsignedRange(BECount).getUnsignedMax());
 | 
					        MaxBECount = BECount;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      return ExitLimit(BECount, MaxBECount, false,
 | 
					      return ExitLimit(BECount, MaxBECount, false,
 | 
				
			||||||
                       {&EL0.Predicates, &EL1.Predicates});
 | 
					                       {&EL0.Predicates, &EL1.Predicates});
 | 
				
			||||||
| 
						 | 
					@ -7602,20 +7583,13 @@ ScalarEvolution::howFarToZero(const SCEV *V, const Loop *L, bool ControlsExit,
 | 
				
			||||||
      loopHasNoAbnormalExits(AddRec->getLoop())) {
 | 
					      loopHasNoAbnormalExits(AddRec->getLoop())) {
 | 
				
			||||||
    const SCEV *Exact =
 | 
					    const SCEV *Exact =
 | 
				
			||||||
        getUDivExpr(Distance, CountDown ? getNegativeSCEV(Step) : Step);
 | 
					        getUDivExpr(Distance, CountDown ? getNegativeSCEV(Step) : Step);
 | 
				
			||||||
    const SCEV *Max =
 | 
					    return ExitLimit(Exact, Exact, false, Predicates);
 | 
				
			||||||
        Exact == getCouldNotCompute()
 | 
					 | 
				
			||||||
            ? Exact
 | 
					 | 
				
			||||||
            : getConstant(getUnsignedRange(Exact).getUnsignedMax());
 | 
					 | 
				
			||||||
    return ExitLimit(Exact, Max, false, Predicates);
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Solve the general equation.
 | 
					  // Solve the general equation.
 | 
				
			||||||
  const SCEV *E = SolveLinEquationWithOverflow(StepC->getAPInt(),
 | 
					  const SCEV *E = SolveLinEquationWithOverflow(
 | 
				
			||||||
                                               getNegativeSCEV(Start), *this);
 | 
					      StepC->getAPInt(), getNegativeSCEV(Start), *this);
 | 
				
			||||||
  const SCEV *M = E == getCouldNotCompute()
 | 
					  return ExitLimit(E, E, false, Predicates);
 | 
				
			||||||
                      ? E
 | 
					 | 
				
			||||||
                      : getConstant(getUnsignedRange(E).getUnsignedMax());
 | 
					 | 
				
			||||||
  return ExitLimit(E, M, false, Predicates);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ScalarEvolution::ExitLimit
 | 
					ScalarEvolution::ExitLimit
 | 
				
			||||||
| 
						 | 
					@ -9244,9 +9218,8 @@ ScalarEvolution::howManyLessThans(const SCEV *LHS, const SCEV *RHS,
 | 
				
			||||||
                                getConstant(StrideForMaxBECount), false);
 | 
					                                getConstant(StrideForMaxBECount), false);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (isa<SCEVCouldNotCompute>(MaxBECount) &&
 | 
					  if (isa<SCEVCouldNotCompute>(MaxBECount))
 | 
				
			||||||
      !isa<SCEVCouldNotCompute>(BECount))
 | 
					    MaxBECount = BECount;
 | 
				
			||||||
    MaxBECount = getConstant(getUnsignedRange(BECount).getUnsignedMax());
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return ExitLimit(BECount, MaxBECount, MaxOrZero, Predicates);
 | 
					  return ExitLimit(BECount, MaxBECount, MaxOrZero, Predicates);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,7 +102,7 @@ for.body.i.i:                                     ; preds = %entry, %for.body.i.
 | 
				
			||||||
  %cmp.i.i = icmp eq i32* %ptrincdec.i.i, %end
 | 
					  %cmp.i.i = icmp eq i32* %ptrincdec.i.i, %end
 | 
				
			||||||
  br i1 %cmp.i.i, label %_ZSt4fillIPiiEvT_S1_RKT0_.exit, label %for.body.i.i
 | 
					  br i1 %cmp.i.i, label %_ZSt4fillIPiiEvT_S1_RKT0_.exit, label %for.body.i.i
 | 
				
			||||||
; CHECK: Loop %for.body.i.i: backedge-taken count is ((-4 + (-1 * %begin) + %end) /u 4)
 | 
					; CHECK: Loop %for.body.i.i: backedge-taken count is ((-4 + (-1 * %begin) + %end) /u 4)
 | 
				
			||||||
; CHECK: Loop %for.body.i.i: max backedge-taken count is 4611686018427387903
 | 
					; CHECK: Loop %for.body.i.i: max backedge-taken count is ((-4 + (-1 * %begin) + %end) /u 4)
 | 
				
			||||||
_ZSt4fillIPiiEvT_S1_RKT0_.exit:                   ; preds = %for.body.i.i, %entry
 | 
					_ZSt4fillIPiiEvT_S1_RKT0_.exit:                   ; preds = %for.body.i.i, %entry
 | 
				
			||||||
  ret void
 | 
					  ret void
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -14,7 +14,7 @@ exit:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
; CHECK-LABEL: @test1
 | 
					; CHECK-LABEL: @test1
 | 
				
			||||||
; CHECK: Loop %loop: backedge-taken count is ((-32 + (96 * %n)) /u 32)
 | 
					; CHECK: Loop %loop: backedge-taken count is ((-32 + (96 * %n)) /u 32)
 | 
				
			||||||
; CHECK: Loop %loop: max backedge-taken count is 134217727
 | 
					; CHECK: Loop %loop: max backedge-taken count is ((-32 + (96 * %n)) /u 32)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
; PR19183
 | 
					; PR19183
 | 
				
			||||||
| 
						 | 
					@ -32,7 +32,7 @@ exit:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
; CHECK-LABEL: @test2
 | 
					; CHECK-LABEL: @test2
 | 
				
			||||||
; CHECK: Loop %loop: backedge-taken count is ((-32 + (32 * (%n /u 32))) /u 32)
 | 
					; CHECK: Loop %loop: backedge-taken count is ((-32 + (32 * (%n /u 32))) /u 32)
 | 
				
			||||||
; CHECK: Loop %loop: max backedge-taken count is 134217727
 | 
					; CHECK: Loop %loop: max backedge-taken count is ((-32 + (32 * (%n /u 32))) /u 32)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define void @test3(i32 %n) {
 | 
					define void @test3(i32 %n) {
 | 
				
			||||||
| 
						 | 
					@ -49,7 +49,7 @@ exit:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
; CHECK-LABEL: @test3
 | 
					; CHECK-LABEL: @test3
 | 
				
			||||||
; CHECK: Loop %loop: backedge-taken count is ((-32 + (32 * %n)) /u 32)
 | 
					; CHECK: Loop %loop: backedge-taken count is ((-32 + (32 * %n)) /u 32)
 | 
				
			||||||
; CHECK: Loop %loop: max backedge-taken count is 134217727
 | 
					; CHECK: Loop %loop: max backedge-taken count is ((-32 + (32 * %n)) /u 32)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define void @test4(i32 %n) {
 | 
					define void @test4(i32 %n) {
 | 
				
			||||||
| 
						 | 
					@ -66,7 +66,7 @@ exit:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
; CHECK-LABEL: @test4
 | 
					; CHECK-LABEL: @test4
 | 
				
			||||||
; CHECK: Loop %loop: backedge-taken count is ((-4 + (-1431655764 * %n)) /u 4)
 | 
					; CHECK: Loop %loop: backedge-taken count is ((-4 + (-1431655764 * %n)) /u 4)
 | 
				
			||||||
; CHECK: Loop %loop: max backedge-taken count is 1073741823
 | 
					; CHECK: Loop %loop: max backedge-taken count is ((-4 + (-1431655764 * %n)) /u 4)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
define void @test5(i32 %n) {
 | 
					define void @test5(i32 %n) {
 | 
				
			||||||
| 
						 | 
					@ -83,5 +83,5 @@ exit:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
; CHECK-LABEL: @test5
 | 
					; CHECK-LABEL: @test5
 | 
				
			||||||
; CHECK: Loop %loop: backedge-taken count is ((-4 + (4 * %n)) /u 4)
 | 
					; CHECK: Loop %loop: backedge-taken count is ((-4 + (4 * %n)) /u 4)
 | 
				
			||||||
; CHECK: Loop %loop: max backedge-taken count is 1073741823
 | 
					; CHECK: Loop %loop: max backedge-taken count is ((-4 + (4 * %n)) /u 4)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue