When constructing the predicate P1 in ScalarEvolution::createAddRecFromPHIWithCastsImpl() it is possible
for the PHISCEV from which the predicate is constructed to be a SCEVConstant instead of a SCEVAddRec. If
this happens, then the cast<SCEVAddRec>(PHISCEV) in the code will assert.
Such a PHISCEV is possible if either the start value or the accumulator value is a constant value
that not equal to its truncated value, and if the truncated value is zero.
This patch adds tests that demonstrate the cast<> assertion, and fixes this problem by checking
whether the PHISCEV is a constant before constructing the P1 predicate; if it is, then P1 is
equivalent to one of P2 or P3. Additionally, if we know that the start value or accumulator
value are constants then we check whether the P2 and/or P3 predicates are known false at compile
time; if either is, then we bail out of constructing the AddRec.
This patch is not in its final form. There are some options that we can take with it that I was
not entirely sure on the best way-forward with. I would like to settle on an option as part of
this review with reviewer input. To wit:
* Do we even want to check P2 and P3 for known false? Strikes me as a good idea, but it's
not strictly necessary to avoid the cast<> assertion.
* If so, how? I have two options in the patch: 1) Check only the constant case; or (2) check
more generically if the predicate is known false.