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.