mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-15 07:39:31 +00:00
Do some peephole optimizations to remove pointless VMOVs from Neon to integer
registers that arise from argument shuffling with the soft float ABI. These instructions are particularly slow on Cortex A8. This fixes one half of <rdar://problem/8674845>. llvm-svn: 128759
This commit is contained in:
parent
2748634089
commit
9573b6277e
@ -5561,6 +5561,37 @@ static SDValue PerformVMOVRRDCombine(SDNode *N,
|
||||
SDValue InDouble = N->getOperand(0);
|
||||
if (InDouble.getOpcode() == ARMISD::VMOVDRR)
|
||||
return DCI.CombineTo(N, InDouble.getOperand(0), InDouble.getOperand(1));
|
||||
|
||||
// vmovrrd(load f64) -> (load i32), (load i32)
|
||||
SDNode *InNode = InDouble.getNode();
|
||||
if (ISD::isNormalLoad(InNode) && InNode->hasOneUse() &&
|
||||
InNode->getValueType(0) == MVT::f64 &&
|
||||
InNode->getOperand(1).getOpcode() == ISD::FrameIndex &&
|
||||
!cast<LoadSDNode>(InNode)->isVolatile()) {
|
||||
// TODO: Should this be done for non-FrameIndex operands?
|
||||
LoadSDNode *LD = cast<LoadSDNode>(InNode);
|
||||
|
||||
SelectionDAG &DAG = DCI.DAG;
|
||||
DebugLoc DL = LD->getDebugLoc();
|
||||
SDValue BasePtr = LD->getBasePtr();
|
||||
SDValue NewLD1 = DAG.getLoad(MVT::i32, DL, LD->getChain(), BasePtr,
|
||||
LD->getPointerInfo(), LD->isVolatile(),
|
||||
LD->isNonTemporal(), LD->getAlignment());
|
||||
|
||||
SDValue OffsetPtr = DAG.getNode(ISD::ADD, DL, MVT::i32, BasePtr,
|
||||
DAG.getConstant(4, MVT::i32));
|
||||
SDValue NewLD2 = DAG.getLoad(MVT::i32, DL, NewLD1.getValue(1), OffsetPtr,
|
||||
LD->getPointerInfo(), LD->isVolatile(),
|
||||
LD->isNonTemporal(),
|
||||
std::min(4U, LD->getAlignment() / 2));
|
||||
|
||||
DAG.ReplaceAllUsesOfValueWith(SDValue(LD, 1), NewLD2.getValue(1));
|
||||
SDValue Result = DCI.CombineTo(N, NewLD1, NewLD2);
|
||||
DCI.RemoveFromWorklist(LD);
|
||||
DAG.DeleteNode(LD);
|
||||
return Result;
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
|
11
test/CodeGen/ARM/fp-arg-shuffle.ll
Normal file
11
test/CodeGen/ARM/fp-arg-shuffle.ll
Normal file
@ -0,0 +1,11 @@
|
||||
; RUN: llc < %s -march=arm -mattr=+neon -float-abi=soft | FileCheck %s
|
||||
|
||||
; CHECK: function1
|
||||
; CHECK-NOT: vmov r
|
||||
define double @function1(double %a, double %b, double %c, double %d, double %e, double %f) nounwind noinline ssp {
|
||||
entry:
|
||||
%call = tail call double @function2(double %f, double %e, double %d, double %c, double %b, double %a) nounwind
|
||||
ret double %call
|
||||
}
|
||||
|
||||
declare double @function2(double, double, double, double, double, double)
|
Loading…
Reference in New Issue
Block a user