Peter Lawrence via llvm-dev
2017-Jun-08 19:29 UTC
[llvm-dev] RFC: Killing undef and spreading poison
Sanjoy, in your blog post https://www.playingwithpointers.com/problem-with-undef.html <https://www.playingwithpointers.com/problem-with-undef.html> you describe a problem with LLVM “undef”, yet in your paper http://www.cs.utah.edu/~regehr/papers/undef-pldi17.pdf <http://www.cs.utah.edu/~regehr/papers/undef-pldi17.pdf> you do not suggest fixing this problem, even though in chpt. 9 you identify other compilers that do attempt to avoid it. It seems to me that since transforming a program with multiple uses of an “undef” variable into one with multiple distinct “undef”s results in behavior that is inconsistent (and that violates users expectations) we should not allow it. This seems to me to be one of those situations where the phrase “extraordinary claims require extraordinary evidence” applies, and I’m not seeing any, are you ? IIUC, a “freeze” operation can always be inserted over an “undef” (now “poison”) that forces a single consistent value, but why the extra overhead of “freeze”, as there doesn’t seem to be a convincing argument for ever allowing the same variable to have inconsistent values, or am I missing something ? Peter Lawrence. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170608/14b5cb27/attachment.html>
Sanjoy Das via llvm-dev
2017-Jun-08 20:29 UTC
[llvm-dev] RFC: Killing undef and spreading poison
Hi, On Thu, Jun 8, 2017 at 12:29 PM, Peter Lawrence <peterl95124 at sbcglobal.net> wrote:> > Sanjoy, > in your blog post > https://www.playingwithpointers.com/problem-with-undef.html > you describe a problem with LLVM “undef”, > yet in your paper http://www.cs.utah.edu/~regehr/papers/undef-pldi17.pdf > you do not suggest fixing this problem, even though in chpt. 9 you identify > other > compilers that do attempt to avoid it.That problem is mentioned in section 3.2 (which quotes the same example as in the blog post), and section 4 (the paragraph starting with "Defining branching on poison to be UB further enables analyses to assume that...") addresses how the new semantics plugs this gap.> The reason I keep asking for additional examples is that this one where > You have illegally transformed the ‘nsw’ isn’t convincing. So please,Maybe we're talking past each other. Let me first discuss the framing of the problem as I see it: 1. Whether a transform is illegal or not is decided by the semantics we've assigned to the IR. In this case, whether hoisting the multiplication with the nsw intact is illegal or not is decided by the semantics we've assigned to nsw. 2. We want certain transforms to be legal, which limits the kinds of semantics we can possibly have for the IR. For instance, we certainly don't want a semantics for IR that disallows constant folding `add i32 1, 2`. The example I gave was to demonstrate why the current (albeit not very clearly specified) semantics is incorrect. So when you ask for an example, are you asking why the set of transforms we want to be correct in the new semantics (i.e. (2)) includes "hoist nsw-arithmetic out of control flow while still keeping the flags"? IOW, in the language used in the paper I linked to, are you asking "why can't we have a overflowing nsw addition be immediate UB"? If so, that is covered in section 2.2 (but we can get into more detail if you want). -- Sanjoy
Peter Lawrence via llvm-dev
2017-Jun-08 22:03 UTC
[llvm-dev] RFC: Killing undef and spreading poison
Sanjoy, Sorry, I guess I wasn’t specific enough, I’ll try again. Excerpt from your blog post: "Another way to look at this is that undef isn’t a normal SSA value, and uses of an undefvalue are also its defs.” IMHO this was a bad definition from the get-go. It seems to me that transforming a program with multiple uses of a single undefined variable into one with multiple distinct IR “undef”s results in behavior that is inconsistent, and that violates users expectations, and therefore we should not do it. In other words the aspect of the current definition of “undef” in LLVM-IR that seems to force programs with undefined variables to be mis-represented is broken, and the definition of “undef" needs to be fixed. Your proposal with “freeze” makes it possible to force all uses of an undefined variable to be consistent, but why not just do the simpler fix to “undef” / “poison” and allow them to have multiple uses, as opposed to “use once only, by definition of the IR”, which does not seem to have any benefit. So again, “freeze” seems to be a workaround, rather than fixing the underlying problem. Thoughts ? Peter Lawrence.> On Jun 8, 2017, at 1:29 PM, Sanjoy Das <sanjoy at playingwithpointers.com> wrote: > > Hi, > > On Thu, Jun 8, 2017 at 12:29 PM, Peter Lawrence > <peterl95124 at sbcglobal.net> wrote: >> >> Sanjoy, >> in your blog post >> https://www.playingwithpointers.com/problem-with-undef.html >> you describe a problem with LLVM “undef”, >> yet in your paper http://www.cs.utah.edu/~regehr/papers/undef-pldi17.pdf >> you do not suggest fixing this problem, even though in chpt. 9 you identify >> other >> compilers that do attempt to avoid it. > > That problem is mentioned in section 3.2 (which quotes the same > example as in the blog post), and section 4 (the paragraph starting > with "Defining branching on poison to be UB further enables analyses > to assume that...") addresses how the new semantics plugs this gap. > >> The reason I keep asking for additional examples is that this one where >> You have illegally transformed the ‘nsw’ isn’t convincing. So please, > > Maybe we're talking past each other. Let me first discuss the framing > of the problem as I see it: > > 1. Whether a transform is illegal or not is decided by the semantics > we've assigned to the IR. In this case, whether hoisting the > multiplication with the nsw intact is illegal or not is decided by > the semantics we've assigned to nsw. > > 2. We want certain transforms to be legal, which limits the kinds of > semantics we can possibly have for the IR. For instance, we > certainly don't want a semantics for IR that disallows constant > folding `add i32 1, 2`. > > The example I gave was to demonstrate why the current (albeit not very > clearly specified) semantics is incorrect. > > So when you ask for an example, are you asking why the set of > transforms we want to be correct in the new semantics (i.e. (2)) > includes "hoist nsw-arithmetic out of control flow while still keeping > the flags"? IOW, in the language used in the paper I linked to, are > you asking "why can't we have a overflowing nsw addition be immediate > UB"? If so, that is covered in section 2.2 (but we can get into more > detail if you want). > > -- Sanjoy-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170608/4e4ff249/attachment.html>