diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 363c71d84694f..c2b4c19846316 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -6105,7 +6105,17 @@ bool SelectionDAG::cannotBeOrderedNegativeFP(SDValue Op) const { if (ConstantFPSDNode *C1 = isConstOrConstSplatFP(Op, true)) return !C1->isNegative(); - return Op.getOpcode() == ISD::FABS; + switch (Op.getOpcode()) { + case ISD::FABS: + case ISD::FEXP: + case ISD::FEXP2: + case ISD::FEXP10: + return true; + default: + return false; + } + + llvm_unreachable("covered opcode switch"); } bool SelectionDAG::isEqualTo(SDValue A, SDValue B) const { diff --git a/llvm/test/CodeGen/AArch64/frem-power2.ll b/llvm/test/CodeGen/AArch64/frem-power2.ll index 52bc704eadc89..179df026e25d6 100644 --- a/llvm/test/CodeGen/AArch64/frem-power2.ll +++ b/llvm/test/CodeGen/AArch64/frem-power2.ll @@ -91,14 +91,10 @@ define float @frem2_exp(float %x) #0 { ; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill ; CHECK-SD-NEXT: bl expf ; CHECK-SD-NEXT: fmov s1, #0.50000000 -; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 ; CHECK-SD-NEXT: fmov s2, #-2.00000000 ; CHECK-SD-NEXT: fmul s1, s0, s1 ; CHECK-SD-NEXT: frintz s1, s1 -; CHECK-SD-NEXT: fmadd s1, s1, s2, s0 -; CHECK-SD-NEXT: mvni v2.4s, #128, lsl #24 -; CHECK-SD-NEXT: bit v0.16b, v1.16b, v2.16b -; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 +; CHECK-SD-NEXT: fmadd s0, s1, s2, s0 ; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload ; CHECK-SD-NEXT: ret ; @@ -121,14 +117,10 @@ define float @frem2_exp2(float %x) #0 { ; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill ; CHECK-SD-NEXT: bl exp2f ; CHECK-SD-NEXT: fmov s1, #0.50000000 -; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 ; CHECK-SD-NEXT: fmov s2, #-2.00000000 ; CHECK-SD-NEXT: fmul s1, s0, s1 ; CHECK-SD-NEXT: frintz s1, s1 -; CHECK-SD-NEXT: fmadd s1, s1, s2, s0 -; CHECK-SD-NEXT: mvni v2.4s, #128, lsl #24 -; CHECK-SD-NEXT: bit v0.16b, v1.16b, v2.16b -; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 +; CHECK-SD-NEXT: fmadd s0, s1, s2, s0 ; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload ; CHECK-SD-NEXT: ret ; @@ -151,14 +143,10 @@ define float @frem2_exp10(float %x) #0 { ; CHECK-SD-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill ; CHECK-SD-NEXT: bl exp10f ; CHECK-SD-NEXT: fmov s1, #0.50000000 -; CHECK-SD-NEXT: // kill: def $s0 killed $s0 def $q0 ; CHECK-SD-NEXT: fmov s2, #-2.00000000 ; CHECK-SD-NEXT: fmul s1, s0, s1 ; CHECK-SD-NEXT: frintz s1, s1 -; CHECK-SD-NEXT: fmadd s1, s1, s2, s0 -; CHECK-SD-NEXT: mvni v2.4s, #128, lsl #24 -; CHECK-SD-NEXT: bit v0.16b, v1.16b, v2.16b -; CHECK-SD-NEXT: // kill: def $s0 killed $s0 killed $q0 +; CHECK-SD-NEXT: fmadd s0, s1, s2, s0 ; CHECK-SD-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload ; CHECK-SD-NEXT: ret ;