diff options
author | Dan Gohman <gohman@apple.com> | 2009-06-22 15:09:28 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-06-22 15:09:28 +0000 |
commit | 60e9b0708a8ce3a7b7eaee9bdceebb2c712514e1 (patch) | |
tree | 5e8db76ecc1d9dbc8e07dd87a2d18b7c7dc528d9 /lib | |
parent | c9759e80f45e5690c3ed3b69c2e9ffd5a1bffd9c (diff) | |
download | external_llvm-60e9b0708a8ce3a7b7eaee9bdceebb2c712514e1.zip external_llvm-60e9b0708a8ce3a7b7eaee9bdceebb2c712514e1.tar.gz external_llvm-60e9b0708a8ce3a7b7eaee9bdceebb2c712514e1.tar.bz2 |
Make use of getUMinFromMismatchedTypes when computing backedge-taken
counts for loops with multiple exits, replacing more conservative code
which only handled constants. This is derived from a patch by
Nick Lewycky.
This also fixes llc aborts in ClamAV and others, as
getUMinFromMismatchedTypes takes care of balancing the types before
working with them.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73884 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Analysis/ScalarEvolution.cpp | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index d67761c..7954d97 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -2958,18 +2958,18 @@ ScalarEvolution::ComputeBackedgeTakenCountFromExitCond(const Loop *L, if (L->contains(TBB)) { // Both conditions must be true for the loop to continue executing. // Choose the less conservative count. - // TODO: Take the minimum of the exact counts. - if (BTI0.Exact == BTI1.Exact) + if (BTI0.Exact == CouldNotCompute) + BECount = BTI1.Exact; + else if (BTI1.Exact == CouldNotCompute) BECount = BTI0.Exact; - // TODO: Take the minimum of the maximum counts. + else + BECount = getUMinFromMismatchedTypes(BTI0.Exact, BTI1.Exact); if (BTI0.Max == CouldNotCompute) MaxBECount = BTI1.Max; else if (BTI1.Max == CouldNotCompute) MaxBECount = BTI0.Max; - else if (const SCEVConstant *C0 = dyn_cast<SCEVConstant>(BTI0.Max)) - if (const SCEVConstant *C1 = dyn_cast<SCEVConstant>(BTI1.Max)) - MaxBECount = getConstant(APIntOps::umin(C0->getValue()->getValue(), - C1->getValue()->getValue())); + else + MaxBECount = getUMinFromMismatchedTypes(BTI0.Max, BTI1.Max); } else { // Both conditions must be true for the loop to exit. assert(L->contains(FBB) && "Loop block has no successor in loop!"); @@ -2992,18 +2992,18 @@ ScalarEvolution::ComputeBackedgeTakenCountFromExitCond(const Loop *L, if (L->contains(FBB)) { // Both conditions must be false for the loop to continue executing. // Choose the less conservative count. - // TODO: Take the minimum of the exact counts. - if (BTI0.Exact == BTI1.Exact) + if (BTI0.Exact == CouldNotCompute) + BECount = BTI1.Exact; + else if (BTI1.Exact == CouldNotCompute) BECount = BTI0.Exact; - // TODO: Take the minimum of the maximum counts. + else + BECount = getUMinFromMismatchedTypes(BTI0.Exact, BTI1.Exact); if (BTI0.Max == CouldNotCompute) MaxBECount = BTI1.Max; else if (BTI1.Max == CouldNotCompute) MaxBECount = BTI0.Max; - else if (const SCEVConstant *C0 = dyn_cast<SCEVConstant>(BTI0.Max)) - if (const SCEVConstant *C1 = dyn_cast<SCEVConstant>(BTI1.Max)) - MaxBECount = getConstant(APIntOps::umin(C0->getValue()->getValue(), - C1->getValue()->getValue())); + else + MaxBECount = getUMinFromMismatchedTypes(BTI0.Max, BTI1.Max); } else { // Both conditions must be false for the loop to exit. assert(L->contains(TBB) && "Loop block has no successor in loop!"); |