Skip to content

Commit

Permalink
[FastISel] Don't transform FSUB(-0, X) -> FNEG(X) in FastISel
Browse files Browse the repository at this point in the history
This corresponds with the SelectionDAGISel change in D84056.

Also, rename some poorly named tests in CodeGen/X86/fast-isel-fneg.ll with NFC.

Differential Revision: https://reviews.llvm.org/D85149
  • Loading branch information
Cameron McInally committed Aug 4, 2020
1 parent 6d218b4 commit 0f2b47b
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 91 deletions.
7 changes: 1 addition & 6 deletions llvm/lib/CodeGen/SelectionDAG/FastISel.cpp
Expand Up @@ -1845,13 +1845,8 @@ bool FastISel::selectOperator(const User *I, unsigned Opcode) {
return selectBinaryOp(I, ISD::FADD);
case Instruction::Sub:
return selectBinaryOp(I, ISD::SUB);
case Instruction::FSub: {
// FNeg is currently represented in LLVM IR as a special case of FSub.
Value *X;
if (match(I, m_FNeg(m_Value(X))))
return selectFNeg(I, X);
case Instruction::FSub:
return selectBinaryOp(I, ISD::FSUB);
}
case Instruction::Mul:
return selectBinaryOp(I, ISD::MUL);
case Instruction::FMul:
Expand Down
22 changes: 0 additions & 22 deletions llvm/test/CodeGen/X86/fast-isel-fneg-kill.ll

This file was deleted.

79 changes: 16 additions & 63 deletions llvm/test/CodeGen/X86/fast-isel-fneg.ll
Expand Up @@ -2,16 +2,16 @@
; RUN: llc < %s -fast-isel -fast-isel-abort=3 -mtriple=x86_64-apple-darwin10 | FileCheck %s
; RUN: llc < %s -fast-isel -mtriple=i686-- -mattr=+sse2 | FileCheck --check-prefix=SSE2 %s

define double @doo(double %x) nounwind {
; CHECK-LABEL: doo:
define double @fneg_f64(double %x) nounwind {
; CHECK-LABEL: fneg_f64:
; CHECK: ## %bb.0:
; CHECK-NEXT: movq %xmm0, %rax
; CHECK-NEXT: movabsq $-9223372036854775808, %rcx ## imm = 0x8000000000000000
; CHECK-NEXT: xorq %rax, %rcx
; CHECK-NEXT: movq %rcx, %xmm0
; CHECK-NEXT: retq
;
; SSE2-LABEL: doo:
; SSE2-LABEL: fneg_f64:
; SSE2: # %bb.0:
; SSE2-NEXT: pushl %ebp
; SSE2-NEXT: movl %esp, %ebp
Expand All @@ -24,19 +24,19 @@ define double @doo(double %x) nounwind {
; SSE2-NEXT: movl %ebp, %esp
; SSE2-NEXT: popl %ebp
; SSE2-NEXT: retl
%y = fsub double -0.0, %x
%y = fneg double %x
ret double %y
}

define float @foo(float %x) nounwind {
; CHECK-LABEL: foo:
define float @fneg_f32(float %x) nounwind {
; CHECK-LABEL: fneg_f32:
; CHECK: ## %bb.0:
; CHECK-NEXT: movd %xmm0, %eax
; CHECK-NEXT: xorl $2147483648, %eax ## imm = 0x80000000
; CHECK-NEXT: movd %eax, %xmm0
; CHECK-NEXT: retq
;
; SSE2-LABEL: foo:
; SSE2-LABEL: fneg_f32:
; SSE2: # %bb.0:
; SSE2-NEXT: pushl %eax
; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
Expand All @@ -45,12 +45,12 @@ define float @foo(float %x) nounwind {
; SSE2-NEXT: flds (%esp)
; SSE2-NEXT: popl %eax
; SSE2-NEXT: retl
%y = fsub float -0.0, %x
%y = fneg float %x
ret float %y
}

define void @goo(double* %x, double* %y) nounwind {
; CHECK-LABEL: goo:
define void @fneg_f64_mem(double* %x, double* %y) nounwind {
; CHECK-LABEL: fneg_f64_mem:
; CHECK: ## %bb.0:
; CHECK-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
; CHECK-NEXT: movq %xmm0, %rax
Expand All @@ -60,7 +60,7 @@ define void @goo(double* %x, double* %y) nounwind {
; CHECK-NEXT: movq %xmm0, (%rsi)
; CHECK-NEXT: retq
;
; SSE2-LABEL: goo:
; SSE2-LABEL: fneg_f64_mem:
; SSE2: # %bb.0:
; SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
; SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
Expand All @@ -69,13 +69,13 @@ define void @goo(double* %x, double* %y) nounwind {
; SSE2-NEXT: movsd %xmm0, (%eax)
; SSE2-NEXT: retl
%a = load double, double* %x
%b = fsub double -0.0, %a
%b = fneg double %a
store double %b, double* %y
ret void
}

define void @loo(float* %x, float* %y) nounwind {
; CHECK-LABEL: loo:
define void @fneg_f32_mem(float* %x, float* %y) nounwind {
; CHECK-LABEL: fneg_f32_mem:
; CHECK: ## %bb.0:
; CHECK-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
; CHECK-NEXT: movd %xmm0, %eax
Expand All @@ -84,7 +84,7 @@ define void @loo(float* %x, float* %y) nounwind {
; CHECK-NEXT: movd %xmm0, (%rsi)
; CHECK-NEXT: retq
;
; SSE2-LABEL: loo:
; SSE2-LABEL: fneg_f32_mem:
; SSE2: # %bb.0:
; SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
; SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
Expand All @@ -95,54 +95,7 @@ define void @loo(float* %x, float* %y) nounwind {
; SSE2-NEXT: movd %xmm0, (%eax)
; SSE2-NEXT: retl
%a = load float, float* %x
%b = fsub float -0.0, %a
%b = fneg float %a
store float %b, float* %y
ret void
}

define double @too(double %x) nounwind {
; CHECK-LABEL: too:
; CHECK: ## %bb.0:
; CHECK-NEXT: movq %xmm0, %rax
; CHECK-NEXT: movabsq $-9223372036854775808, %rcx ## imm = 0x8000000000000000
; CHECK-NEXT: xorq %rax, %rcx
; CHECK-NEXT: movq %rcx, %xmm0
; CHECK-NEXT: retq
;
; SSE2-LABEL: too:
; SSE2: # %bb.0:
; SSE2-NEXT: pushl %ebp
; SSE2-NEXT: movl %esp, %ebp
; SSE2-NEXT: andl $-8, %esp
; SSE2-NEXT: subl $8, %esp
; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
; SSE2-NEXT: xorps {{\.LCPI.*}}, %xmm0
; SSE2-NEXT: movlps %xmm0, (%esp)
; SSE2-NEXT: fldl (%esp)
; SSE2-NEXT: movl %ebp, %esp
; SSE2-NEXT: popl %ebp
; SSE2-NEXT: retl
%y = fneg double %x
ret double %y
}

define float @zoo(float %x) nounwind {
; CHECK-LABEL: zoo:
; CHECK: ## %bb.0:
; CHECK-NEXT: movd %xmm0, %eax
; CHECK-NEXT: xorl $2147483648, %eax ## imm = 0x80000000
; CHECK-NEXT: movd %eax, %xmm0
; CHECK-NEXT: retq
;
; SSE2-LABEL: zoo:
; SSE2: # %bb.0:
; SSE2-NEXT: pushl %eax
; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE2-NEXT: xorps {{\.LCPI.*}}, %xmm0
; SSE2-NEXT: movss %xmm0, (%esp)
; SSE2-NEXT: flds (%esp)
; SSE2-NEXT: popl %eax
; SSE2-NEXT: retl
%y = fneg float %x
ret float %y
}

0 comments on commit 0f2b47b

Please sign in to comment.