<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Jan 29, 2015 at 12:51 PM, Sanjay Patel <span dir="ltr"><<a href="mailto:spatel@rotateright.com" target="_blank">spatel@rotateright.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">Author: spatel<br>
Date: Thu Jan 29 14:51:49 2015<br>
New Revision: 227491<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=227491&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=227491&view=rev</a><br>
Log:<br>
[GVN] don't propagate equality comparisons of FP zero (PR22376)<br>
<br>
In <a href="http://reviews.llvm.org/D6911" target="_blank">http://reviews.llvm.org/D6911</a>, we allowed GVN to propagate FP equalities<br>
to allow some simple value range optimizations. But that introduced a bug<br>
when comparing to -0.0 or 0.0: these compare equal even though they are not<br>
bitwise identical.<br>
<br>
This patch disallows propagating zero constants in equality comparisons.<br>
Fixes: <a href="http://llvm.org/bugs/show_bug.cgi?id=22376" target="_blank">http://llvm.org/bugs/show_bug.cgi?id=22376</a><br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D7257" target="_blank">http://reviews.llvm.org/D7257</a><br>
<br>
<br>
Modified:<br>
    llvm/trunk/lib/Transforms/Scalar/GVN.cpp<br>
    llvm/trunk/test/Transforms/GVN/edge.ll<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/GVN.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=227491&r1=227490&r2=227491&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/GVN.cpp?rev=227491&r1=227490&r2=227491&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/GVN.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/GVN.cpp Thu Jan 29 14:51:49 2015<br>
@@ -2182,9 +2182,16 @@ bool GVN::propagateEquality(Value *LHS,<br>
<br>
       // Handle the floating point versions of equality comparisons too.<br>
       if ((isKnownTrue && Cmp->getPredicate() == CmpInst::FCMP_OEQ) ||<br>
-          (isKnownFalse && Cmp->getPredicate() == CmpInst::FCMP_UNE))<br>
-        Worklist.push_back(std::make_pair(Op0, Op1));<br>
-<br>
+          (isKnownFalse && Cmp->getPredicate() == CmpInst::FCMP_UNE)) {<br>
+        // Floating point -0.0 and 0.0 compare equal, so we can't<br>
+        // propagate a constant based on that comparison.<br>
+        // FIXME: We should do this optimization if 'no signed zeros' is<br>
+        // applicable via an instruction-level fast-math-flag or some other<br>
+        // indicator that relaxed FP semantics are being used.<br>
+        if (!isa<ConstantFP>(Op1) || !cast<ConstantFP>(Op1)->isZero())<br>
+          Worklist.push_back(std::make_pair(Op0, Op1));<br>
+      }<br></blockquote><div><br></div><div>This test isn't right; it should be "if (isa<ConstantFP>(Op1) && !cast<ConstantFP>(Op1)->isZero())"<br><br></div><div>-Eli<br></div></div></div></div>