1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 11:02:59 +02:00

[DAGCombiner, PowerPC] allow X - (fpext(-Y) --> X + fpext(Y) with multiple uses

This is a transform that I limited in instcombine in rL329821 because it was 
creating more instructions in IR when the cast has multiple uses.

But if the cast is free, then we can do the transform regardless of other
uses because it improves the potential throughput of the calculation by
removing a dependency on the fneg.

Differential Revision: https://reviews.llvm.org/D45598

llvm-svn: 330098
This commit is contained in:
Sanjay Patel 2018-04-15 16:43:48 +00:00
parent 1d8e1de529
commit d226d58b43
2 changed files with 10 additions and 10 deletions

View File

@ -667,13 +667,16 @@ static char isNegatibleForFree(SDValue Op, bool LegalOperations,
// fneg is removable even if it has multiple uses.
if (Op.getOpcode() == ISD::FNEG) return 2;
// Don't allow anything with multiple uses.
if (!Op.hasOneUse()) return 0;
// Don't allow anything with multiple uses unless we know it is free.
EVT VT = Op.getValueType();
if (!Op.hasOneUse())
if (!(Op.getOpcode() == ISD::FP_EXTEND &&
TLI.isFPExtFree(VT, Op.getOperand(0).getValueType())))
return 0;
// Don't recurse exponentially.
if (Depth > 6) return 0;
EVT VT = Op.getValueType();
switch (Op.getOpcode()) {
default: return false;
case ISD::ConstantFP: {
@ -736,9 +739,6 @@ static SDValue GetNegatedExpression(SDValue Op, SelectionDAG &DAG,
// fneg is removable even if it has multiple uses.
if (Op.getOpcode() == ISD::FNEG) return Op.getOperand(0);
// Don't allow anything with multiple uses.
assert(Op.hasOneUse() && "Unknown reuse!");
assert(Depth <= 6 && "GetNegatedExpression doesn't match isNegatibleForFree");
const SDNodeFlags Flags = Op.getNode()->getFlags();

View File

@ -1,16 +1,16 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -verify-machineinstrs -mtriple=powerpc64le < %s | FileCheck %s
; FIXME: When fpext is free, we should look through it for optimizations
; When fpext is free, we should look through it for optimizations
; even if it has multiple uses and produce an 'fadd' here.
; Y - (fpext(-X)) --> Y + fpext(X)
define double @neg_ext_op1_extra_use(float %x, double %y) nounwind {
; CHECK-LABEL: neg_ext_op1_extra_use:
; CHECK: # %bb.0:
; CHECK-NEXT: fneg 0, 1
; CHECK-NEXT: xssubdp 1, 2, 0
; CHECK-NEXT: xsdivdp 1, 0, 1
; CHECK-NEXT: xsadddp 0, 2, 1
; CHECK-NEXT: fneg 13, 1
; CHECK-NEXT: xsdivdp 1, 13, 0
; CHECK-NEXT: blr
%t1 = fsub float -0.0, %x
%t2 = fpext float %t1 to double