[llvm] 8effc2c - [AArch64][GlobalISel] Protect against fdiv of 1 (#184063)

via llvm-commits llvm-commits at lists.llvm.org
Wed May 6 03:52:48 PDT 2026


Author: David Green
Date: 2026-05-06T11:52:43+01:00
New Revision: 8effc2c0f43ee36b38380ba6e9164d5ea235fd32

URL: https://github.com/llvm/llvm-project/commit/8effc2c0f43ee36b38380ba6e9164d5ea235fd32
DIFF: https://github.com/llvm/llvm-project/commit/8effc2c0f43ee36b38380ba6e9164d5ea235fd32.diff

LOG: [AArch64][GlobalISel] Protect against fdiv of 1 (#184063)

This test was crashing undef gisel, as the fdiv would be CSEd to the
existing instruction.

Added: 
    

Modified: 
    llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
    llvm/test/CodeGen/AArch64/sqrt-fastmath.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
index 95b7f864c16fd..c58fb84a3890e 100644
--- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -6914,9 +6914,13 @@ bool CombinerHelper::matchRepeatedFPDivisor(
   if (!MI.getFlag(MachineInstr::MIFlag::FmArcp))
     return false;
 
+  auto IsOne = [this](Register X) {
+    auto N0CFP = isConstantOrConstantSplatVectorFP(*MRI.getVRegDef(X), MRI);
+    return N0CFP && (N0CFP->isExactlyValue(1.0) || N0CFP->isExactlyValue(-1.0));
+  };
+
   // Skip if current node is a reciprocal/fneg-reciprocal.
-  auto N0CFP = isConstantOrConstantSplatVectorFP(*MRI.getVRegDef(X), MRI);
-  if (N0CFP && (N0CFP->isExactlyValue(1.0) || N0CFP->isExactlyValue(-1.0)))
+  if (IsOne(X))
     return false;
 
   // Exit early if the target does not want this transform or if there can't
@@ -6933,7 +6937,8 @@ bool CombinerHelper::matchRepeatedFPDivisor(
     if (&U == &MI || U.getParent() != MI.getParent())
       continue;
     if (U.getOpcode() == TargetOpcode::G_FDIV &&
-        U.getOperand(2).getReg() == Y && U.getOperand(1).getReg() != Y) {
+        U.getOperand(2).getReg() == Y && U.getOperand(1).getReg() != Y &&
+        !IsOne(U.getOperand(1).getReg())) {
       // This division is eligible for optimization only if global unsafe math
       // is enabled or if this division allows reciprocal formation.
       if (U.getFlag(MachineInstr::MIFlag::FmArcp)) {

diff  --git a/llvm/test/CodeGen/AArch64/sqrt-fastmath.ll b/llvm/test/CodeGen/AArch64/sqrt-fastmath.ll
index 241621b51eba8..2bc8cdd75f400 100644
--- a/llvm/test/CodeGen/AArch64/sqrt-fastmath.ll
+++ b/llvm/test/CodeGen/AArch64/sqrt-fastmath.ll
@@ -1,14 +1,8 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+neon,-use-reciprocal-square-root | FileCheck %s --check-prefix=FAULT
-; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+neon,+use-reciprocal-square-root | FileCheck %s
-
-declare float @llvm.sqrt.f32(float)
-declare <2 x float> @llvm.sqrt.v2f32(<2 x float>)
-declare <4 x float> @llvm.sqrt.v4f32(<4 x float>)
-declare <8 x float> @llvm.sqrt.v8f32(<8 x float>)
-declare double @llvm.sqrt.f64(double)
-declare <2 x double> @llvm.sqrt.v2f64(<2 x double>)
-declare <4 x double> @llvm.sqrt.v4f64(<4 x double>)
+; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+neon,-use-reciprocal-square-root | FileCheck %s --check-prefixes=FAULT,FAULT-SD
+; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+neon,+use-reciprocal-square-root | FileCheck %s --check-prefixes=CHECK,CHECK-SD
+; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+neon,-use-reciprocal-square-root -global-isel | FileCheck %s --check-prefixes=FAULT,FAULT-GI
+; RUN: llc < %s -mtriple=aarch64-unknown-linux-gnu -mattr=+neon,+use-reciprocal-square-root -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
 
 define float @fsqrt(float %a) {
 ; FAULT-LABEL: fsqrt:
@@ -16,19 +10,24 @@ define float @fsqrt(float %a) {
 ; FAULT-NEXT:    fsqrt s0, s0
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: fsqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte s1, s0
-; CHECK-NEXT:    fcmp s0, #0.0
-; CHECK-NEXT:    fmul s2, s1, s1
-; CHECK-NEXT:    frsqrts s2, s0, s2
-; CHECK-NEXT:    fmul s1, s1, s2
-; CHECK-NEXT:    fmul s2, s1, s1
-; CHECK-NEXT:    fmul s1, s0, s1
-; CHECK-NEXT:    frsqrts s2, s0, s2
-; CHECK-NEXT:    fmul s1, s1, s2
-; CHECK-NEXT:    fcsel s0, s0, s1, eq
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: fsqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte s1, s0
+; CHECK-SD-NEXT:    fcmp s0, #0.0
+; CHECK-SD-NEXT:    fmul s2, s1, s1
+; CHECK-SD-NEXT:    frsqrts s2, s0, s2
+; CHECK-SD-NEXT:    fmul s1, s1, s2
+; CHECK-SD-NEXT:    fmul s2, s1, s1
+; CHECK-SD-NEXT:    fmul s1, s0, s1
+; CHECK-SD-NEXT:    frsqrts s2, s0, s2
+; CHECK-SD-NEXT:    fmul s1, s1, s2
+; CHECK-SD-NEXT:    fcsel s0, s0, s1, eq
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: fsqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt s0, s0
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast float @llvm.sqrt.f32(float %a)
   ret float %1
 }
@@ -39,19 +38,24 @@ define float @fsqrt_ieee_denorms(float %a) #0 {
 ; FAULT-NEXT:    fsqrt s0, s0
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: fsqrt_ieee_denorms:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte s1, s0
-; CHECK-NEXT:    fcmp s0, #0.0
-; CHECK-NEXT:    fmul s2, s1, s1
-; CHECK-NEXT:    frsqrts s2, s0, s2
-; CHECK-NEXT:    fmul s1, s1, s2
-; CHECK-NEXT:    fmul s2, s1, s1
-; CHECK-NEXT:    fmul s1, s0, s1
-; CHECK-NEXT:    frsqrts s2, s0, s2
-; CHECK-NEXT:    fmul s1, s1, s2
-; CHECK-NEXT:    fcsel s0, s0, s1, eq
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: fsqrt_ieee_denorms:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte s1, s0
+; CHECK-SD-NEXT:    fcmp s0, #0.0
+; CHECK-SD-NEXT:    fmul s2, s1, s1
+; CHECK-SD-NEXT:    frsqrts s2, s0, s2
+; CHECK-SD-NEXT:    fmul s1, s1, s2
+; CHECK-SD-NEXT:    fmul s2, s1, s1
+; CHECK-SD-NEXT:    fmul s1, s0, s1
+; CHECK-SD-NEXT:    frsqrts s2, s0, s2
+; CHECK-SD-NEXT:    fmul s1, s1, s2
+; CHECK-SD-NEXT:    fcsel s0, s0, s1, eq
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: fsqrt_ieee_denorms:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt s0, s0
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast float @llvm.sqrt.f32(float %a)
   ret float %1
 }
@@ -62,19 +66,24 @@ define <2 x float> @f2sqrt(<2 x float> %a) {
 ; FAULT-NEXT:    fsqrt v0.2s, v0.2s
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: f2sqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte v1.2s, v0.2s
-; CHECK-NEXT:    fmul v2.2s, v1.2s, v1.2s
-; CHECK-NEXT:    frsqrts v2.2s, v0.2s, v2.2s
-; CHECK-NEXT:    fmul v1.2s, v1.2s, v2.2s
-; CHECK-NEXT:    fmul v2.2s, v1.2s, v1.2s
-; CHECK-NEXT:    fmul v1.2s, v0.2s, v1.2s
-; CHECK-NEXT:    frsqrts v2.2s, v0.2s, v2.2s
-; CHECK-NEXT:    fmul v1.2s, v1.2s, v2.2s
-; CHECK-NEXT:    fcmeq v2.2s, v0.2s, #0.0
-; CHECK-NEXT:    bif v0.8b, v1.8b, v2.8b
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: f2sqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte v1.2s, v0.2s
+; CHECK-SD-NEXT:    fmul v2.2s, v1.2s, v1.2s
+; CHECK-SD-NEXT:    frsqrts v2.2s, v0.2s, v2.2s
+; CHECK-SD-NEXT:    fmul v1.2s, v1.2s, v2.2s
+; CHECK-SD-NEXT:    fmul v2.2s, v1.2s, v1.2s
+; CHECK-SD-NEXT:    fmul v1.2s, v0.2s, v1.2s
+; CHECK-SD-NEXT:    frsqrts v2.2s, v0.2s, v2.2s
+; CHECK-SD-NEXT:    fmul v1.2s, v1.2s, v2.2s
+; CHECK-SD-NEXT:    fcmeq v2.2s, v0.2s, #0.0
+; CHECK-SD-NEXT:    bif v0.8b, v1.8b, v2.8b
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: f2sqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt v0.2s, v0.2s
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast <2 x float> @llvm.sqrt.v2f32(<2 x float> %a)
   ret <2 x float> %1
 }
@@ -85,19 +94,24 @@ define <4 x float> @f4sqrt(<4 x float> %a) {
 ; FAULT-NEXT:    fsqrt v0.4s, v0.4s
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: f4sqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte v1.4s, v0.4s
-; CHECK-NEXT:    fmul v2.4s, v1.4s, v1.4s
-; CHECK-NEXT:    frsqrts v2.4s, v0.4s, v2.4s
-; CHECK-NEXT:    fmul v1.4s, v1.4s, v2.4s
-; CHECK-NEXT:    fmul v2.4s, v1.4s, v1.4s
-; CHECK-NEXT:    fmul v1.4s, v0.4s, v1.4s
-; CHECK-NEXT:    frsqrts v2.4s, v0.4s, v2.4s
-; CHECK-NEXT:    fmul v1.4s, v1.4s, v2.4s
-; CHECK-NEXT:    fcmeq v2.4s, v0.4s, #0.0
-; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: f4sqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte v1.4s, v0.4s
+; CHECK-SD-NEXT:    fmul v2.4s, v1.4s, v1.4s
+; CHECK-SD-NEXT:    frsqrts v2.4s, v0.4s, v2.4s
+; CHECK-SD-NEXT:    fmul v1.4s, v1.4s, v2.4s
+; CHECK-SD-NEXT:    fmul v2.4s, v1.4s, v1.4s
+; CHECK-SD-NEXT:    fmul v1.4s, v0.4s, v1.4s
+; CHECK-SD-NEXT:    frsqrts v2.4s, v0.4s, v2.4s
+; CHECK-SD-NEXT:    fmul v1.4s, v1.4s, v2.4s
+; CHECK-SD-NEXT:    fcmeq v2.4s, v0.4s, #0.0
+; CHECK-SD-NEXT:    bif v0.16b, v1.16b, v2.16b
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: f4sqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt v0.4s, v0.4s
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> %a)
   ret <4 x float> %1
 }
@@ -109,29 +123,35 @@ define <8 x float> @f8sqrt(<8 x float> %a) {
 ; FAULT-NEXT:    fsqrt v1.4s, v1.4s
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: f8sqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte v2.4s, v0.4s
-; CHECK-NEXT:    frsqrte v3.4s, v1.4s
-; CHECK-NEXT:    fmul v4.4s, v2.4s, v2.4s
-; CHECK-NEXT:    frsqrts v4.4s, v0.4s, v4.4s
-; CHECK-NEXT:    fmul v5.4s, v3.4s, v3.4s
-; CHECK-NEXT:    frsqrts v5.4s, v1.4s, v5.4s
-; CHECK-NEXT:    fmul v2.4s, v2.4s, v4.4s
-; CHECK-NEXT:    fmul v4.4s, v2.4s, v2.4s
-; CHECK-NEXT:    fmul v2.4s, v0.4s, v2.4s
-; CHECK-NEXT:    frsqrts v4.4s, v0.4s, v4.4s
-; CHECK-NEXT:    fmul v3.4s, v3.4s, v5.4s
-; CHECK-NEXT:    fmul v5.4s, v3.4s, v3.4s
-; CHECK-NEXT:    fmul v3.4s, v1.4s, v3.4s
-; CHECK-NEXT:    frsqrts v5.4s, v1.4s, v5.4s
-; CHECK-NEXT:    fmul v2.4s, v2.4s, v4.4s
-; CHECK-NEXT:    fcmeq v4.4s, v0.4s, #0.0
-; CHECK-NEXT:    bif v0.16b, v2.16b, v4.16b
-; CHECK-NEXT:    fmul v3.4s, v3.4s, v5.4s
-; CHECK-NEXT:    fcmeq v5.4s, v1.4s, #0.0
-; CHECK-NEXT:    bif v1.16b, v3.16b, v5.16b
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: f8sqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte v2.4s, v0.4s
+; CHECK-SD-NEXT:    frsqrte v3.4s, v1.4s
+; CHECK-SD-NEXT:    fmul v4.4s, v2.4s, v2.4s
+; CHECK-SD-NEXT:    frsqrts v4.4s, v0.4s, v4.4s
+; CHECK-SD-NEXT:    fmul v5.4s, v3.4s, v3.4s
+; CHECK-SD-NEXT:    frsqrts v5.4s, v1.4s, v5.4s
+; CHECK-SD-NEXT:    fmul v2.4s, v2.4s, v4.4s
+; CHECK-SD-NEXT:    fmul v4.4s, v2.4s, v2.4s
+; CHECK-SD-NEXT:    fmul v2.4s, v0.4s, v2.4s
+; CHECK-SD-NEXT:    frsqrts v4.4s, v0.4s, v4.4s
+; CHECK-SD-NEXT:    fmul v3.4s, v3.4s, v5.4s
+; CHECK-SD-NEXT:    fmul v5.4s, v3.4s, v3.4s
+; CHECK-SD-NEXT:    fmul v3.4s, v1.4s, v3.4s
+; CHECK-SD-NEXT:    frsqrts v5.4s, v1.4s, v5.4s
+; CHECK-SD-NEXT:    fmul v2.4s, v2.4s, v4.4s
+; CHECK-SD-NEXT:    fcmeq v4.4s, v0.4s, #0.0
+; CHECK-SD-NEXT:    bif v0.16b, v2.16b, v4.16b
+; CHECK-SD-NEXT:    fmul v3.4s, v3.4s, v5.4s
+; CHECK-SD-NEXT:    fcmeq v5.4s, v1.4s, #0.0
+; CHECK-SD-NEXT:    bif v1.16b, v3.16b, v5.16b
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: f8sqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt v0.4s, v0.4s
+; CHECK-GI-NEXT:    fsqrt v1.4s, v1.4s
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast <8 x float> @llvm.sqrt.v8f32(<8 x float> %a)
   ret <8 x float> %1
 }
@@ -142,22 +162,27 @@ define double @dsqrt(double %a) {
 ; FAULT-NEXT:    fsqrt d0, d0
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: dsqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte d1, d0
-; CHECK-NEXT:    fcmp d0, #0.0
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    fmul d1, d0, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fcsel d0, d0, d1, eq
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: dsqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte d1, d0
+; CHECK-SD-NEXT:    fcmp d0, #0.0
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    fmul d1, d0, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fcsel d0, d0, d1, eq
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: dsqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt d0, d0
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast double @llvm.sqrt.f64(double %a)
   ret double %1
 }
@@ -168,22 +193,27 @@ define double @dsqrt_ieee_denorms(double %a) #0 {
 ; FAULT-NEXT:    fsqrt d0, d0
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: dsqrt_ieee_denorms:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte d1, d0
-; CHECK-NEXT:    fcmp d0, #0.0
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    fmul d1, d0, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fcsel d0, d0, d1, eq
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: dsqrt_ieee_denorms:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte d1, d0
+; CHECK-SD-NEXT:    fcmp d0, #0.0
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    fmul d1, d0, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fcsel d0, d0, d1, eq
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: dsqrt_ieee_denorms:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt d0, d0
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast double @llvm.sqrt.f64(double %a)
   ret double %1
 }
@@ -194,22 +224,27 @@ define <2 x double> @d2sqrt(<2 x double> %a) {
 ; FAULT-NEXT:    fsqrt v0.2d, v0.2d
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: d2sqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte v1.2d, v0.2d
-; CHECK-NEXT:    fmul v2.2d, v1.2d, v1.2d
-; CHECK-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
-; CHECK-NEXT:    fmul v1.2d, v1.2d, v2.2d
-; CHECK-NEXT:    fmul v2.2d, v1.2d, v1.2d
-; CHECK-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
-; CHECK-NEXT:    fmul v1.2d, v1.2d, v2.2d
-; CHECK-NEXT:    fmul v2.2d, v1.2d, v1.2d
-; CHECK-NEXT:    fmul v1.2d, v0.2d, v1.2d
-; CHECK-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
-; CHECK-NEXT:    fmul v1.2d, v1.2d, v2.2d
-; CHECK-NEXT:    fcmeq v2.2d, v0.2d, #0.0
-; CHECK-NEXT:    bif v0.16b, v1.16b, v2.16b
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: d2sqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte v1.2d, v0.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v1.2d, v1.2d
+; CHECK-SD-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v1.2d, v1.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v1.2d, v1.2d
+; CHECK-SD-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v1.2d, v1.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v1.2d, v1.2d
+; CHECK-SD-NEXT:    fmul v1.2d, v0.2d, v1.2d
+; CHECK-SD-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v1.2d, v1.2d, v2.2d
+; CHECK-SD-NEXT:    fcmeq v2.2d, v0.2d, #0.0
+; CHECK-SD-NEXT:    bif v0.16b, v1.16b, v2.16b
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: d2sqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt v0.2d, v0.2d
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast <2 x double> @llvm.sqrt.v2f64(<2 x double> %a)
   ret <2 x double> %1
 }
@@ -221,35 +256,41 @@ define <4 x double> @d4sqrt(<4 x double> %a) {
 ; FAULT-NEXT:    fsqrt v1.2d, v1.2d
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: d4sqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte v2.2d, v0.2d
-; CHECK-NEXT:    frsqrte v3.2d, v1.2d
-; CHECK-NEXT:    fmul v4.2d, v2.2d, v2.2d
-; CHECK-NEXT:    frsqrts v4.2d, v0.2d, v4.2d
-; CHECK-NEXT:    fmul v5.2d, v3.2d, v3.2d
-; CHECK-NEXT:    frsqrts v5.2d, v1.2d, v5.2d
-; CHECK-NEXT:    fmul v2.2d, v2.2d, v4.2d
-; CHECK-NEXT:    fmul v4.2d, v2.2d, v2.2d
-; CHECK-NEXT:    frsqrts v4.2d, v0.2d, v4.2d
-; CHECK-NEXT:    fmul v3.2d, v3.2d, v5.2d
-; CHECK-NEXT:    fmul v5.2d, v3.2d, v3.2d
-; CHECK-NEXT:    frsqrts v5.2d, v1.2d, v5.2d
-; CHECK-NEXT:    fmul v2.2d, v2.2d, v4.2d
-; CHECK-NEXT:    fmul v4.2d, v2.2d, v2.2d
-; CHECK-NEXT:    fmul v2.2d, v0.2d, v2.2d
-; CHECK-NEXT:    frsqrts v4.2d, v0.2d, v4.2d
-; CHECK-NEXT:    fmul v3.2d, v3.2d, v5.2d
-; CHECK-NEXT:    fmul v5.2d, v3.2d, v3.2d
-; CHECK-NEXT:    fmul v3.2d, v1.2d, v3.2d
-; CHECK-NEXT:    frsqrts v5.2d, v1.2d, v5.2d
-; CHECK-NEXT:    fmul v2.2d, v2.2d, v4.2d
-; CHECK-NEXT:    fcmeq v4.2d, v0.2d, #0.0
-; CHECK-NEXT:    bif v0.16b, v2.16b, v4.16b
-; CHECK-NEXT:    fmul v3.2d, v3.2d, v5.2d
-; CHECK-NEXT:    fcmeq v5.2d, v1.2d, #0.0
-; CHECK-NEXT:    bif v1.16b, v3.16b, v5.16b
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: d4sqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte v2.2d, v0.2d
+; CHECK-SD-NEXT:    frsqrte v3.2d, v1.2d
+; CHECK-SD-NEXT:    fmul v4.2d, v2.2d, v2.2d
+; CHECK-SD-NEXT:    frsqrts v4.2d, v0.2d, v4.2d
+; CHECK-SD-NEXT:    fmul v5.2d, v3.2d, v3.2d
+; CHECK-SD-NEXT:    frsqrts v5.2d, v1.2d, v5.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v2.2d, v4.2d
+; CHECK-SD-NEXT:    fmul v4.2d, v2.2d, v2.2d
+; CHECK-SD-NEXT:    frsqrts v4.2d, v0.2d, v4.2d
+; CHECK-SD-NEXT:    fmul v3.2d, v3.2d, v5.2d
+; CHECK-SD-NEXT:    fmul v5.2d, v3.2d, v3.2d
+; CHECK-SD-NEXT:    frsqrts v5.2d, v1.2d, v5.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v2.2d, v4.2d
+; CHECK-SD-NEXT:    fmul v4.2d, v2.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v0.2d, v2.2d
+; CHECK-SD-NEXT:    frsqrts v4.2d, v0.2d, v4.2d
+; CHECK-SD-NEXT:    fmul v3.2d, v3.2d, v5.2d
+; CHECK-SD-NEXT:    fmul v5.2d, v3.2d, v3.2d
+; CHECK-SD-NEXT:    fmul v3.2d, v1.2d, v3.2d
+; CHECK-SD-NEXT:    frsqrts v5.2d, v1.2d, v5.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v2.2d, v4.2d
+; CHECK-SD-NEXT:    fcmeq v4.2d, v0.2d, #0.0
+; CHECK-SD-NEXT:    bif v0.16b, v2.16b, v4.16b
+; CHECK-SD-NEXT:    fmul v3.2d, v3.2d, v5.2d
+; CHECK-SD-NEXT:    fcmeq v5.2d, v1.2d, #0.0
+; CHECK-SD-NEXT:    bif v1.16b, v3.16b, v5.16b
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: d4sqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt v0.2d, v0.2d
+; CHECK-GI-NEXT:    fsqrt v1.2d, v1.2d
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast <4 x double> @llvm.sqrt.v4f64(<4 x double> %a)
   ret <4 x double> %1
 }
@@ -262,16 +303,23 @@ define float @frsqrt(float %a) {
 ; FAULT-NEXT:    fdiv s0, s1, s0
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: frsqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte s1, s0
-; CHECK-NEXT:    fmul s2, s1, s1
-; CHECK-NEXT:    frsqrts s2, s0, s2
-; CHECK-NEXT:    fmul s1, s1, s2
-; CHECK-NEXT:    fmul s2, s1, s1
-; CHECK-NEXT:    frsqrts s0, s0, s2
-; CHECK-NEXT:    fmul s0, s1, s0
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: frsqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte s1, s0
+; CHECK-SD-NEXT:    fmul s2, s1, s1
+; CHECK-SD-NEXT:    frsqrts s2, s0, s2
+; CHECK-SD-NEXT:    fmul s1, s1, s2
+; CHECK-SD-NEXT:    fmul s2, s1, s1
+; CHECK-SD-NEXT:    frsqrts s0, s0, s2
+; CHECK-SD-NEXT:    fmul s0, s1, s0
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: frsqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt s0, s0
+; CHECK-GI-NEXT:    fmov s1, #1.00000000
+; CHECK-GI-NEXT:    fdiv s0, s1, s0
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast float @llvm.sqrt.f32(float %a)
   %2 = fdiv fast float 1.000000e+00, %1
   ret float %2
@@ -285,16 +333,23 @@ define <2 x float> @f2rsqrt(<2 x float> %a) {
 ; FAULT-NEXT:    fdiv v0.2s, v1.2s, v0.2s
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: f2rsqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte v1.2s, v0.2s
-; CHECK-NEXT:    fmul v2.2s, v1.2s, v1.2s
-; CHECK-NEXT:    frsqrts v2.2s, v0.2s, v2.2s
-; CHECK-NEXT:    fmul v1.2s, v1.2s, v2.2s
-; CHECK-NEXT:    fmul v2.2s, v1.2s, v1.2s
-; CHECK-NEXT:    frsqrts v0.2s, v0.2s, v2.2s
-; CHECK-NEXT:    fmul v0.2s, v1.2s, v0.2s
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: f2rsqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte v1.2s, v0.2s
+; CHECK-SD-NEXT:    fmul v2.2s, v1.2s, v1.2s
+; CHECK-SD-NEXT:    frsqrts v2.2s, v0.2s, v2.2s
+; CHECK-SD-NEXT:    fmul v1.2s, v1.2s, v2.2s
+; CHECK-SD-NEXT:    fmul v2.2s, v1.2s, v1.2s
+; CHECK-SD-NEXT:    frsqrts v0.2s, v0.2s, v2.2s
+; CHECK-SD-NEXT:    fmul v0.2s, v1.2s, v0.2s
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: f2rsqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt v0.2s, v0.2s
+; CHECK-GI-NEXT:    fmov v1.2s, #1.00000000
+; CHECK-GI-NEXT:    fdiv v0.2s, v1.2s, v0.2s
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast <2 x float> @llvm.sqrt.v2f32(<2 x float> %a)
   %2 = fdiv fast <2 x float> <float 1.000000e+00, float 1.000000e+00>, %1
   ret <2 x float> %2
@@ -308,16 +363,23 @@ define <4 x float> @f4rsqrt(<4 x float> %a) {
 ; FAULT-NEXT:    fdiv v0.4s, v1.4s, v0.4s
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: f4rsqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte v1.4s, v0.4s
-; CHECK-NEXT:    fmul v2.4s, v1.4s, v1.4s
-; CHECK-NEXT:    frsqrts v2.4s, v0.4s, v2.4s
-; CHECK-NEXT:    fmul v1.4s, v1.4s, v2.4s
-; CHECK-NEXT:    fmul v2.4s, v1.4s, v1.4s
-; CHECK-NEXT:    frsqrts v0.4s, v0.4s, v2.4s
-; CHECK-NEXT:    fmul v0.4s, v1.4s, v0.4s
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: f4rsqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte v1.4s, v0.4s
+; CHECK-SD-NEXT:    fmul v2.4s, v1.4s, v1.4s
+; CHECK-SD-NEXT:    frsqrts v2.4s, v0.4s, v2.4s
+; CHECK-SD-NEXT:    fmul v1.4s, v1.4s, v2.4s
+; CHECK-SD-NEXT:    fmul v2.4s, v1.4s, v1.4s
+; CHECK-SD-NEXT:    frsqrts v0.4s, v0.4s, v2.4s
+; CHECK-SD-NEXT:    fmul v0.4s, v1.4s, v0.4s
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: f4rsqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt v0.4s, v0.4s
+; CHECK-GI-NEXT:    fmov v1.4s, #1.00000000
+; CHECK-GI-NEXT:    fdiv v0.4s, v1.4s, v0.4s
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast <4 x float> @llvm.sqrt.v4f32(<4 x float> %a)
   %2 = fdiv fast <4 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, %1
   ret <4 x float> %2
@@ -333,23 +395,32 @@ define <8 x float> @f8rsqrt(<8 x float> %a) {
 ; FAULT-NEXT:    fdiv v1.4s, v2.4s, v1.4s
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: f8rsqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte v2.4s, v0.4s
-; CHECK-NEXT:    frsqrte v3.4s, v1.4s
-; CHECK-NEXT:    fmul v4.4s, v2.4s, v2.4s
-; CHECK-NEXT:    frsqrts v4.4s, v0.4s, v4.4s
-; CHECK-NEXT:    fmul v5.4s, v3.4s, v3.4s
-; CHECK-NEXT:    frsqrts v5.4s, v1.4s, v5.4s
-; CHECK-NEXT:    fmul v2.4s, v2.4s, v4.4s
-; CHECK-NEXT:    fmul v4.4s, v2.4s, v2.4s
-; CHECK-NEXT:    frsqrts v0.4s, v0.4s, v4.4s
-; CHECK-NEXT:    fmul v3.4s, v3.4s, v5.4s
-; CHECK-NEXT:    fmul v4.4s, v3.4s, v3.4s
-; CHECK-NEXT:    frsqrts v1.4s, v1.4s, v4.4s
-; CHECK-NEXT:    fmul v0.4s, v2.4s, v0.4s
-; CHECK-NEXT:    fmul v1.4s, v3.4s, v1.4s
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: f8rsqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte v2.4s, v0.4s
+; CHECK-SD-NEXT:    frsqrte v3.4s, v1.4s
+; CHECK-SD-NEXT:    fmul v4.4s, v2.4s, v2.4s
+; CHECK-SD-NEXT:    frsqrts v4.4s, v0.4s, v4.4s
+; CHECK-SD-NEXT:    fmul v5.4s, v3.4s, v3.4s
+; CHECK-SD-NEXT:    frsqrts v5.4s, v1.4s, v5.4s
+; CHECK-SD-NEXT:    fmul v2.4s, v2.4s, v4.4s
+; CHECK-SD-NEXT:    fmul v4.4s, v2.4s, v2.4s
+; CHECK-SD-NEXT:    frsqrts v0.4s, v0.4s, v4.4s
+; CHECK-SD-NEXT:    fmul v3.4s, v3.4s, v5.4s
+; CHECK-SD-NEXT:    fmul v4.4s, v3.4s, v3.4s
+; CHECK-SD-NEXT:    frsqrts v1.4s, v1.4s, v4.4s
+; CHECK-SD-NEXT:    fmul v0.4s, v2.4s, v0.4s
+; CHECK-SD-NEXT:    fmul v1.4s, v3.4s, v1.4s
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: f8rsqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt v0.4s, v0.4s
+; CHECK-GI-NEXT:    fmov v2.4s, #1.00000000
+; CHECK-GI-NEXT:    fsqrt v1.4s, v1.4s
+; CHECK-GI-NEXT:    fdiv v0.4s, v2.4s, v0.4s
+; CHECK-GI-NEXT:    fdiv v1.4s, v2.4s, v1.4s
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast <8 x float> @llvm.sqrt.v8f32(<8 x float> %a)
   %2 = fdiv fast <8 x float> <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>, %1
   ret <8 x float> %2
@@ -363,19 +434,26 @@ define double @drsqrt(double %a) {
 ; FAULT-NEXT:    fdiv d0, d1, d0
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: drsqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte d1, d0
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d0, d0, d2
-; CHECK-NEXT:    fmul d0, d1, d0
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: drsqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte d1, d0
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d0, d0, d2
+; CHECK-SD-NEXT:    fmul d0, d1, d0
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: drsqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt d0, d0
+; CHECK-GI-NEXT:    fmov d1, #1.00000000
+; CHECK-GI-NEXT:    fdiv d0, d1, d0
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast double @llvm.sqrt.f64(double %a)
   %2 = fdiv fast double 1.000000e+00, %1
   ret double %2
@@ -389,19 +467,26 @@ define <2 x double> @d2rsqrt(<2 x double> %a) {
 ; FAULT-NEXT:    fdiv v0.2d, v1.2d, v0.2d
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: d2rsqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte v1.2d, v0.2d
-; CHECK-NEXT:    fmul v2.2d, v1.2d, v1.2d
-; CHECK-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
-; CHECK-NEXT:    fmul v1.2d, v1.2d, v2.2d
-; CHECK-NEXT:    fmul v2.2d, v1.2d, v1.2d
-; CHECK-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
-; CHECK-NEXT:    fmul v1.2d, v1.2d, v2.2d
-; CHECK-NEXT:    fmul v2.2d, v1.2d, v1.2d
-; CHECK-NEXT:    frsqrts v0.2d, v0.2d, v2.2d
-; CHECK-NEXT:    fmul v0.2d, v1.2d, v0.2d
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: d2rsqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte v1.2d, v0.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v1.2d, v1.2d
+; CHECK-SD-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v1.2d, v1.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v1.2d, v1.2d
+; CHECK-SD-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v1.2d, v1.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v1.2d, v1.2d
+; CHECK-SD-NEXT:    frsqrts v0.2d, v0.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v0.2d, v1.2d, v0.2d
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: d2rsqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt v0.2d, v0.2d
+; CHECK-GI-NEXT:    fmov v1.2d, #1.00000000
+; CHECK-GI-NEXT:    fdiv v0.2d, v1.2d, v0.2d
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast <2 x double> @llvm.sqrt.v2f64(<2 x double> %a)
   %2 = fdiv fast <2 x double> <double 1.000000e+00, double 1.000000e+00>, %1
   ret <2 x double> %2
@@ -417,109 +502,156 @@ define <4 x double> @d4rsqrt(<4 x double> %a) #0 {
 ; FAULT-NEXT:    fdiv v1.2d, v2.2d, v1.2d
 ; FAULT-NEXT:    ret
 ;
-; CHECK-LABEL: d4rsqrt:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte v2.2d, v0.2d
-; CHECK-NEXT:    frsqrte v3.2d, v1.2d
-; CHECK-NEXT:    fmul v4.2d, v2.2d, v2.2d
-; CHECK-NEXT:    frsqrts v4.2d, v0.2d, v4.2d
-; CHECK-NEXT:    fmul v5.2d, v3.2d, v3.2d
-; CHECK-NEXT:    frsqrts v5.2d, v1.2d, v5.2d
-; CHECK-NEXT:    fmul v2.2d, v2.2d, v4.2d
-; CHECK-NEXT:    fmul v4.2d, v2.2d, v2.2d
-; CHECK-NEXT:    frsqrts v4.2d, v0.2d, v4.2d
-; CHECK-NEXT:    fmul v3.2d, v3.2d, v5.2d
-; CHECK-NEXT:    fmul v5.2d, v3.2d, v3.2d
-; CHECK-NEXT:    frsqrts v5.2d, v1.2d, v5.2d
-; CHECK-NEXT:    fmul v2.2d, v2.2d, v4.2d
-; CHECK-NEXT:    fmul v4.2d, v2.2d, v2.2d
-; CHECK-NEXT:    frsqrts v0.2d, v0.2d, v4.2d
-; CHECK-NEXT:    fmul v3.2d, v3.2d, v5.2d
-; CHECK-NEXT:    fmul v4.2d, v3.2d, v3.2d
-; CHECK-NEXT:    frsqrts v1.2d, v1.2d, v4.2d
-; CHECK-NEXT:    fmul v0.2d, v2.2d, v0.2d
-; CHECK-NEXT:    fmul v1.2d, v3.2d, v1.2d
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: d4rsqrt:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte v2.2d, v0.2d
+; CHECK-SD-NEXT:    frsqrte v3.2d, v1.2d
+; CHECK-SD-NEXT:    fmul v4.2d, v2.2d, v2.2d
+; CHECK-SD-NEXT:    frsqrts v4.2d, v0.2d, v4.2d
+; CHECK-SD-NEXT:    fmul v5.2d, v3.2d, v3.2d
+; CHECK-SD-NEXT:    frsqrts v5.2d, v1.2d, v5.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v2.2d, v4.2d
+; CHECK-SD-NEXT:    fmul v4.2d, v2.2d, v2.2d
+; CHECK-SD-NEXT:    frsqrts v4.2d, v0.2d, v4.2d
+; CHECK-SD-NEXT:    fmul v3.2d, v3.2d, v5.2d
+; CHECK-SD-NEXT:    fmul v5.2d, v3.2d, v3.2d
+; CHECK-SD-NEXT:    frsqrts v5.2d, v1.2d, v5.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v2.2d, v4.2d
+; CHECK-SD-NEXT:    fmul v4.2d, v2.2d, v2.2d
+; CHECK-SD-NEXT:    frsqrts v0.2d, v0.2d, v4.2d
+; CHECK-SD-NEXT:    fmul v3.2d, v3.2d, v5.2d
+; CHECK-SD-NEXT:    fmul v4.2d, v3.2d, v3.2d
+; CHECK-SD-NEXT:    frsqrts v1.2d, v1.2d, v4.2d
+; CHECK-SD-NEXT:    fmul v0.2d, v2.2d, v0.2d
+; CHECK-SD-NEXT:    fmul v1.2d, v3.2d, v1.2d
+; CHECK-SD-NEXT:    ret
+;
+; CHECK-GI-LABEL: d4rsqrt:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt v0.2d, v0.2d
+; CHECK-GI-NEXT:    fmov v2.2d, #1.00000000
+; CHECK-GI-NEXT:    fsqrt v1.2d, v1.2d
+; CHECK-GI-NEXT:    fdiv v0.2d, v2.2d, v0.2d
+; CHECK-GI-NEXT:    fdiv v1.2d, v2.2d, v1.2d
+; CHECK-GI-NEXT:    ret
   %1 = tail call fast <4 x double> @llvm.sqrt.v4f64(<4 x double> %a)
   %2 = fdiv fast <4 x double> <double 1.000000e+00, double 1.000000e+00, double 1.000000e+00, double 1.000000e+00>, %1
   ret <4 x double> %2
 }
 
 define double @sqrt_fdiv_common_operand(double %x) nounwind {
-; FAULT-LABEL: sqrt_fdiv_common_operand:
-; FAULT:       // %bb.0:
-; FAULT-NEXT:    fsqrt d0, d0
-; FAULT-NEXT:    ret
+; FAULT-SD-LABEL: sqrt_fdiv_common_operand:
+; FAULT-SD:       // %bb.0:
+; FAULT-SD-NEXT:    fsqrt d0, d0
+; FAULT-SD-NEXT:    ret
+;
+; CHECK-SD-LABEL: sqrt_fdiv_common_operand:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte d1, d0
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d0, d0, d1
+; CHECK-SD-NEXT:    fmul d0, d0, d2
+; CHECK-SD-NEXT:    ret
+;
+; FAULT-GI-LABEL: sqrt_fdiv_common_operand:
+; FAULT-GI:       // %bb.0:
+; FAULT-GI-NEXT:    fsqrt d1, d0
+; FAULT-GI-NEXT:    fdiv d0, d0, d1
+; FAULT-GI-NEXT:    ret
 ;
-; CHECK-LABEL: sqrt_fdiv_common_operand:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte d1, d0
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d0, d0, d1
-; CHECK-NEXT:    fmul d0, d0, d2
-; CHECK-NEXT:    ret
+; CHECK-GI-LABEL: sqrt_fdiv_common_operand:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt d1, d0
+; CHECK-GI-NEXT:    fdiv d0, d0, d1
+; CHECK-GI-NEXT:    ret
   %sqrt = call fast double @llvm.sqrt.f64(double %x)
   %r = fdiv fast double %x, %sqrt
   ret double %r
 }
 
 define <2 x double> @sqrt_fdiv_common_operand_vec(<2 x double> %x) nounwind {
-; FAULT-LABEL: sqrt_fdiv_common_operand_vec:
-; FAULT:       // %bb.0:
-; FAULT-NEXT:    fsqrt v0.2d, v0.2d
-; FAULT-NEXT:    ret
+; FAULT-SD-LABEL: sqrt_fdiv_common_operand_vec:
+; FAULT-SD:       // %bb.0:
+; FAULT-SD-NEXT:    fsqrt v0.2d, v0.2d
+; FAULT-SD-NEXT:    ret
 ;
-; CHECK-LABEL: sqrt_fdiv_common_operand_vec:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte v1.2d, v0.2d
-; CHECK-NEXT:    fmul v2.2d, v1.2d, v1.2d
-; CHECK-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
-; CHECK-NEXT:    fmul v1.2d, v1.2d, v2.2d
-; CHECK-NEXT:    fmul v2.2d, v1.2d, v1.2d
-; CHECK-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
-; CHECK-NEXT:    fmul v1.2d, v1.2d, v2.2d
-; CHECK-NEXT:    fmul v2.2d, v1.2d, v1.2d
-; CHECK-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
-; CHECK-NEXT:    fmul v0.2d, v0.2d, v1.2d
-; CHECK-NEXT:    fmul v0.2d, v0.2d, v2.2d
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: sqrt_fdiv_common_operand_vec:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte v1.2d, v0.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v1.2d, v1.2d
+; CHECK-SD-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v1.2d, v1.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v1.2d, v1.2d
+; CHECK-SD-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v1.2d, v1.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v2.2d, v1.2d, v1.2d
+; CHECK-SD-NEXT:    frsqrts v2.2d, v0.2d, v2.2d
+; CHECK-SD-NEXT:    fmul v0.2d, v0.2d, v1.2d
+; CHECK-SD-NEXT:    fmul v0.2d, v0.2d, v2.2d
+; CHECK-SD-NEXT:    ret
+;
+; FAULT-GI-LABEL: sqrt_fdiv_common_operand_vec:
+; FAULT-GI:       // %bb.0:
+; FAULT-GI-NEXT:    fsqrt v1.2d, v0.2d
+; FAULT-GI-NEXT:    fdiv v0.2d, v0.2d, v1.2d
+; FAULT-GI-NEXT:    ret
+;
+; CHECK-GI-LABEL: sqrt_fdiv_common_operand_vec:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt v1.2d, v0.2d
+; CHECK-GI-NEXT:    fdiv v0.2d, v0.2d, v1.2d
+; CHECK-GI-NEXT:    ret
   %sqrt = call <2 x double> @llvm.sqrt.v2f64(<2 x double> %x)
   %r = fdiv arcp nsz reassoc <2 x double> %x, %sqrt
   ret <2 x double> %r
 }
 
 define double @sqrt_fdiv_common_operand_extra_use(double %x, ptr %p) nounwind {
-; FAULT-LABEL: sqrt_fdiv_common_operand_extra_use:
-; FAULT:       // %bb.0:
-; FAULT-NEXT:    fsqrt d0, d0
-; FAULT-NEXT:    str d0, [x0]
-; FAULT-NEXT:    ret
+; FAULT-SD-LABEL: sqrt_fdiv_common_operand_extra_use:
+; FAULT-SD:       // %bb.0:
+; FAULT-SD-NEXT:    fsqrt d0, d0
+; FAULT-SD-NEXT:    str d0, [x0]
+; FAULT-SD-NEXT:    ret
+;
+; CHECK-SD-LABEL: sqrt_fdiv_common_operand_extra_use:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte d1, d0
+; CHECK-SD-NEXT:    fcmp d0, #0.0
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    fmul d1, d0, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fcsel d2, d0, d1, eq
+; CHECK-SD-NEXT:    fmov d0, d1
+; CHECK-SD-NEXT:    str d2, [x0]
+; CHECK-SD-NEXT:    ret
+;
+; FAULT-GI-LABEL: sqrt_fdiv_common_operand_extra_use:
+; FAULT-GI:       // %bb.0:
+; FAULT-GI-NEXT:    fsqrt d1, d0
+; FAULT-GI-NEXT:    str d1, [x0]
+; FAULT-GI-NEXT:    fdiv d0, d0, d1
+; FAULT-GI-NEXT:    ret
 ;
-; CHECK-LABEL: sqrt_fdiv_common_operand_extra_use:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte d1, d0
-; CHECK-NEXT:    fcmp d0, #0.0
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    fmul d1, d0, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fcsel d2, d0, d1, eq
-; CHECK-NEXT:    fmov d0, d1
-; CHECK-NEXT:    str d2, [x0]
-; CHECK-NEXT:    ret
+; CHECK-GI-LABEL: sqrt_fdiv_common_operand_extra_use:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt d1, d0
+; CHECK-GI-NEXT:    str d1, [x0]
+; CHECK-GI-NEXT:    fdiv d0, d0, d1
+; CHECK-GI-NEXT:    ret
   %sqrt = call fast double @llvm.sqrt.f64(double %x)
   store double %sqrt, ptr %p
   %r = fdiv fast double %x, %sqrt
@@ -527,37 +659,63 @@ define double @sqrt_fdiv_common_operand_extra_use(double %x, ptr %p) nounwind {
 }
 
 define double @sqrt_simplify_before_recip_3_uses(double %x, ptr %p1, ptr %p2) nounwind {
-; FAULT-LABEL: sqrt_simplify_before_recip_3_uses:
-; FAULT:       // %bb.0:
-; FAULT-NEXT:    fsqrt d0, d0
-; FAULT-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
-; FAULT-NEXT:    fmov d1, #1.00000000
-; FAULT-NEXT:    fmov d2, x8
-; FAULT-NEXT:    fdiv d1, d1, d0
-; FAULT-NEXT:    fdiv d2, d2, d0
-; FAULT-NEXT:    str d1, [x0]
-; FAULT-NEXT:    str d2, [x1]
-; FAULT-NEXT:    ret
+; FAULT-SD-LABEL: sqrt_simplify_before_recip_3_uses:
+; FAULT-SD:       // %bb.0:
+; FAULT-SD-NEXT:    fsqrt d0, d0
+; FAULT-SD-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
+; FAULT-SD-NEXT:    fmov d1, #1.00000000
+; FAULT-SD-NEXT:    fmov d2, x8
+; FAULT-SD-NEXT:    fdiv d1, d1, d0
+; FAULT-SD-NEXT:    fdiv d2, d2, d0
+; FAULT-SD-NEXT:    str d1, [x0]
+; FAULT-SD-NEXT:    str d2, [x1]
+; FAULT-SD-NEXT:    ret
+;
+; CHECK-SD-LABEL: sqrt_simplify_before_recip_3_uses:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte d1, d0
+; CHECK-SD-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmov d2, x8
+; CHECK-SD-NEXT:    fmul d0, d0, d1
+; CHECK-SD-NEXT:    fmul d2, d1, d2
+; CHECK-SD-NEXT:    str d1, [x0]
+; CHECK-SD-NEXT:    str d2, [x1]
+; CHECK-SD-NEXT:    ret
+;
+; FAULT-GI-LABEL: sqrt_simplify_before_recip_3_uses:
+; FAULT-GI:       // %bb.0:
+; FAULT-GI-NEXT:    fsqrt d1, d0
+; FAULT-GI-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
+; FAULT-GI-NEXT:    fmov d2, #1.00000000
+; FAULT-GI-NEXT:    fmov d3, x8
+; FAULT-GI-NEXT:    fdiv d2, d2, d1
+; FAULT-GI-NEXT:    fdiv d0, d0, d1
+; FAULT-GI-NEXT:    str d2, [x0]
+; FAULT-GI-NEXT:    fdiv d1, d3, d1
+; FAULT-GI-NEXT:    str d1, [x1]
+; FAULT-GI-NEXT:    ret
 ;
-; CHECK-LABEL: sqrt_simplify_before_recip_3_uses:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte d1, d0
-; CHECK-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmov d2, x8
-; CHECK-NEXT:    fmul d0, d0, d1
-; CHECK-NEXT:    fmul d2, d1, d2
-; CHECK-NEXT:    str d1, [x0]
-; CHECK-NEXT:    str d2, [x1]
-; CHECK-NEXT:    ret
+; CHECK-GI-LABEL: sqrt_simplify_before_recip_3_uses:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt d1, d0
+; CHECK-GI-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
+; CHECK-GI-NEXT:    fmov d2, #1.00000000
+; CHECK-GI-NEXT:    fmov d3, x8
+; CHECK-GI-NEXT:    fdiv d2, d2, d1
+; CHECK-GI-NEXT:    fdiv d0, d0, d1
+; CHECK-GI-NEXT:    str d2, [x0]
+; CHECK-GI-NEXT:    fdiv d1, d3, d1
+; CHECK-GI-NEXT:    str d1, [x1]
+; CHECK-GI-NEXT:    ret
   %sqrt = tail call fast double @llvm.sqrt.f64(double %x)
   %rsqrt = fdiv fast double 1.0, %sqrt
   %r = fdiv fast double 42.0, %sqrt
@@ -568,43 +726,77 @@ define double @sqrt_simplify_before_recip_3_uses(double %x, ptr %p1, ptr %p2) no
 }
 
 define double @sqrt_simplify_before_recip_3_uses_order(double %x, ptr %p1, ptr %p2) nounwind {
-; FAULT-LABEL: sqrt_simplify_before_recip_3_uses_order:
-; FAULT:       // %bb.0:
-; FAULT-NEXT:    fsqrt d0, d0
-; FAULT-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
-; FAULT-NEXT:    fmov d1, x8
-; FAULT-NEXT:    mov x8, #140737488355328 // =0x800000000000
-; FAULT-NEXT:    movk x8, #16453, lsl #48
-; FAULT-NEXT:    fmov d2, x8
-; FAULT-NEXT:    fdiv d1, d1, d0
-; FAULT-NEXT:    fdiv d2, d2, d0
-; FAULT-NEXT:    str d1, [x0]
-; FAULT-NEXT:    str d2, [x1]
-; FAULT-NEXT:    ret
+; FAULT-SD-LABEL: sqrt_simplify_before_recip_3_uses_order:
+; FAULT-SD:       // %bb.0:
+; FAULT-SD-NEXT:    fsqrt d0, d0
+; FAULT-SD-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
+; FAULT-SD-NEXT:    fmov d1, x8
+; FAULT-SD-NEXT:    mov x8, #140737488355328 // =0x800000000000
+; FAULT-SD-NEXT:    movk x8, #16453, lsl #48
+; FAULT-SD-NEXT:    fmov d2, x8
+; FAULT-SD-NEXT:    fdiv d1, d1, d0
+; FAULT-SD-NEXT:    fdiv d2, d2, d0
+; FAULT-SD-NEXT:    str d1, [x0]
+; FAULT-SD-NEXT:    str d2, [x1]
+; FAULT-SD-NEXT:    ret
 ;
-; CHECK-LABEL: sqrt_simplify_before_recip_3_uses_order:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte d1, d0
-; CHECK-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmov d2, x8
-; CHECK-NEXT:    mov x8, #140737488355328 // =0x800000000000
-; CHECK-NEXT:    movk x8, #16453, lsl #48
-; CHECK-NEXT:    fmov d3, x8
-; CHECK-NEXT:    fmul d0, d0, d1
-; CHECK-NEXT:    fmul d2, d1, d2
-; CHECK-NEXT:    fmul d1, d1, d3
-; CHECK-NEXT:    str d2, [x0]
-; CHECK-NEXT:    str d1, [x1]
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: sqrt_simplify_before_recip_3_uses_order:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte d1, d0
+; CHECK-SD-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmov d2, x8
+; CHECK-SD-NEXT:    mov x8, #140737488355328 // =0x800000000000
+; CHECK-SD-NEXT:    movk x8, #16453, lsl #48
+; CHECK-SD-NEXT:    fmov d3, x8
+; CHECK-SD-NEXT:    fmul d0, d0, d1
+; CHECK-SD-NEXT:    fmul d2, d1, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d3
+; CHECK-SD-NEXT:    str d2, [x0]
+; CHECK-SD-NEXT:    str d1, [x1]
+; CHECK-SD-NEXT:    ret
+;
+; FAULT-GI-LABEL: sqrt_simplify_before_recip_3_uses_order:
+; FAULT-GI:       // %bb.0:
+; FAULT-GI-NEXT:    fsqrt d1, d0
+; FAULT-GI-NEXT:    fmov d2, #1.00000000
+; FAULT-GI-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
+; FAULT-GI-NEXT:    fdiv d1, d2, d1
+; FAULT-GI-NEXT:    fmov d2, x8
+; FAULT-GI-NEXT:    mov x8, #140737488355328 // =0x800000000000
+; FAULT-GI-NEXT:    movk x8, #16453, lsl #48
+; FAULT-GI-NEXT:    fmov d3, x8
+; FAULT-GI-NEXT:    fmul d0, d0, d1
+; FAULT-GI-NEXT:    fmul d2, d1, d2
+; FAULT-GI-NEXT:    fmul d1, d1, d3
+; FAULT-GI-NEXT:    str d2, [x0]
+; FAULT-GI-NEXT:    str d1, [x1]
+; FAULT-GI-NEXT:    ret
+;
+; CHECK-GI-LABEL: sqrt_simplify_before_recip_3_uses_order:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt d1, d0
+; CHECK-GI-NEXT:    fmov d2, #1.00000000
+; CHECK-GI-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
+; CHECK-GI-NEXT:    fdiv d1, d2, d1
+; CHECK-GI-NEXT:    fmov d2, x8
+; CHECK-GI-NEXT:    mov x8, #140737488355328 // =0x800000000000
+; CHECK-GI-NEXT:    movk x8, #16453, lsl #48
+; CHECK-GI-NEXT:    fmov d3, x8
+; CHECK-GI-NEXT:    fmul d0, d0, d1
+; CHECK-GI-NEXT:    fmul d2, d1, d2
+; CHECK-GI-NEXT:    fmul d1, d1, d3
+; CHECK-GI-NEXT:    str d2, [x0]
+; CHECK-GI-NEXT:    str d1, [x1]
+; CHECK-GI-NEXT:    ret
   %sqrt = tail call fast double @llvm.sqrt.f64(double %x)
   %sqrt_fast = fdiv fast double %x, %sqrt
   %r1 = fdiv fast double 42.0, %sqrt
@@ -616,50 +808,86 @@ define double @sqrt_simplify_before_recip_3_uses_order(double %x, ptr %p1, ptr %
 
 
 define double @sqrt_simplify_before_recip_4_uses(double %x, ptr %p1, ptr %p2, ptr %p3) nounwind {
-; FAULT-LABEL: sqrt_simplify_before_recip_4_uses:
-; FAULT:       // %bb.0:
-; FAULT-NEXT:    fsqrt d0, d0
-; FAULT-NEXT:    fmov d1, #1.00000000
-; FAULT-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
-; FAULT-NEXT:    fmov d2, x8
-; FAULT-NEXT:    mov x8, #140737488355328 // =0x800000000000
-; FAULT-NEXT:    movk x8, #16453, lsl #48
-; FAULT-NEXT:    fmov d3, x8
-; FAULT-NEXT:    fdiv d1, d1, d0
-; FAULT-NEXT:    fmul d2, d1, d2
-; FAULT-NEXT:    fmul d3, d1, d3
-; FAULT-NEXT:    str d1, [x0]
-; FAULT-NEXT:    str d2, [x1]
-; FAULT-NEXT:    str d3, [x2]
-; FAULT-NEXT:    ret
+; FAULT-SD-LABEL: sqrt_simplify_before_recip_4_uses:
+; FAULT-SD:       // %bb.0:
+; FAULT-SD-NEXT:    fsqrt d0, d0
+; FAULT-SD-NEXT:    fmov d1, #1.00000000
+; FAULT-SD-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
+; FAULT-SD-NEXT:    fmov d2, x8
+; FAULT-SD-NEXT:    mov x8, #140737488355328 // =0x800000000000
+; FAULT-SD-NEXT:    movk x8, #16453, lsl #48
+; FAULT-SD-NEXT:    fmov d3, x8
+; FAULT-SD-NEXT:    fdiv d1, d1, d0
+; FAULT-SD-NEXT:    fmul d2, d1, d2
+; FAULT-SD-NEXT:    fmul d3, d1, d3
+; FAULT-SD-NEXT:    str d1, [x0]
+; FAULT-SD-NEXT:    str d2, [x1]
+; FAULT-SD-NEXT:    str d3, [x2]
+; FAULT-SD-NEXT:    ret
 ;
-; CHECK-LABEL: sqrt_simplify_before_recip_4_uses:
-; CHECK:       // %bb.0:
-; CHECK-NEXT:    frsqrte d1, d0
-; CHECK-NEXT:    fcmp d0, #0.0
-; CHECK-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d1, d1
-; CHECK-NEXT:    frsqrts d2, d0, d2
-; CHECK-NEXT:    fmul d1, d1, d2
-; CHECK-NEXT:    fmul d2, d0, d1
-; CHECK-NEXT:    str d1, [x0]
-; CHECK-NEXT:    fcsel d2, d0, d2, eq
-; CHECK-NEXT:    fdiv d0, d0, d2
-; CHECK-NEXT:    fmov d2, x8
-; CHECK-NEXT:    mov x8, #140737488355328 // =0x800000000000
-; CHECK-NEXT:    movk x8, #16453, lsl #48
-; CHECK-NEXT:    fmov d3, x8
-; CHECK-NEXT:    fmul d2, d1, d2
-; CHECK-NEXT:    fmul d3, d1, d3
-; CHECK-NEXT:    str d2, [x1]
-; CHECK-NEXT:    str d3, [x2]
-; CHECK-NEXT:    ret
+; CHECK-SD-LABEL: sqrt_simplify_before_recip_4_uses:
+; CHECK-SD:       // %bb.0:
+; CHECK-SD-NEXT:    frsqrte d1, d0
+; CHECK-SD-NEXT:    fcmp d0, #0.0
+; CHECK-SD-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d1, d1
+; CHECK-SD-NEXT:    frsqrts d2, d0, d2
+; CHECK-SD-NEXT:    fmul d1, d1, d2
+; CHECK-SD-NEXT:    fmul d2, d0, d1
+; CHECK-SD-NEXT:    str d1, [x0]
+; CHECK-SD-NEXT:    fcsel d2, d0, d2, eq
+; CHECK-SD-NEXT:    fdiv d0, d0, d2
+; CHECK-SD-NEXT:    fmov d2, x8
+; CHECK-SD-NEXT:    mov x8, #140737488355328 // =0x800000000000
+; CHECK-SD-NEXT:    movk x8, #16453, lsl #48
+; CHECK-SD-NEXT:    fmov d3, x8
+; CHECK-SD-NEXT:    fmul d2, d1, d2
+; CHECK-SD-NEXT:    fmul d3, d1, d3
+; CHECK-SD-NEXT:    str d2, [x1]
+; CHECK-SD-NEXT:    str d3, [x2]
+; CHECK-SD-NEXT:    ret
+;
+; FAULT-GI-LABEL: sqrt_simplify_before_recip_4_uses:
+; FAULT-GI:       // %bb.0:
+; FAULT-GI-NEXT:    fsqrt d1, d0
+; FAULT-GI-NEXT:    fmov d2, #1.00000000
+; FAULT-GI-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
+; FAULT-GI-NEXT:    fdiv d1, d2, d1
+; FAULT-GI-NEXT:    fmov d2, x8
+; FAULT-GI-NEXT:    mov x8, #140737488355328 // =0x800000000000
+; FAULT-GI-NEXT:    movk x8, #16453, lsl #48
+; FAULT-GI-NEXT:    fmov d3, x8
+; FAULT-GI-NEXT:    fmul d2, d1, d2
+; FAULT-GI-NEXT:    fmul d0, d0, d1
+; FAULT-GI-NEXT:    str d1, [x0]
+; FAULT-GI-NEXT:    fmul d3, d1, d3
+; FAULT-GI-NEXT:    str d2, [x1]
+; FAULT-GI-NEXT:    str d3, [x2]
+; FAULT-GI-NEXT:    ret
+;
+; CHECK-GI-LABEL: sqrt_simplify_before_recip_4_uses:
+; CHECK-GI:       // %bb.0:
+; CHECK-GI-NEXT:    fsqrt d1, d0
+; CHECK-GI-NEXT:    fmov d2, #1.00000000
+; CHECK-GI-NEXT:    mov x8, #4631107791820423168 // =0x4045000000000000
+; CHECK-GI-NEXT:    fdiv d1, d2, d1
+; CHECK-GI-NEXT:    fmov d2, x8
+; CHECK-GI-NEXT:    mov x8, #140737488355328 // =0x800000000000
+; CHECK-GI-NEXT:    movk x8, #16453, lsl #48
+; CHECK-GI-NEXT:    fmov d3, x8
+; CHECK-GI-NEXT:    fmul d2, d1, d2
+; CHECK-GI-NEXT:    fmul d0, d0, d1
+; CHECK-GI-NEXT:    str d1, [x0]
+; CHECK-GI-NEXT:    fmul d3, d1, d3
+; CHECK-GI-NEXT:    str d2, [x1]
+; CHECK-GI-NEXT:    str d3, [x2]
+; CHECK-GI-NEXT:    ret
   %sqrt = tail call fast double @llvm.sqrt.f64(double %x)
   %rsqrt = fdiv fast double 1.0, %sqrt
   %r1 = fdiv fast double 42.0, %sqrt
@@ -672,3 +900,6 @@ define double @sqrt_simplify_before_recip_4_uses(double %x, ptr %p1, ptr %p2, pt
 }
 
 attributes #0 = { denormal_fpenv(ieee) }
+
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; CHECK: {{.*}}


        


More information about the llvm-commits mailing list