From b413eefa644725fbd5910d84d686c95d0f256ad5 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Tue, 30 Apr 2019 14:37:15 +0000 Subject: [PATCH] [SelectionDAG] remove div-by-zero constant folding restriction 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 | 10 +++------- test/CodeGen/AArch64/fp-const-fold.ll | 6 ++---- test/CodeGen/X86/fdiv-combine.ll | 9 --------- 3 files changed, 5 insertions(+), 20 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index f17fee2fe74..e85695755d4 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -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); } diff --git a/test/CodeGen/AArch64/fp-const-fold.ll b/test/CodeGen/AArch64/fp-const-fold.ll index b8b4722ade1..398671b79b5 100644 --- a/test/CodeGen/AArch64/fp-const-fold.ll +++ b/test/CodeGen/AArch64/fp-const-fold.ll @@ -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 diff --git a/test/CodeGen/X86/fdiv-combine.ll b/test/CodeGen/X86/fdiv-combine.ll index c0c5baa2c8b..cd2b959ee0d 100644 --- a/test/CodeGen/X86/fdiv-combine.ll +++ b/test/CodeGen/X86/fdiv-combine.ll @@ -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 -- 2.50.1