mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-28 06:32:09 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@68082 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a7425d7fde
commit
4d95232469
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user