mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-01 15:17:25 +00:00
X86 Peephole: fold loads to the source register operand if possible.
Machine CSE and other optimizations can remove instructions so folding is possible at peephole while not possible at ISel. This patch is a rework of r160919 and was tested on clang self-host on my local machine. rdar://10554090 and rdar://11873276 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161152 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
; RUN: llc < %s -march=x86-64 -mcpu=nehalem -asm-verbose=false | FileCheck %s
|
||||
; RUN: llc < %s -march=x86-64 -mcpu=nehalem -asm-verbose=false -enable-unsafe-fp-math -enable-no-nans-fp-math | FileCheck -check-prefix=UNSAFE %s
|
||||
; RUN: llc < %s -march=x86-64 -mcpu=nehalem -asm-verbose=false -enable-no-nans-fp-math | FileCheck -check-prefix=FINITE %s
|
||||
; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=nehalem -asm-verbose=false | FileCheck %s
|
||||
; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=nehalem -asm-verbose=false -enable-unsafe-fp-math -enable-no-nans-fp-math | FileCheck -check-prefix=UNSAFE %s
|
||||
; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=nehalem -asm-verbose=false -enable-no-nans-fp-math | FileCheck -check-prefix=FINITE %s
|
||||
|
||||
; Some of these patterns can be matched as SSE min or max. Some of
|
||||
; then can be matched provided that the operands are swapped.
|
||||
@@ -137,16 +137,13 @@ define double @ole_inverse(double %x, double %y) nounwind {
|
||||
}
|
||||
|
||||
; CHECK: ogt_x:
|
||||
; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; CHECK-NEXT: maxsd %xmm1, %xmm0
|
||||
; CHECK-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
|
||||
; CHECK-NEXT: ret
|
||||
; UNSAFE: ogt_x:
|
||||
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; UNSAFE-NEXT: maxsd %xmm1, %xmm0
|
||||
; UNSAFE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
|
||||
; UNSAFE-NEXT: ret
|
||||
; FINITE: ogt_x:
|
||||
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; FINITE-NEXT: maxsd %xmm1, %xmm0
|
||||
; FINITE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
|
||||
; FINITE-NEXT: ret
|
||||
define double @ogt_x(double %x) nounwind {
|
||||
%c = fcmp ogt double %x, 0.000000e+00
|
||||
@@ -155,16 +152,13 @@ define double @ogt_x(double %x) nounwind {
|
||||
}
|
||||
|
||||
; CHECK: olt_x:
|
||||
; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; CHECK-NEXT: minsd %xmm1, %xmm0
|
||||
; CHECK-NEXT: minsd LCP{{.*}}(%rip), %xmm0
|
||||
; CHECK-NEXT: ret
|
||||
; UNSAFE: olt_x:
|
||||
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; UNSAFE-NEXT: minsd %xmm1, %xmm0
|
||||
; UNSAFE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
|
||||
; UNSAFE-NEXT: ret
|
||||
; FINITE: olt_x:
|
||||
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; FINITE-NEXT: minsd %xmm1, %xmm0
|
||||
; FINITE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
|
||||
; FINITE-NEXT: ret
|
||||
define double @olt_x(double %x) nounwind {
|
||||
%c = fcmp olt double %x, 0.000000e+00
|
||||
@@ -217,12 +211,10 @@ define double @olt_inverse_x(double %x) nounwind {
|
||||
; CHECK: oge_x:
|
||||
; CHECK: ucomisd %xmm1, %xmm0
|
||||
; UNSAFE: oge_x:
|
||||
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; UNSAFE-NEXT: maxsd %xmm1, %xmm0
|
||||
; UNSAFE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
|
||||
; UNSAFE-NEXT: ret
|
||||
; FINITE: oge_x:
|
||||
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; FINITE-NEXT: maxsd %xmm1, %xmm0
|
||||
; FINITE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
|
||||
; FINITE-NEXT: ret
|
||||
define double @oge_x(double %x) nounwind {
|
||||
%c = fcmp oge double %x, 0.000000e+00
|
||||
@@ -233,12 +225,10 @@ define double @oge_x(double %x) nounwind {
|
||||
; CHECK: ole_x:
|
||||
; CHECK: ucomisd %xmm0, %xmm1
|
||||
; UNSAFE: ole_x:
|
||||
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; UNSAFE-NEXT: minsd %xmm1, %xmm0
|
||||
; UNSAFE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
|
||||
; UNSAFE-NEXT: ret
|
||||
; FINITE: ole_x:
|
||||
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; FINITE-NEXT: minsd %xmm1, %xmm0
|
||||
; FINITE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
|
||||
; FINITE-NEXT: ret
|
||||
define double @ole_x(double %x) nounwind {
|
||||
%c = fcmp ole double %x, 0.000000e+00
|
||||
@@ -411,12 +401,10 @@ define double @ule_inverse(double %x, double %y) nounwind {
|
||||
; CHECK: ugt_x:
|
||||
; CHECK: ucomisd %xmm0, %xmm1
|
||||
; UNSAFE: ugt_x:
|
||||
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; UNSAFE-NEXT: maxsd %xmm1, %xmm0
|
||||
; UNSAFE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
|
||||
; UNSAFE-NEXT: ret
|
||||
; FINITE: ugt_x:
|
||||
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; FINITE-NEXT: maxsd %xmm1, %xmm0
|
||||
; FINITE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
|
||||
; FINITE-NEXT: ret
|
||||
define double @ugt_x(double %x) nounwind {
|
||||
%c = fcmp ugt double %x, 0.000000e+00
|
||||
@@ -427,12 +415,10 @@ define double @ugt_x(double %x) nounwind {
|
||||
; CHECK: ult_x:
|
||||
; CHECK: ucomisd %xmm1, %xmm0
|
||||
; UNSAFE: ult_x:
|
||||
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; UNSAFE-NEXT: minsd %xmm1, %xmm0
|
||||
; UNSAFE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
|
||||
; UNSAFE-NEXT: ret
|
||||
; FINITE: ult_x:
|
||||
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; FINITE-NEXT: minsd %xmm1, %xmm0
|
||||
; FINITE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
|
||||
; FINITE-NEXT: ret
|
||||
define double @ult_x(double %x) nounwind {
|
||||
%c = fcmp ult double %x, 0.000000e+00
|
||||
@@ -482,12 +468,10 @@ define double @ult_inverse_x(double %x) nounwind {
|
||||
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
||||
; CHECK-NEXT: ret
|
||||
; UNSAFE: uge_x:
|
||||
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; UNSAFE-NEXT: maxsd %xmm1, %xmm0
|
||||
; UNSAFE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
|
||||
; UNSAFE-NEXT: ret
|
||||
; FINITE: uge_x:
|
||||
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; FINITE-NEXT: maxsd %xmm1, %xmm0
|
||||
; FINITE-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
|
||||
; FINITE-NEXT: ret
|
||||
define double @uge_x(double %x) nounwind {
|
||||
%c = fcmp uge double %x, 0.000000e+00
|
||||
@@ -501,12 +485,10 @@ define double @uge_x(double %x) nounwind {
|
||||
; CHECK-NEXT: movap{{[sd]}} %xmm1, %xmm0
|
||||
; CHECK-NEXT: ret
|
||||
; UNSAFE: ule_x:
|
||||
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; UNSAFE-NEXT: minsd %xmm1, %xmm0
|
||||
; UNSAFE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
|
||||
; UNSAFE-NEXT: ret
|
||||
; FINITE: ule_x:
|
||||
; FINITE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; FINITE-NEXT: minsd %xmm1, %xmm0
|
||||
; FINITE-NEXT: minsd LCP{{.*}}(%rip), %xmm0
|
||||
; FINITE-NEXT: ret
|
||||
define double @ule_x(double %x) nounwind {
|
||||
%c = fcmp ule double %x, 0.000000e+00
|
||||
@@ -515,8 +497,7 @@ define double @ule_x(double %x) nounwind {
|
||||
}
|
||||
|
||||
; CHECK: uge_inverse_x:
|
||||
; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; CHECK-NEXT: minsd %xmm1, %xmm0
|
||||
; CHECK-NEXT: minsd LCP{{.*}}(%rip), %xmm0
|
||||
; CHECK-NEXT: ret
|
||||
; UNSAFE: uge_inverse_x:
|
||||
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
@@ -535,8 +516,7 @@ define double @uge_inverse_x(double %x) nounwind {
|
||||
}
|
||||
|
||||
; CHECK: ule_inverse_x:
|
||||
; CHECK-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
; CHECK-NEXT: maxsd %xmm1, %xmm0
|
||||
; CHECK-NEXT: maxsd LCP{{.*}}(%rip), %xmm0
|
||||
; CHECK-NEXT: ret
|
||||
; UNSAFE: ule_inverse_x:
|
||||
; UNSAFE-NEXT: xorp{{[sd]}} %xmm1, %xmm1
|
||||
|
||||
Reference in New Issue
Block a user