mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
recognize some patterns as fabs operations, so that fabs at the source level
is deconstructed then reconstructed here. This catches 19 fabs's in 177.mesa 9 in 168.wupwise, 5 in 171.swim, 3 in 172.mgrid, and 14 in 173.applu out of specfp2000. This allows the X86 code generator to make MUCH better code than before for each of these and saves one instr on ppc. This depends on the previous CFE patch to expose these correctly. llvm-svn: 21171
This commit is contained in:
parent
08e03f0b05
commit
afa0001d54
@ -952,6 +952,27 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
|
||||
}
|
||||
}
|
||||
|
||||
// If this is a selectcc, check to see if we can simplify the result.
|
||||
if (SetCCSDNode *SetCC = dyn_cast<SetCCSDNode>(N1)) {
|
||||
if (ConstantFPSDNode *CFP =
|
||||
dyn_cast<ConstantFPSDNode>(SetCC->getOperand(1)))
|
||||
if (CFP->getValue() == 0.0) { // Allow either -0.0 or 0.0
|
||||
// select (setg[te] X, +/-0.0), X, fneg(X) -> fabs
|
||||
if ((SetCC->getCondition() == ISD::SETGE ||
|
||||
SetCC->getCondition() == ISD::SETGT) &&
|
||||
N2 == SetCC->getOperand(0) && N3.getOpcode() == ISD::FNEG &&
|
||||
N3.getOperand(0) == N2)
|
||||
return getNode(ISD::FABS, VT, N2);
|
||||
|
||||
// select (setl[te] X, +/-0.0), fneg(X), X -> fabs
|
||||
if ((SetCC->getCondition() == ISD::SETLT ||
|
||||
SetCC->getCondition() == ISD::SETLE) &&
|
||||
N3 == SetCC->getOperand(0) && N2.getOpcode() == ISD::FNEG &&
|
||||
N2.getOperand(0) == N3)
|
||||
return getNode(ISD::FABS, VT, N3);
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case ISD::BRCOND:
|
||||
if (N2C)
|
||||
|
Loading…
Reference in New Issue
Block a user