aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-02-04 08:50:49 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-02-04 08:50:49 +0000
commit9c4815a0362575bcd207619188156b5fad73c2bc (patch)
tree1181fdec3392dd4cd23d9d411256ed370c61ae94
parentc275dfa72751dc22507c33488a639bda9874e274 (diff)
Complex pattern's custom matcher should not call Select() on any operands.
Select them afterwards if it returns true. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25968 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/X86/X86ISelDAGToDAG.cpp20
-rw-r--r--utils/TableGen/DAGISelEmitter.cpp5
2 files changed, 12 insertions, 13 deletions
diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp
index f007b28a5d..e30be1b41a 100644
--- a/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -369,17 +369,11 @@ bool X86DAGToDAGISel::SelectAddr(SDOperand N, SDOperand &Base, SDOperand &Scale,
return false;
if (AM.BaseType == X86ISelAddressMode::RegBase) {
- if (AM.Base.Reg.Val) {
- if (AM.Base.Reg.getOpcode() != ISD::Register)
- AM.Base.Reg = Select(AM.Base.Reg);
- } else {
+ if (!AM.Base.Reg.Val)
AM.Base.Reg = CurDAG->getRegister(0, MVT::i32);
- }
}
- if (AM.IndexReg.Val)
- AM.IndexReg = Select(AM.IndexReg);
- else
+ if (!AM.IndexReg.Val)
AM.IndexReg = CurDAG->getRegister(0, MVT::i32);
getAddressOperands(AM, Base, Scale, Index, Disp);
@@ -441,11 +435,6 @@ bool X86DAGToDAGISel::SelectLEAAddr(SDOperand N, SDOperand &Base,
return false;
}
- if (SelectBase)
- AM.Base.Reg = Select(AM.Base.Reg);
- if (SelectIndex)
- AM.IndexReg = Select(AM.IndexReg);
-
getAddressOperands(AM, Base, Scale, Index, Disp);
return true;
}
@@ -461,6 +450,11 @@ SDOperand X86DAGToDAGISel::Select(SDOperand N) {
if (Opcode >= ISD::BUILTIN_OP_END && Opcode < X86ISD::FIRST_NUMBER)
return N; // Already selected.
+ // These are probably emitted by SelectAddr().
+ if (Opcode == ISD::TargetConstant || Opcode == ISD::TargetConstantPool ||
+ Opcode == ISD::TargetFrameIndex || Opcode == ISD::TargetGlobalAddress)
+ return N;
+
std::map<SDOperand, SDOperand>::iterator CGMI = CodeGenMap.find(N);
if (CGMI != CodeGenMap.end()) return CGMI->second;
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp
index b85ee8c64c..0b3d6df0d1 100644
--- a/utils/TableGen/DAGISelEmitter.cpp
+++ b/utils/TableGen/DAGISelEmitter.cpp
@@ -2136,6 +2136,11 @@ public:
for (unsigned i = 0; i < NumRes; i++)
Code += ", Tmp" + utostr(i + ResNo);
emitCheck(Code + ")");
+
+ for (unsigned i = 0; i < NumRes; ++i)
+ emitCode("Tmp" + utostr(i+ResNo) + " = Select(Tmp" +
+ utostr(i+ResNo) + ");");
+
TmpNo = ResNo + NumRes;
} else {
emitCode("SDOperand Tmp" + utostr(ResNo) + " = Select(" + Val + ");");