Skip to content

Commit b3dc774

Browse files
author
Vyacheslav Klochkov
committedNov 16, 2016
Fixed the lost FastMathFlags for CALL operations in SLPVectorizer.
Reviewer: Michael Zolotukhin. Differential Revision: https://reviews.llvm.org/D26575 llvm-svn: 287064
1 parent e88a786 commit b3dc774

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed
 

‎llvm/lib/Transforms/Vectorize/SLPVectorizer.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -2641,6 +2641,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry *E) {
26412641
ExternalUses.push_back(ExternalUser(ScalarArg, cast<User>(V), 0));
26422642

26432643
E->VectorizedValue = V;
2644+
propagateIRFlags(E->VectorizedValue, E->Scalars);
26442645
++NumVectorInstructions;
26452646
return V;
26462647
}

‎llvm/test/Transforms/SLPVectorizer/X86/call.ll

+1-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ entry:
9898

9999

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

‎llvm/test/Transforms/SLPVectorizer/X86/propagate_ir_flags.ll

+38-1
Original file line numberDiff line numberDiff line change
@@ -398,5 +398,42 @@ define void @fcmp_no_fast(double* %x) #1 {
398398
ret void
399399
}
400400

401-
attributes #1 = { "target-features"="+avx" }
401+
declare double @llvm.fabs.f64(double) nounwind readnone
402+
403+
;CHECK-LABEL: @call_fast(
404+
;CHECK: call fast <2 x double> @llvm.fabs.v2f64
405+
define void @call_fast(double* %x) {
406+
%idx1 = getelementptr inbounds double, double* %x, i64 0
407+
%idx2 = getelementptr inbounds double, double* %x, i64 1
408+
409+
%load1 = load double, double* %idx1, align 8
410+
%load2 = load double, double* %idx2, align 8
411+
412+
%call1 = tail call fast double @llvm.fabs.f64(double %load1) nounwind readnone
413+
%call2 = tail call fast double @llvm.fabs.f64(double %load2) nounwind readnone
414+
415+
store double %call1, double* %idx1, align 8
416+
store double %call2, double* %idx2, align 8
417+
418+
ret void
419+
}
402420

421+
;CHECK-LABEL: @call_no_fast(
422+
;CHECK: call <2 x double> @llvm.fabs.v2f64
423+
define void @call_no_fast(double* %x) {
424+
%idx1 = getelementptr inbounds double, double* %x, i64 0
425+
%idx2 = getelementptr inbounds double, double* %x, i64 1
426+
427+
%load1 = load double, double* %idx1, align 8
428+
%load2 = load double, double* %idx2, align 8
429+
430+
%call1 = tail call fast double @llvm.fabs.f64(double %load1) nounwind readnone
431+
%call2 = tail call double @llvm.fabs.f64(double %load2) nounwind readnone
432+
433+
store double %call1, double* %idx1, align 8
434+
store double %call2, double* %idx2, align 8
435+
436+
ret void
437+
}
438+
439+
attributes #1 = { "target-features"="+avx" }

0 commit comments

Comments
 (0)
Please sign in to comment.