llvm/test/CodeGen/X86/rounding-ops.ll
Craig Topper 91c6e9af6e [X86] Add isel patterns for folding loads when creating ROUND instructions from ffloor/fnearbyint/fceil/frint/ftrunc.
We were missing packed isel folding patterns for all of sse41, avx, and avx512.

For some reason avx512 had scalar load folding patterns under optsize(due to partial/undef reg update), but we didn't have the equivalent sse41 and avx patterns.

Sometimes we would get load folding due to peephole pass anyway, but we're also missing avx512 instructions from the load folding table. I'll try to fix that in another patch.

Some of this was spotted in the review for D47993.

This patch adds all the folds to isel, adds a few spot tests, and disables the peephole pass on a few tests to ensure we're testing some of these patterns.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334460 91177308-0d34-0410-b5e6-96231b3b80d8
2018-06-12 00:48:57 +00:00

255 lines
7.4 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -disable-peephole -mtriple=x86_64-apple-macosx -mattr=+sse4.1 | FileCheck -check-prefix=CHECK-SSE %s
; RUN: llc < %s -disable-peephole -mtriple=x86_64-apple-macosx -mattr=+avx | FileCheck -check-prefix=CHECK-AVX %s
; RUN: llc < %s -disable-peephole -mtriple=x86_64-apple-macosx -mattr=+avx512f | FileCheck -check-prefix=CHECK-AVX512 %s
define float @test1(float %x) nounwind {
; CHECK-SSE-LABEL: test1:
; CHECK-SSE: ## %bb.0:
; CHECK-SSE-NEXT: roundss $9, %xmm0, %xmm0
; CHECK-SSE-NEXT: retq
;
; CHECK-AVX-LABEL: test1:
; CHECK-AVX: ## %bb.0:
; CHECK-AVX-NEXT: vroundss $9, %xmm0, %xmm0, %xmm0
; CHECK-AVX-NEXT: retq
;
; CHECK-AVX512-LABEL: test1:
; CHECK-AVX512: ## %bb.0:
; CHECK-AVX512-NEXT: vroundss $9, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%call = tail call float @floorf(float %x) nounwind readnone
ret float %call
}
declare float @floorf(float) nounwind readnone
define double @test2(double %x) nounwind {
; CHECK-SSE-LABEL: test2:
; CHECK-SSE: ## %bb.0:
; CHECK-SSE-NEXT: roundsd $9, %xmm0, %xmm0
; CHECK-SSE-NEXT: retq
;
; CHECK-AVX-LABEL: test2:
; CHECK-AVX: ## %bb.0:
; CHECK-AVX-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm0
; CHECK-AVX-NEXT: retq
;
; CHECK-AVX512-LABEL: test2:
; CHECK-AVX512: ## %bb.0:
; CHECK-AVX512-NEXT: vroundsd $9, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%call = tail call double @floor(double %x) nounwind readnone
ret double %call
}
declare double @floor(double) nounwind readnone
define float @test3(float %x) nounwind {
; CHECK-SSE-LABEL: test3:
; CHECK-SSE: ## %bb.0:
; CHECK-SSE-NEXT: roundss $12, %xmm0, %xmm0
; CHECK-SSE-NEXT: retq
;
; CHECK-AVX-LABEL: test3:
; CHECK-AVX: ## %bb.0:
; CHECK-AVX-NEXT: vroundss $12, %xmm0, %xmm0, %xmm0
; CHECK-AVX-NEXT: retq
;
; CHECK-AVX512-LABEL: test3:
; CHECK-AVX512: ## %bb.0:
; CHECK-AVX512-NEXT: vroundss $12, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%call = tail call float @nearbyintf(float %x) nounwind readnone
ret float %call
}
declare float @nearbyintf(float) nounwind readnone
define double @test4(double %x) nounwind {
; CHECK-SSE-LABEL: test4:
; CHECK-SSE: ## %bb.0:
; CHECK-SSE-NEXT: roundsd $12, %xmm0, %xmm0
; CHECK-SSE-NEXT: retq
;
; CHECK-AVX-LABEL: test4:
; CHECK-AVX: ## %bb.0:
; CHECK-AVX-NEXT: vroundsd $12, %xmm0, %xmm0, %xmm0
; CHECK-AVX-NEXT: retq
;
; CHECK-AVX512-LABEL: test4:
; CHECK-AVX512: ## %bb.0:
; CHECK-AVX512-NEXT: vroundsd $12, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%call = tail call double @nearbyint(double %x) nounwind readnone
ret double %call
}
declare double @nearbyint(double) nounwind readnone
define float @test5(float %x) nounwind {
; CHECK-SSE-LABEL: test5:
; CHECK-SSE: ## %bb.0:
; CHECK-SSE-NEXT: roundss $10, %xmm0, %xmm0
; CHECK-SSE-NEXT: retq
;
; CHECK-AVX-LABEL: test5:
; CHECK-AVX: ## %bb.0:
; CHECK-AVX-NEXT: vroundss $10, %xmm0, %xmm0, %xmm0
; CHECK-AVX-NEXT: retq
;
; CHECK-AVX512-LABEL: test5:
; CHECK-AVX512: ## %bb.0:
; CHECK-AVX512-NEXT: vroundss $10, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%call = tail call float @ceilf(float %x) nounwind readnone
ret float %call
}
declare float @ceilf(float) nounwind readnone
define double @test6(double %x) nounwind {
; CHECK-SSE-LABEL: test6:
; CHECK-SSE: ## %bb.0:
; CHECK-SSE-NEXT: roundsd $10, %xmm0, %xmm0
; CHECK-SSE-NEXT: retq
;
; CHECK-AVX-LABEL: test6:
; CHECK-AVX: ## %bb.0:
; CHECK-AVX-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm0
; CHECK-AVX-NEXT: retq
;
; CHECK-AVX512-LABEL: test6:
; CHECK-AVX512: ## %bb.0:
; CHECK-AVX512-NEXT: vroundsd $10, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%call = tail call double @ceil(double %x) nounwind readnone
ret double %call
}
declare double @ceil(double) nounwind readnone
define float @test7(float %x) nounwind {
; CHECK-SSE-LABEL: test7:
; CHECK-SSE: ## %bb.0:
; CHECK-SSE-NEXT: roundss $4, %xmm0, %xmm0
; CHECK-SSE-NEXT: retq
;
; CHECK-AVX-LABEL: test7:
; CHECK-AVX: ## %bb.0:
; CHECK-AVX-NEXT: vroundss $4, %xmm0, %xmm0, %xmm0
; CHECK-AVX-NEXT: retq
;
; CHECK-AVX512-LABEL: test7:
; CHECK-AVX512: ## %bb.0:
; CHECK-AVX512-NEXT: vroundss $4, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%call = tail call float @rintf(float %x) nounwind readnone
ret float %call
}
declare float @rintf(float) nounwind readnone
define double @test8(double %x) nounwind {
; CHECK-SSE-LABEL: test8:
; CHECK-SSE: ## %bb.0:
; CHECK-SSE-NEXT: roundsd $4, %xmm0, %xmm0
; CHECK-SSE-NEXT: retq
;
; CHECK-AVX-LABEL: test8:
; CHECK-AVX: ## %bb.0:
; CHECK-AVX-NEXT: vroundsd $4, %xmm0, %xmm0, %xmm0
; CHECK-AVX-NEXT: retq
;
; CHECK-AVX512-LABEL: test8:
; CHECK-AVX512: ## %bb.0:
; CHECK-AVX512-NEXT: vroundsd $4, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%call = tail call double @rint(double %x) nounwind readnone
ret double %call
}
declare double @rint(double) nounwind readnone
define float @test9(float %x) nounwind {
; CHECK-SSE-LABEL: test9:
; CHECK-SSE: ## %bb.0:
; CHECK-SSE-NEXT: roundss $11, %xmm0, %xmm0
; CHECK-SSE-NEXT: retq
;
; CHECK-AVX-LABEL: test9:
; CHECK-AVX: ## %bb.0:
; CHECK-AVX-NEXT: vroundss $11, %xmm0, %xmm0, %xmm0
; CHECK-AVX-NEXT: retq
;
; CHECK-AVX512-LABEL: test9:
; CHECK-AVX512: ## %bb.0:
; CHECK-AVX512-NEXT: vroundss $11, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%call = tail call float @truncf(float %x) nounwind readnone
ret float %call
}
declare float @truncf(float) nounwind readnone
define double @test10(double %x) nounwind {
; CHECK-SSE-LABEL: test10:
; CHECK-SSE: ## %bb.0:
; CHECK-SSE-NEXT: roundsd $11, %xmm0, %xmm0
; CHECK-SSE-NEXT: retq
;
; CHECK-AVX-LABEL: test10:
; CHECK-AVX: ## %bb.0:
; CHECK-AVX-NEXT: vroundsd $11, %xmm0, %xmm0, %xmm0
; CHECK-AVX-NEXT: retq
;
; CHECK-AVX512-LABEL: test10:
; CHECK-AVX512: ## %bb.0:
; CHECK-AVX512-NEXT: vroundsd $11, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%call = tail call double @trunc(double %x) nounwind readnone
ret double %call
}
declare double @trunc(double) nounwind readnone
define float @test11(float* %xptr) nounwind optsize {
; CHECK-SSE-LABEL: test11:
; CHECK-SSE: ## %bb.0:
; CHECK-SSE-NEXT: roundss $11, (%rdi), %xmm0
; CHECK-SSE-NEXT: retq
;
; CHECK-AVX-LABEL: test11:
; CHECK-AVX: ## %bb.0:
; CHECK-AVX-NEXT: vroundss $11, (%rdi), %xmm0, %xmm0
; CHECK-AVX-NEXT: retq
;
; CHECK-AVX512-LABEL: test11:
; CHECK-AVX512: ## %bb.0:
; CHECK-AVX512-NEXT: vroundss $11, (%rdi), %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%x = load float, float* %xptr
%call = tail call float @truncf(float %x) nounwind readnone
ret float %call
}
define double @test12(double* %xptr) nounwind optsize {
; CHECK-SSE-LABEL: test12:
; CHECK-SSE: ## %bb.0:
; CHECK-SSE-NEXT: roundsd $11, (%rdi), %xmm0
; CHECK-SSE-NEXT: retq
;
; CHECK-AVX-LABEL: test12:
; CHECK-AVX: ## %bb.0:
; CHECK-AVX-NEXT: vroundsd $11, (%rdi), %xmm0, %xmm0
; CHECK-AVX-NEXT: retq
;
; CHECK-AVX512-LABEL: test12:
; CHECK-AVX512: ## %bb.0:
; CHECK-AVX512-NEXT: vroundsd $11, (%rdi), %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%x = load double, double* %xptr
%call = tail call double @trunc(double %x) nounwind readnone
ret double %call
}