<div dir="ltr">This didn't even pass make check and I've reverted it.<div><br></div><div>Also, please use an actual commit message next time rather than just the differential version (though do add that too if you'd like phabricator to update automatically).</div><div><br></div><div>Thanks.</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Jun 7, 2016 at 12:38 PM Wei Ding via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: wdng<br>
Date: Tue Jun  7 14:04:44 2016<br>
New Revision: 272044<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=272044&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=272044&view=rev</a><br>
Log:<br>
Differential Revision: <a href="http://reviews.llvm.org/D20557" rel="noreferrer" target="_blank">http://reviews.llvm.org/D20557</a><br>
<br>
Modified:<br>
    llvm/trunk/lib/Target/AMDGPU/SIISelLowering.cpp<br>
    llvm/trunk/test/CodeGen/AMDGPU/fdiv.ll<br>
<br>
Modified: llvm/trunk/lib/Target/AMDGPU/SIISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIISelLowering.cpp?rev=272044&r1=272043&r2=272044&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/SIISelLowering.cpp?rev=272044&r1=272043&r2=272044&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AMDGPU/SIISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/AMDGPU/SIISelLowering.cpp Tue Jun  7 14:04:44 2016<br>
@@ -36,6 +36,12 @@<br>
<br>
 using namespace llvm;<br>
<br>
+// -amdgpu-fast-fdiv - Command line option to enable faster 2.5 ulp fdiv.<br>
+static cl::opt<bool> EnableAMDGPUFastFDIV(<br>
+  "amdgpu-fast-fdiv",<br>
+  cl::desc("Enable faster 2.5 ulp fdiv"),<br>
+  cl::init(false));<br>
+<br>
 static unsigned findFirstFreeSGPR(CCState &CCInfo) {<br>
   unsigned NumSGPRs = AMDGPU::SGPR_32RegClass.getNumRegs();<br>
   for (unsigned Reg = 0; Reg < NumSGPRs; ++Reg) {<br>
@@ -1941,8 +1947,11 @@ SDValue SITargetLowering::LowerFastFDIV(<br>
 }<br>
<br>
 SDValue SITargetLowering::LowerFDIV32(SDValue Op, SelectionDAG &DAG) const {<br>
-  if (SDValue FastLowered = LowerFastFDIV(Op, DAG))<br>
-    return FastLowered;<br>
+  const SDNodeFlags *Flags = Op->getFlags();<br>
+  if (Flags->hasAllowReciprocal()) {<br>
+    if (SDValue FastLowered = LowerFastFDIV(Op, DAG))<br>
+      return FastLowered;<br>
+  }<br>
<br>
   // This uses v_rcp_f32 which does not handle denormals. Let this hit a<br>
   // selection error for now rather than do something incorrect.<br>
@@ -1953,32 +1962,61 @@ SDValue SITargetLowering::LowerFDIV32(SD<br>
   SDValue LHS = Op.getOperand(0);<br>
   SDValue RHS = Op.getOperand(1);<br>
<br>
-  SDValue r1 = DAG.getNode(ISD::FABS, SL, MVT::f32, RHS);<br>
+  // faster 2.5 ulp fdiv when using -amdgpu-fast-fdiv flag<br>
+  if (EnableAMDGPUFastFDIV) {<br>
+    SDValue r1 = DAG.getNode(ISD::FABS, SL, MVT::f32, RHS);<br>
<br>
-  const APFloat K0Val(BitsToFloat(0x6f800000));<br>
-  const SDValue K0 = DAG.getConstantFP(K0Val, SL, MVT::f32);<br>
+    const APFloat K0Val(BitsToFloat(0x6f800000));<br>
+    const SDValue K0 = DAG.getConstantFP(K0Val, SL, MVT::f32);<br>
<br>
-  const APFloat K1Val(BitsToFloat(0x2f800000));<br>
-  const SDValue K1 = DAG.getConstantFP(K1Val, SL, MVT::f32);<br>
+    const APFloat K1Val(BitsToFloat(0x2f800000));<br>
+    const SDValue K1 = DAG.getConstantFP(K1Val, SL, MVT::f32);<br>
<br>
-  const SDValue One = DAG.getConstantFP(1.0, SL, MVT::f32);<br>
+    const SDValue One = DAG.getConstantFP(1.0, SL, MVT::f32);<br>
<br>
-  EVT SetCCVT =<br>
-      getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::f32);<br>
+    EVT SetCCVT =<br>
+        getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), MVT::f32);<br>
<br>
-  SDValue r2 = DAG.getSetCC(SL, SetCCVT, r1, K0, ISD::SETOGT);<br>
+    SDValue r2 = DAG.getSetCC(SL, SetCCVT, r1, K0, ISD::SETOGT);<br>
<br>
-  SDValue r3 = DAG.getNode(ISD::SELECT, SL, MVT::f32, r2, K1, One);<br>
+    SDValue r3 = DAG.getNode(ISD::SELECT, SL, MVT::f32, r2, K1, One);<br>
<br>
-  // TODO: Should this propagate fast-math-flags?<br>
+    // TODO: Should this propagate fast-math-flags?<br>
<br>
-  r1 = DAG.getNode(ISD::FMUL, SL, MVT::f32, RHS, r3);<br>
+    r1 = DAG.getNode(ISD::FMUL, SL, MVT::f32, RHS, r3);<br>
<br>
-  SDValue r0 = DAG.getNode(AMDGPUISD::RCP, SL, MVT::f32, r1);<br>
+    SDValue r0 = DAG.getNode(AMDGPUISD::RCP, SL, MVT::f32, r1);<br>
<br>
-  SDValue Mul = DAG.getNode(ISD::FMUL, SL, MVT::f32, LHS, r0);<br>
+    SDValue Mul = DAG.getNode(ISD::FMUL, SL, MVT::f32, LHS, r0);<br>
<br>
-  return DAG.getNode(ISD::FMUL, SL, MVT::f32, r3, Mul);<br>
+    return DAG.getNode(ISD::FMUL, SL, MVT::f32, r3, Mul);<br>
+  }<br>
+<br>
+  // Generates more precise fpdiv32.<br>
+  const SDValue One = DAG.getConstantFP(1.0, SL, MVT::f32);<br>
+<br>
+  SDVTList ScaleVT = DAG.getVTList(MVT::f32, MVT::i1);<br>
+<br>
+  SDValue DenominatorScaled = DAG.getNode(AMDGPUISD::DIV_SCALE, SL, ScaleVT, RHS, RHS, LHS);<br>
+  SDValue NumeratorScaled = DAG.getNode(AMDGPUISD::DIV_SCALE, SL, ScaleVT, LHS, RHS, LHS);<br>
+<br>
+  SDValue ApproxRcp = DAG.getNode(AMDGPUISD::RCP, SL, MVT::f32, DenominatorScaled);<br>
+<br>
+  SDValue NegDivScale0 = DAG.getNode(ISD::FNEG, SL, MVT::f32, DenominatorScaled);<br>
+<br>
+  SDValue Fma0 = DAG.getNode(ISD::FMA, SL, MVT::f32, NegDivScale0, ApproxRcp, One);<br>
+  SDValue Fma1 = DAG.getNode(ISD::FMA, SL, MVT::f32, Fma0, ApproxRcp, ApproxRcp);<br>
+<br>
+  SDValue Mul = DAG.getNode(ISD::FMUL, SL, MVT::f32, NumeratorScaled, Fma1);<br>
+<br>
+  SDValue Fma2 = DAG.getNode(ISD::FMA, SL, MVT::f32, NegDivScale0, Mul, NumeratorScaled);<br>
+  SDValue Fma3 = DAG.getNode(ISD::FMA, SL, MVT::f32, Fma2, Fma1, Mul);<br>
+  SDValue Fma4 = DAG.getNode(ISD::FMA, SL, MVT::f32, NegDivScale0, Fma3, NumeratorScaled);<br>
+<br>
+  SDValue Scale = NumeratorScaled.getValue(1);<br>
+  SDValue Fmas = DAG.getNode(AMDGPUISD::DIV_FMAS, SL, MVT::f32, Fma4, Fma1, Fma3, Scale);<br>
+<br>
+  return DAG.getNode(AMDGPUISD::DIV_FIXUP, SL, MVT::f32, Fmas, RHS, LHS);<br>
 }<br>
<br>
 SDValue SITargetLowering::LowerFDIV64(SDValue Op, SelectionDAG &DAG) const {<br>
<br>
Modified: llvm/trunk/test/CodeGen/AMDGPU/fdiv.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/fdiv.ll?rev=272044&r1=272043&r2=272044&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AMDGPU/fdiv.ll?rev=272044&r1=272043&r2=272044&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/AMDGPU/fdiv.ll (original)<br>
+++ llvm/trunk/test/CodeGen/AMDGPU/fdiv.ll Tue Jun  7 14:04:44 2016<br>
@@ -1,19 +1,33 @@<br>
 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s<br>
-; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s<br>
+; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs -amdgpu-fast-fdiv < %s | FileCheck -check-prefix=SI %s<br>
+; RUN: llc -march=amdgcn -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefix=I754 %s<br>
+; RUN: llc -march=amdgcn -mcpu=fiji -verify-machineinstrs -enable-unsafe-fp-math < %s | FileCheck -check-prefix=UNSAFE-FP %s<br>
 ; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=R600 %s<br>
<br>
 ; These tests check that fdiv is expanded correctly and also test that the<br>
 ; scheduler is scheduling the RECIP_IEEE and MUL_IEEE instructions in separate<br>
 ; instruction groups.<br>
<br>
+; These test check that fdiv using unsafe_fp_math, coarse fp div, and IEEE754 fp div.<br>
+<br>
 ; FUNC-LABEL: {{^}}fdiv_f32:<br>
 ; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW]}}, KC0[3].Z<br>
 ; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW]}}, KC0[3].Y<br>
 ; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[3].X, PS<br>
 ; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].W, PS<br>
<br>
+; UNSAFE-FP: v_rcp_f32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+<br>
 ; SI-DAG: v_rcp_f32<br>
 ; SI-DAG: v_mul_f32<br>
+<br>
+; I754-DAG: v_div_scale_f32<br>
+; I754-DAG: v_rcp_f32<br>
+; I754-DAG: v_fma_f32<br>
+; I754-DAG: v_mul_f32<br>
+; I754-DAG: v_fma_f32<br>
+; I754-DAG: v_div_fixup_f32<br>
 define void @fdiv_f32(float addrspace(1)* %out, float %a, float %b) {<br>
 entry:<br>
   %0 = fdiv float %a, %b<br>
@@ -21,7 +35,55 @@ entry:<br>
   ret void<br>
 }<br>
<br>
+; FUNC-LABEL: {{^}}fdiv_f32_fast_math:<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW]}}, KC0[3].Z<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW]}}, KC0[3].Y<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[3].X, PS<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].W, PS<br>
+<br>
+; UNSAFE-FP: v_rcp_f32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+<br>
+; I754-DAG: v_div_scale_f32<br>
+; I754-DAG: v_rcp_f32<br>
+; I754-DAG: v_fma_f32<br>
+; I754-DAG: v_mul_f32<br>
+; I754-DAG: v_fma_f32<br>
+; I754-DAG: v_div_fixup_f32<br>
+define void @fdiv_f32_fast_math(float addrspace(1)* %out, float %a, float %b) {<br>
+entry:<br>
+  %0 = fdiv fast float %a, %b<br>
+  store float %0, float addrspace(1)* %out<br>
+  ret void<br>
+}<br>
+<br>
+; FUNC-LABEL: {{^}}fdiv_f32_arcp_math:<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW]}}, KC0[3].Z<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW]}}, KC0[3].Y<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[3].X, PS<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].W, PS<br>
<br>
+; UNSAFE-FP: v_rcp_f32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+<br>
+; I754-DAG: v_div_scale_f32<br>
+; I754-DAG: v_rcp_f32<br>
+; I754-DAG: v_fma_f32<br>
+; I754-DAG: v_mul_f32<br>
+; I754-DAG: v_fma_f32<br>
+; I754-DAG: v_div_fixup_f32<br>
+define void @fdiv_f32_arcp_math(float addrspace(1)* %out, float %a, float %b) {<br>
+entry:<br>
+  %0 = fdiv arcp float %a, %b<br>
+  store float %0, float addrspace(1)* %out<br>
+  ret void<br>
+}<br>
<br>
 ; FUNC-LABEL: {{^}}fdiv_v2f32:<br>
 ; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW]}}, KC0[3].Z<br>
@@ -29,10 +91,22 @@ entry:<br>
 ; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[3].X, PS<br>
 ; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].W, PS<br>
<br>
+; UNSAFE-FP: v_rcp_f32<br>
+; UNSAFE-FP: v_rcp_f32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+<br>
 ; SI-DAG: v_rcp_f32<br>
 ; SI-DAG: v_mul_f32<br>
 ; SI-DAG: v_rcp_f32<br>
 ; SI-DAG: v_mul_f32<br>
+<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_fixup_f32<br>
+; I754: v_div_fixup_f32<br>
 define void @fdiv_v2f32(<2 x float> addrspace(1)* %out, <2 x float> %a, <2 x float> %b) {<br>
 entry:<br>
   %0 = fdiv <2 x float> %a, %b<br>
@@ -40,6 +114,65 @@ entry:<br>
   ret void<br>
 }<br>
<br>
+; FUNC-LABEL: {{^}}fdiv_v2f32_fast_math:<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW]}}, KC0[3].Z<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW]}}, KC0[3].Y<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[3].X, PS<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].W, PS<br>
+<br>
+; UNSAFE-FP: v_rcp_f32<br>
+; UNSAFE-FP: v_rcp_f32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_fixup_f32<br>
+; I754: v_div_fixup_f32<br>
+define void @fdiv_v2f32_fast_math(<2 x float> addrspace(1)* %out, <2 x float> %a, <2 x float> %b) {<br>
+entry:<br>
+  %0 = fdiv fast <2 x float> %a, %b<br>
+  store <2 x float> %0, <2 x float> addrspace(1)* %out<br>
+  ret void<br>
+}<br>
+<br>
+; FUNC-LABEL: {{^}}fdiv_v2f32_arcp_math:<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW]}}, KC0[3].Z<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW]}}, KC0[3].Y<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[3].X, PS<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW]}}, KC0[2].W, PS<br>
+<br>
+; UNSAFE-FP: v_rcp_f32<br>
+; UNSAFE-FP: v_rcp_f32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_fixup_f32<br>
+; I754: v_div_fixup_f32<br>
+define void @fdiv_v2f32_arcp_math(<2 x float> addrspace(1)* %out, <2 x float> %a, <2 x float> %b) {<br>
+entry:<br>
+  %0 = fdiv arcp <2 x float> %a, %b<br>
+  store <2 x float> %0, <2 x float> addrspace(1)* %out<br>
+  ret void<br>
+}<br>
+<br>
+<br>
 ; FUNC-LABEL: {{^}}fdiv_v4f32:<br>
 ; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}<br>
 ; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}<br>
@@ -50,6 +183,15 @@ entry:<br>
 ; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, PS<br>
 ; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, PS<br>
<br>
+; UNSAFE-FP: v_rcp_f32_e32<br>
+; UNSAFE-FP: v_rcp_f32_e32<br>
+; UNSAFE-FP: v_rcp_f32_e32<br>
+; UNSAFE-FP: v_rcp_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+<br>
 ; SI-DAG: v_rcp_f32<br>
 ; SI-DAG: v_mul_f32<br>
 ; SI-DAG: v_rcp_f32<br>
@@ -58,6 +200,19 @@ entry:<br>
 ; SI-DAG: v_mul_f32<br>
 ; SI-DAG: v_rcp_f32<br>
 ; SI-DAG: v_mul_f32<br>
+<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_fixup_f32<br>
+; I754: v_div_fixup_f32<br>
+; I754: v_div_fixup_f32<br>
+; I754: v_div_fixup_f32<br>
 define void @fdiv_v4f32(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in) {<br>
   %b_ptr = getelementptr <4 x float>, <4 x float> addrspace(1)* %in, i32 1<br>
   %a = load <4 x float>, <4 x float> addrspace(1) * %in<br>
@@ -66,3 +221,101 @@ define void @fdiv_v4f32(<4 x float> addr<br>
   store <4 x float> %result, <4 x float> addrspace(1)* %out<br>
   ret void<br>
 }<br>
+<br>
+; FUNC-LABEL: {{^}}fdiv_v4f32_fast_math:<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, PS<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, PS<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, PS<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, PS<br>
+<br>
+; UNSAFE-FP: v_rcp_f32_e32<br>
+; UNSAFE-FP: v_rcp_f32_e32<br>
+; UNSAFE-FP: v_rcp_f32_e32<br>
+; UNSAFE-FP: v_rcp_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_fixup_f32<br>
+; I754: v_div_fixup_f32<br>
+; I754: v_div_fixup_f32<br>
+; I754: v_div_fixup_f32<br>
+define void @fdiv_v4f32_fast_math(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in) {<br>
+  %b_ptr = getelementptr <4 x float>, <4 x float> addrspace(1)* %in, i32 1<br>
+  %a = load <4 x float>, <4 x float> addrspace(1) * %in<br>
+  %b = load <4 x float>, <4 x float> addrspace(1) * %b_ptr<br>
+  %result = fdiv fast <4 x float> %a, %b<br>
+  store <4 x float> %result, <4 x float> addrspace(1)* %out<br>
+  ret void<br>
+}<br>
+<br>
+; FUNC-LABEL: {{^}}fdiv_v4f32_arcp_math:<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}<br>
+; R600-DAG: RECIP_IEEE * T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, PS<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, PS<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, PS<br>
+; R600-DAG: MUL_IEEE {{\** *}}T{{[0-9]+\.[XYZW], T[0-9]+\.[XYZW]}}, PS<br>
+<br>
+; UNSAFE-FP: v_rcp_f32_e32<br>
+; UNSAFE-FP: v_rcp_f32_e32<br>
+; UNSAFE-FP: v_rcp_f32_e32<br>
+; UNSAFE-FP: v_rcp_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+; UNSAFE-FP: v_mul_f32_e32<br>
+<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+; SI-DAG: v_rcp_f32<br>
+; SI-DAG: v_mul_f32<br>
+<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_scale_f32<br>
+; I754: v_div_fixup_f32<br>
+; I754: v_div_fixup_f32<br>
+; I754: v_div_fixup_f32<br>
+; I754: v_div_fixup_f32<br>
+define void @fdiv_v4f32_arcp_math(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in) {<br>
+  %b_ptr = getelementptr <4 x float>, <4 x float> addrspace(1)* %in, i32 1<br>
+  %a = load <4 x float>, <4 x float> addrspace(1) * %in<br>
+  %b = load <4 x float>, <4 x float> addrspace(1) * %b_ptr<br>
+  %result = fdiv arcp <4 x float> %a, %b<br>
+  store <4 x float> %result, <4 x float> addrspace(1)* %out<br>
+  ret void<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>