Add a comment noting that the fdiv -> fmul conversion won't generate
authorDuncan Sands <baldrick@free.fr>
Tue, 10 Apr 2012 20:35:27 +0000 (20:35 +0000)
committerDuncan Sands <baldrick@free.fr>
Tue, 10 Apr 2012 20:35:27 +0000 (20:35 +0000)
multiplication by a denormal, and some tests checking that.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154431 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/DAGCombiner.cpp
test/CodeGen/X86/fdiv.ll

index b5b20284c1d3a3ca4e74bb72c52c73b285112d07..ae7c941b134397d4065a9278a83707405692e77b 100644 (file)
@@ -5769,9 +5769,9 @@ SDValue DAGCombiner::visitFDIV(SDNode *N) {
     APFloat N1APF = N1CFP->getValueAPF();
     APFloat Recip(N1APF.getSemantics(), 1); // 1.0
     APFloat::opStatus st = Recip.divide(N1APF, APFloat::rmNearestTiesToEven);
-    // Only do the transform if the reciprocal is not too horrible (eg not NaN)
-    // and the reciprocal is a legal fp imm.
-    if ((st == APFloat::opOK || st == APFloat::opInexact) &&
+    // Only do the transform if the reciprocal is a legal fp immediate that
+    // isn't too nasty (eg NaN, denormal, ...).
+    if ((st == APFloat::opOK || st == APFloat::opInexact) && // Not too nasty
         (!LegalOperations ||
          // FIXME: custom lowering of ConstantFP might fail (see e.g. ARM
          // backend)... we should handle this gracefully after Legalize.
index 82b9190b9a5bf63bb4ac362ca4be24ca43a8e7bc..0749682e2f681e3eb6eec817af24fccaafc866a4 100644 (file)
@@ -23,3 +23,19 @@ define double @funky(double %x) {
   %div = fdiv double %x, 0.0
   ret double %div
 }
+
+define double @denormal1(double %x) {
+; Don't generate multiplication by a denormal.
+; CHECK: @denormal1
+; CHECK: divsd
+  %div = fdiv double %x, 0x7FD0000000000001
+  ret double %div
+}
+
+define double @denormal2(double %x) {
+; Don't generate multiplication by a denormal.
+; CHECK: @denormal
+; CHECK: divsd
+  %div = fdiv double %x, 0x7FEFFFFFFFFFFFFF
+  ret double %div
+}