[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