summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2008-05-29 21:50:34 +0000
committerDan Gohman <gohman@apple.com>2008-05-29 21:50:34 +0000
commit96af4ddb629c28201c2b8f6365d72809a0d36195 (patch)
tree7a0a48680bb12326eba502549bb14912408abf19
parent33e396d0414d190665734a327400fa1c3005288c (diff)
downloadbcm5719-llvm-96af4ddb629c28201c2b8f6365d72809a0d36195.tar.gz
bcm5719-llvm-96af4ddb629c28201c2b8f6365d72809a0d36195.zip
Add patterns for CALL32m and CALL64m. They aren't matched in most
cases due to an isel deficiency already noted in lib/Target/X86/README.txt, but they can be matched in this fold-call.ll testcase, for example. This is interesting mainly because it exposes a tricky tblgen bug; tblgen was incorrectly computing the starting index for variable_ops in the case of a complex pattern. llvm-svn: 51706
-rw-r--r--llvm/lib/Target/X86/X86Instr64bit.td2
-rw-r--r--llvm/lib/Target/X86/X86InstrInfo.td2
-rw-r--r--llvm/test/CodeGen/X86/fold-call.ll10
-rw-r--r--llvm/utils/TableGen/DAGISelEmitter.cpp11
4 files changed, 17 insertions, 8 deletions
diff --git a/llvm/lib/Target/X86/X86Instr64bit.td b/llvm/lib/Target/X86/X86Instr64bit.td
index 55f8ca39903..de422f0da30 100644
--- a/llvm/lib/Target/X86/X86Instr64bit.td
+++ b/llvm/lib/Target/X86/X86Instr64bit.td
@@ -101,7 +101,7 @@ let isCall = 1 in
def CALL64r : I<0xFF, MRM2r, (outs), (ins GR64:$dst, variable_ops),
"call\t{*}$dst", [(X86call GR64:$dst)]>;
def CALL64m : I<0xFF, MRM2m, (outs), (ins i64mem:$dst, variable_ops),
- "call\t{*}$dst", []>;
+ "call\t{*}$dst", [(X86call (loadi64 addr:$dst))]>;
}
diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td
index d0bd9552d06..4ffc303c372 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.td
+++ b/llvm/lib/Target/X86/X86InstrInfo.td
@@ -397,7 +397,7 @@ let isCall = 1 in
def CALL32r : I<0xFF, MRM2r, (outs), (ins GR32:$dst, variable_ops),
"call\t{*}$dst", [(X86call GR32:$dst)]>;
def CALL32m : I<0xFF, MRM2m, (outs), (ins i32mem:$dst, variable_ops),
- "call\t{*}$dst", []>;
+ "call\t{*}$dst", [(X86call (loadi32 addr:$dst))]>;
}
// Tail call stuff.
diff --git a/llvm/test/CodeGen/X86/fold-call.ll b/llvm/test/CodeGen/X86/fold-call.ll
new file mode 100644
index 00000000000..53991717c67
--- /dev/null
+++ b/llvm/test/CodeGen/X86/fold-call.ll
@@ -0,0 +1,10 @@
+; RUN: llvm-as < %s | llc -march=x86 | not grep mov
+; RUN: llvm-as < %s | llc -march=x86-64 | not grep mov
+
+declare void @bar()
+
+define void @foo(i32 %i0, i32 %i1, i32 %i2, i32 %i3, i32 %i4, i32 %i5, void()* %arg) nounwind {
+ call void @bar()
+ call void %arg()
+ ret void
+}
diff --git a/llvm/utils/TableGen/DAGISelEmitter.cpp b/llvm/utils/TableGen/DAGISelEmitter.cpp
index b112b7e8e0b..cf8c6272bac 100644
--- a/llvm/utils/TableGen/DAGISelEmitter.cpp
+++ b/llvm/utils/TableGen/DAGISelEmitter.cpp
@@ -947,7 +947,7 @@ public:
// instruction operands to do this.
std::vector<std::string> AllOps;
unsigned NumEAInputs = 0; // # of synthesized 'execute always' inputs.
- unsigned NumDiscardedInputs = 0; // # of 'discard' inputs to skip.
+ unsigned InputIndex = 0;
for (unsigned ChildNo = 0, InstOpNo = NumResults;
InstOpNo != II.OperandList.size(); ++InstOpNo) {
std::vector<std::string> Ops;
@@ -956,7 +956,7 @@ public:
Record *OperandNode = II.OperandList[InstOpNo].Rec;
if (OperandNode->getName() == "discard") {
// This is a "discard" operand; emit nothing. Just note it.
- ++NumDiscardedInputs;
+ ++InputIndex;
} else if ((OperandNode->isSubClassOf("PredicateOperand") ||
OperandNode->isSubClassOf("OptionalDefOperand")) &&
!CGP.getDefaultOperand(OperandNode).DefaultOps.empty()) {
@@ -970,6 +970,7 @@ public:
AllOps.insert(AllOps.end(), Ops.begin(), Ops.end());
NumEAInputs += Ops.size();
}
+ ++InputIndex;
} else {
// Otherwise this is a normal operand or a predicate operand without
// 'execute always'; emit it.
@@ -977,6 +978,7 @@ public:
InFlagDecled, ResNodeDecled);
AllOps.insert(AllOps.end(), Ops.begin(), Ops.end());
++ChildNo;
+ ++InputIndex;
}
}
@@ -1062,10 +1064,7 @@ public:
// number of operands that are 'execute always'. This is the index
// where we should start copying operands into the 'variable_ops'
// portion of the output.
- unsigned InputIndex = AllOps.size() +
- NumDiscardedInputs +
- NodeHasChain -
- NumEAInputs;
+ InputIndex += NodeHasChain - NumEAInputs;
for (unsigned i = 0, e = AllOps.size(); i != e; ++i)
emitCode("Ops" + utostr(OpsNo) + ".push_back(" + AllOps[i] + ");");
OpenPOWER on IntegriCloud