llvm-project/llvm/test/CodeGen/X86/vector-sqrt.ll
Dehao Chen 65dd23e273 Add LiveRangeShrink pass to shrink live range within BB.
Summary: LiveRangeShrink pass moves instruction right after the definition with the same BB if the instruction and its operands all have more than one use. This pass is inexpensive and guarantees optimal live-range within BB.

Reviewers: davidxl, wmi, hfinkel, MatzeB, andreadb

Reviewed By: MatzeB, andreadb

Subscribers: hiraditya, jyknight, sanjoy, skatkov, gberry, jholewinski, qcolombet, javed.absar, krytarowski, atrick, spatel, RKSimon, andreadb, MatzeB, mehdi_amini, mgorny, efriedma, davide, dberlin, llvm-commits

Differential Revision: https://reviews.llvm.org/D32563

llvm-svn: 302938
2017-05-12 19:29:27 +00:00

63 lines
2.8 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s
; Function Attrs: nounwind readonly uwtable
define <2 x double> @sqrtd2(double* nocapture readonly %v) local_unnamed_addr #0 {
; CHECK-LABEL: sqrtd2:
; CHECK: # BB#0: # %entry
; CHECK-NEXT: vsqrtsd (%rdi), %xmm0, %xmm0
; CHECK-NEXT: vsqrtsd 8(%rdi), %xmm1, %xmm1
; CHECK-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0]
; CHECK-NEXT: retq
entry:
%0 = load double, double* %v, align 8
%call = tail call double @sqrt(double %0) #2
%arrayidx1 = getelementptr inbounds double, double* %v, i64 1
%1 = load double, double* %arrayidx1, align 8
%call2 = tail call double @sqrt(double %1) #2
%vecinit.i = insertelement <2 x double> undef, double %call, i32 0
%vecinit1.i = insertelement <2 x double> %vecinit.i, double %call2, i32 1
ret <2 x double> %vecinit1.i
}
; Function Attrs: nounwind readnone
declare double @sqrt(double) local_unnamed_addr #1
; Function Attrs: nounwind readonly uwtable
define <4 x float> @sqrtf4(float* nocapture readonly %v) local_unnamed_addr #0 {
; CHECK-LABEL: sqrtf4:
; CHECK: # BB#0: # %entry
; CHECK-NEXT: vsqrtss (%rdi), %xmm0, %xmm0
; CHECK-NEXT: vsqrtss 4(%rdi), %xmm1, %xmm1
; CHECK-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[2,3]
; CHECK-NEXT: vsqrtss 8(%rdi), %xmm2, %xmm1
; CHECK-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3]
; CHECK-NEXT: vsqrtss 12(%rdi), %xmm2, %xmm1
; CHECK-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0]
; CHECK-NEXT: retq
entry:
%0 = load float, float* %v, align 4
%call = tail call float @sqrtf(float %0) #2
%arrayidx1 = getelementptr inbounds float, float* %v, i64 1
%1 = load float, float* %arrayidx1, align 4
%call2 = tail call float @sqrtf(float %1) #2
%arrayidx3 = getelementptr inbounds float, float* %v, i64 2
%2 = load float, float* %arrayidx3, align 4
%call4 = tail call float @sqrtf(float %2) #2
%arrayidx5 = getelementptr inbounds float, float* %v, i64 3
%3 = load float, float* %arrayidx5, align 4
%call6 = tail call float @sqrtf(float %3) #2
%vecinit.i = insertelement <4 x float> undef, float %call, i32 0
%vecinit1.i = insertelement <4 x float> %vecinit.i, float %call2, i32 1
%vecinit2.i = insertelement <4 x float> %vecinit1.i, float %call4, i32 2
%vecinit3.i = insertelement <4 x float> %vecinit2.i, float %call6, i32 3
ret <4 x float> %vecinit3.i
}
; Function Attrs: nounwind readnone
declare float @sqrtf(float) local_unnamed_addr #1
attributes #0 = { nounwind readonly uwtable "target-features"="+avx" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind readnone "target-features"="+avx2" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #2 = { nounwind readnone }