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
63 lines
2.8 KiB
LLVM
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 }
|