On Jun 29, 2007, at 1:10 AM, Duncan Sands wrote: > Hi, > >>>>> It seems like folding undef/X to undef isn't safe either though, > > here is my understanding of how to fold undef. I hope it clarifies > this confusing area. Of course, I could be confused myself but I > hope not :) > > (1) When is it OK to fold "y=foo(undef)" to "y=undef"? I claim that > it is OK if and only if foo is surjective, i.e. if for each possible > value for y there exists a value for x such that y=foo(x). > "Surjective" > is sometimes called "onto". > > Before I explain why I think this, an example: > y=(undef == z) > The possible values of y are 0 and 1 because the result of == is > an i1. Surjectivity means: can I get (undef==z) to produce each of > 0 and 1 by plugging in different values for undef? Obviously I can, > so in this case I can fold to "y=undef".
Yep, I agree. > (2) What to do when foo is not surjective? Choose some value for > undef > and fold to "y=foo(value_chosen)". In general foo will involve some > other variables, so the trick is to find a constant value for y > that is > always obtainable no matter what those other variables are (while > it is > logically correct to replace y with a function of those other > variables, > which is what foo(0) will give in general for example, it is more > efficient > to use a constant value if possible). > > Example: folding "y=undef udiv x". This could be folded to 0 or to 1, > since 0 is what you get by substituting undef=0, and 1 is what you get > by substituting undef=x. (If x=0 then in both cases you get 0/0 which > is, I hear, undefined so you can choose it to be 0 or 1 as you like). > Of course you could also fold it to "1 div x" or "intmax div x" or > "(x*x) div x" if you really felt like it, but 0 and 1 are the only > constants that can always be obtained regardless of the value of x, > so they are the most efficient choices. Yes. Duncan, this whole write-up is very helpful. Can you find some place to put this so that we can find it again in the future? How about the programmer's manual? -Chris _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits