X86 address mode isel tweak. If the base of the address is also used by a CopyToReg (i.e. it's likely live-out), do not fold the sub-expressions into the addressing mode to avoid computing the address twice. The CopyToReg use will be isel'ed to a LEA, re-use it for address instead.

This is not yet enabled.

llvm-svn: 68082
This commit is contained in:
Evan Cheng 2009-03-31 01:13:53 +00:00
parent b67535d1b6
commit 885bc6de52
1 changed files with 25 additions and 1 deletions

View File

@ -41,6 +41,9 @@
#include "llvm/ADT/Statistic.h" #include "llvm/ADT/Statistic.h"
using namespace llvm; using namespace llvm;
#include "llvm/Support/CommandLine.h"
static cl::opt<bool> AvoidDupAddrCompute("x86-avoid-dup-address", cl::Hidden);
STATISTIC(NumLoadMoved, "Number of loads moved below TokenFactor"); STATISTIC(NumLoadMoved, "Number of loads moved below TokenFactor");
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
@ -1035,7 +1038,28 @@ bool X86DAGToDAGISel::SelectAddr(SDValue Op, SDValue N, SDValue &Base,
SDValue &Scale, SDValue &Index, SDValue &Scale, SDValue &Index,
SDValue &Disp) { SDValue &Disp) {
X86ISelAddressMode AM; X86ISelAddressMode AM;
if (MatchAddress(N, AM)) bool Done = false;
if (AvoidDupAddrCompute && !N.hasOneUse()) {
unsigned Opcode = N.getOpcode();
if (Opcode != ISD::Constant && Opcode != ISD::FrameIndex &&
Opcode != X86ISD::Wrapper) {
// If we are able to fold N into addressing mode, then we'll allow it even
// if N has multiple uses. In general, addressing computation is used as
// addresses by all of its uses. But watch out for CopyToReg uses, that
// means the address computation is liveout. It will be computed by a LEA
// so we want to avoid computing the address twice.
for (SDNode::use_iterator UI = N.getNode()->use_begin(),
UE = N.getNode()->use_end(); UI != UE; ++UI) {
if (UI->getOpcode() == ISD::CopyToReg) {
MatchAddressBase(N, AM, true, 0);
Done = true;
break;
}
}
}
}
if (!Done && MatchAddress(N, AM))
return false; return false;
MVT VT = N.getValueType(); MVT VT = N.getValueType();