Value simplification result in AAValueSimplify is sometimes flow-sensitive because of AAConstantRange::getConstantRangeFromLVI,AAConstantRange::getConstantRangeFromSCEV.
But manifestation for callsite argument is done in the same way for the floating position. This causes the following unexpected simplification, for example.
Before:
define i32 @g(i1 %d) { br i1 %c, label %t, label %f t: %ret1 = call i32 @f(i1 %c) ret i32 %ret1 f: %ret2 = call i32 @f(i1 false) ret i32 %ret2 }
After:
define i32 @g(i1 %d) { br label %t t: %ret1 = call i32 @f(i1 true) ret i32 %ret1 f: %ret2 = call i32 @f(i1 false) ret i32 %ret2 }
This patch fix the problem by replacing use with simplified values in manifestation.
Move the U into the conditional or make if (!C) return an early exit.