Fixed the lost FastMathFlags for CALL operations in SLPVectorizer.

Reviewer: Michael Zolotukhin.
Differential Revision: https://reviews.llvm.org/D26575

llvm-svn: 287064
This commit is contained in:
Vyacheslav Klochkov 2016-11-16 00:55:50 +00:00
parent e88a786947
commit b3dc774a99
3 changed files with 40 additions and 2 deletions

View File

@ -2641,6 +2641,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
ExternalUses.push_back(ExternalUser(ScalarArg, cast<User>(V), 0));
E->VectorizedValue = V;
propagateIRFlags(E->VectorizedValue, E->Scalars);
++NumVectorInstructions;
return V;
}

View File

@ -98,7 +98,7 @@ entry:
; CHECK: sqrt_libm
; CHECK: call <2 x double> @llvm.sqrt.v2f64
; CHECK: call nnan <2 x double> @llvm.sqrt.v2f64
; CHECK: ret void
define void @sqrt_libm(double* %a, double* %b, double* %c) {
entry:

View File

@ -398,5 +398,42 @@ define void @fcmp_no_fast(double* %x) #1 {
ret void
}
attributes #1 = { "target-features"="+avx" }
declare double @llvm.fabs.f64(double) nounwind readnone
;CHECK-LABEL: @call_fast(
;CHECK: call fast <2 x double> @llvm.fabs.v2f64
define void @call_fast(double* %x) {
%idx1 = getelementptr inbounds double, double* %x, i64 0
%idx2 = getelementptr inbounds double, double* %x, i64 1
%load1 = load double, double* %idx1, align 8
%load2 = load double, double* %idx2, align 8
%call1 = tail call fast double @llvm.fabs.f64(double %load1) nounwind readnone
%call2 = tail call fast double @llvm.fabs.f64(double %load2) nounwind readnone
store double %call1, double* %idx1, align 8
store double %call2, double* %idx2, align 8
ret void
}
;CHECK-LABEL: @call_no_fast(
;CHECK: call <2 x double> @llvm.fabs.v2f64
define void @call_no_fast(double* %x) {
%idx1 = getelementptr inbounds double, double* %x, i64 0
%idx2 = getelementptr inbounds double, double* %x, i64 1
%load1 = load double, double* %idx1, align 8
%load2 = load double, double* %idx2, align 8
%call1 = tail call fast double @llvm.fabs.f64(double %load1) nounwind readnone
%call2 = tail call double @llvm.fabs.f64(double %load2) nounwind readnone
store double %call1, double* %idx1, align 8
store double %call2, double* %idx2, align 8
ret void
}
attributes #1 = { "target-features"="+avx" }