]> granicus.if.org Git - llvm/commitdiff
[SelectionDAG] remove div-by-zero constant folding restriction
authorSanjay Patel <spatel@rotateright.com>
Tue, 30 Apr 2019 14:37:15 +0000 (14:37 +0000)
committerSanjay Patel <spatel@rotateright.com>
Tue, 30 Apr 2019 14:37:15 +0000 (14:37 +0000)
We don't have this restriction in IR, so it should not be here
either simply out of consistency. Code that wants to handle FP
exceptions is expected to use the 'strict' variants of these
nodes.

We don't get the frem case because frem by 0.0 produces NaN (invalid),
and that's the remaining check here (so the removed check for frem
was dead code AFAIK).

This is the only place in SDAG that uses "HasFPExceptions", so I
think we should remove that entirely as a follow-up patch.

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

lib/CodeGen/SelectionDAG/SelectionDAG.cpp
test/CodeGen/AArch64/fp-const-fold.ll
test/CodeGen/X86/fdiv-combine.ll

index f17fee2fe74584d0f020aebcfb125cf687bf8ae6..e85695755d469f39febac02bd6934131b1334196 100644 (file)
@@ -4816,17 +4816,13 @@ SDValue SelectionDAG::foldConstantFPMath(unsigned Opcode, const SDLoc &DL,
       break;
     case ISD::FDIV:
       Status = C1.divide(C2, APFloat::rmNearestTiesToEven);
-      if (!HasFPExceptions || (Status != APFloat::opInvalidOp &&
-                               Status != APFloat::opDivByZero)) {
+      if (!HasFPExceptions || Status != APFloat::opInvalidOp)
         return getConstantFP(C1, DL, VT);
-      }
       break;
     case ISD::FREM:
       Status = C1.mod(C2);
-      if (!HasFPExceptions || (Status != APFloat::opInvalidOp &&
-                               Status != APFloat::opDivByZero)) {
+      if (!HasFPExceptions || Status != APFloat::opInvalidOp)
         return getConstantFP(C1, DL, VT);
-      }
       break;
     case ISD::FCOPYSIGN:
       C1.copySign(C2);
@@ -4840,7 +4836,7 @@ SDValue SelectionDAG::foldConstantFPMath(unsigned Opcode, const SDLoc &DL,
     // This can return overflow, underflow, or inexact; we don't care.
     // FIXME need to be more flexible about rounding mode.
     (void) C1.convert(EVTToAPFloatSemantics(VT), APFloat::rmNearestTiesToEven,
-                     &Unused);
+                      &Unused);
     return getConstantFP(C1, DL, VT);
   }
 
index b8b4722ade12033196bfd1300c4b74775b06d2d5..398671b79b52634bf218708c1eeeda6f59812b9f 100644 (file)
@@ -6,10 +6,8 @@
 define double @constant_fold_fdiv_by_zero(double* %p) {
 ; CHECK-LABEL: constant_fold_fdiv_by_zero:
 ; CHECK:       // %bb.0:
-; CHECK-NEXT:    mov x8, #1
-; CHECK-NEXT:    fmov d0, xzr
-; CHECK-NEXT:    fmov d1, x8
-; CHECK-NEXT:    fdiv d0, d1, d0
+; CHECK-NEXT:    mov x8, #9218868437227405312
+; CHECK-NEXT:    fmov d0, x8
 ; CHECK-NEXT:    ret
   %r = fdiv double 4.940660e-324, 0.0
   ret double %r
index c0c5baa2c8bfa6d5393dcfeea598fe908f32d0e9..cd2b959ee0daaf8f06f0d5524b47a3e84b1b567a 100644 (file)
@@ -115,16 +115,7 @@ define float @div_select_constant_fold(i1 zeroext %arg) {
 define float @div_select_constant_fold_zero(i1 zeroext %arg) {
 ; CHECK-LABEL: div_select_constant_fold_zero:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    testl %edi, %edi
-; CHECK-NEXT:    jne .LBB7_1
-; CHECK-NEXT:  # %bb.2:
 ; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
-; CHECK-NEXT:    jmp .LBB7_3
-; CHECK-NEXT:  .LBB7_1:
-; CHECK-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
-; CHECK-NEXT:  .LBB7_3:
-; CHECK-NEXT:    xorps %xmm1, %xmm1
-; CHECK-NEXT:    divss %xmm1, %xmm0
 ; CHECK-NEXT:    retq
   %tmp = select i1 %arg, float 5.000000e+00, float 6.000000e+00
   %B2 = fdiv float %tmp, 0.000000e+00