[Attributor][FIX] Do not introduce multiple instances of SSA values
If we have a recursive function we could create multiple instantiations of an SSA value, one per recursive invocation of the function. This is a problem as we use SSA value equality in various places. The basic idea follows from this test: ``` static int r(int c, int *a) { int X; return c ? r(false, &X) : a == &X; } int test(int c) { return r(c, undef); } ``` If we look through the argument `a` we will end up with `X`. Using SSA value equality we will fold `a == &X` to true and return true even though it should have been false because `a` and `&X` are from different instantiations of the function. Various tests for this have been placed in value-simplify-instances.ll and this commit fixes them all by avoiding to produce simplified values that could be non-unique at runtime. Thus, the result of a simplify value call will always be unique at runtime or the original value, both do not allow to accidentally compare two instances of a value with each other and conclude they are equal statically (pointer equivalence) while they are unequal at runtime.
Loading
Please sign in to comment