From 8685e52545cae5a15d6c288512f95994c0fd2914 Mon Sep 17 00:00:00 2001 From: Jinsong Ji Date: Thu, 26 Sep 2019 15:11:33 +0000 Subject: [PATCH] [PowerPC] Add missing pattern for VSX Scalar Negative Multiply-Subtract Single Precision Summary: This was found during review of https://reviews.llvm.org/D66050. In the simple test of fdiv, we miss to fold ``` fneg 2, 2 xsmaddasp 3, 2, 0 ``` to ``` xsnmsubasp 3, 2, 0 ``` We have the patterns for Double Precision and vectors, just missing Single Precision, the patch add that. Reviewers: #powerpc, hfinkel, nemanjai, steven.zhang Reviewed By: #powerpc, steven.zhang Subscribers: wuzish, hiraditya, kbarton, MaskRay, shchenz, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D67595 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@372985 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPCInstrVSX.td | 6 ++++++ test/CodeGen/PowerPC/fdiv.ll | 3 +-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/Target/PowerPC/PPCInstrVSX.td b/lib/Target/PowerPC/PPCInstrVSX.td index 910d98dc108..bf15070203a 100644 --- a/lib/Target/PowerPC/PPCInstrVSX.td +++ b/lib/Target/PowerPC/PPCInstrVSX.td @@ -1512,6 +1512,12 @@ let AddedComplexity = 400 in { // Prefer VSX patterns over non-VSX patterns. AltVSXFMARel; } + // Additional xsnmsubasp patterns: -a*b + c == -(a*b - c) + def : Pat<(fma (fneg f32:$A), f32:$B, f32:$C), + (XSNMSUBASP $C, $A, $B)>; + def : Pat<(fma f32:$A, (fneg f32:$C), f32:$B), + (XSNMSUBASP $C, $A, $B)>; + // Single Precision Conversions (FP <-> INT) def XSCVSXDSP : XX2Form<60, 312, (outs vssrc:$XT), (ins vsfrc:$XB), diff --git a/test/CodeGen/PowerPC/fdiv.ll b/test/CodeGen/PowerPC/fdiv.ll index 4e73dd244a8..183e514d994 100644 --- a/test/CodeGen/PowerPC/fdiv.ll +++ b/test/CodeGen/PowerPC/fdiv.ll @@ -5,9 +5,8 @@ define dso_local float @foo(float %0, float %1) local_unnamed_addr { ; CHECK-LABEL: foo: ; CHECK: # %bb.0: ; CHECK-NEXT: xsresp 3, 2 -; CHECK-NEXT: fneg 2, 2 ; CHECK-NEXT: xsmulsp 0, 1, 3 -; CHECK-NEXT: xsmaddasp 1, 2, 0 +; CHECK-NEXT: xsnmsubasp 1, 2, 0 ; CHECK-NEXT: xsmaddasp 0, 3, 1 ; CHECK-NEXT: fmr 1, 0 ; CHECK-NEXT: blr -- 2.50.1