<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Dec 4, 2016 at 3:22 PM, LYU YH <span dir="ltr"><<a href="mailto:lyh.kernel@gmail.com" target="_blank">lyh.kernel@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hello Sean,<br><br>I read several LLVM undef materials[1][2][3] but still have some questions of it. I can understand "add %X, undef -> undef". But why the equation "and %X, undef -> 0" is valid? In LLVM Language Reference Manual, the explanation of such equation is that it is safe to assume that all bits of the ‘undef‘ could be 0. If so, why can't we assume all bits of the 'undef' is 0 in the former equation. Therefore we can get "add %X, 0 -> %X" instead?<br></div></blockquote><div><br></div><div>This is a good question and shows that you have a fairly good understanding already. "add %X, undef -> %X" is legal as you predict. The reason it isn't done is that  "add %X, undef -> undef" is a stronger simplification since it propagates the undef.</div><div><br></div><div>To go further, I can recommend the thread "[llvm-dev] RFC: Killing undef and spreading poison". Nuno also did a presentation at the latest LLVM developer meeting: <a href="http://llvm.org/devmtg/2016-11/Slides/Lopes-LongLivePoison.pdf">http://llvm.org/devmtg/2016-11/Slides/Lopes-LongLivePoison.pdf</a></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br>By the way, is there any document that describe how 'undef' should be handled with other LLVM value? Is the 'undef' in LLVM the same as the UNDEF[4] (the top element in lattice) in constant propagation?<br></div></blockquote><div><br></div><div>No, the UNDEF lattice value in constant propagation (and any other lattice framework) basically just means "I don't know anything about the set of dynamic values that this value can take".</div><div><br></div><div>-- Sean Silva</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br>[1] <a href="http://www.nondot.org/sabre/LLVMNotes/UndefinedValue.txt" target="_blank">http://www.nondot.org/sabre/<wbr>LLVMNotes/UndefinedValue.txt</a><br>[2] <a href="https://www.cs.utah.edu/~regehr/llvm-ub.pdf" target="_blank">https://www.cs.utah.edu/~<wbr>regehr/llvm-ub.pdf</a><br>[3] <a href="http://sunfishcode.github.io/blog/2014/07/14/undef-introduction.html" target="_blank">http://sunfishcode.github.io/<wbr>blog/2014/07/14/undef-<wbr>introduction.html</a><br>[4] <a href="http://infolab.stanford.edu/~ullman/dragon/w06/lectures/cp.pdf" target="_blank">http://infolab.stanford.edu/~<wbr>ullman/dragon/w06/lectures/cp.<wbr>pdf</a><br><br>Thanks for your reply<br></div>
</blockquote></div><br></div></div>