[llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp
Evan Cheng
evan.cheng at apple.com
Thu Jan 19 17:11:15 PST 2006
Changes in directory llvm/utils/TableGen:
DAGISelEmitter.cpp updated: 1.138 -> 1.139
---
Log message:
Prevent folding of a node with multiple uses if the node already folds a load!
Here is an example where the load ended up being done twice:
%A = global uint 0
uint %test(uint %B, ubyte %C) {
%tmp = load uint *%A;
%X = shl uint %tmp, ubyte %C
%Cv = sub ubyte 32, %C
%Y = shr uint %B, ubyte %Cv
%Z = or uint %Y, %X
store uint %Z, uint* %A
ret uint %Z
}
==>
subl $4, %esp
movl %ebx, (%esp)
movl 8(%esp), %edx
movl A, %eax
movb 12(%esp), %bl
movb %bl, %cl
shldl %cl, %edx, %eax
movb %bl, %cl
shldl %cl, %edx, A
movl (%esp), %ebx
addl $4, %esp
ret
---
Diffs of the changes: (+9 -6)
DAGISelEmitter.cpp | 15 +++++++++------
1 files changed, 9 insertions(+), 6 deletions(-)
Index: llvm/utils/TableGen/DAGISelEmitter.cpp
diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.138 llvm/utils/TableGen/DAGISelEmitter.cpp:1.139
--- llvm/utils/TableGen/DAGISelEmitter.cpp:1.138 Thu Jan 19 15:57:10 2006
+++ llvm/utils/TableGen/DAGISelEmitter.cpp Thu Jan 19 19:11:03 2006
@@ -1907,18 +1907,21 @@
// Emit code to load the child nodes and match their contents recursively.
unsigned OpNo = 0;
- bool HasChain = NodeHasProperty(N, SDNodeInfo::SDNPHasChain, ISE);
+ bool NodeHasChain = NodeHasProperty(N, SDNodeInfo::SDNPHasChain, ISE);
+ bool HasChain = PatternHasProperty(N, SDNodeInfo::SDNPHasChain, ISE);
if (HasChain) {
- OpNo = 1;
+ if (NodeHasChain)
+ OpNo = 1;
if (!isRoot) {
const SDNodeInfo &CInfo = ISE.getSDNodeInfo(N->getOperator());
OS << " if (!" << RootName << ".hasOneUse()) goto P"
<< PatternNo << "Fail; // Multiple uses of actual result?\n";
- OS << " if (CodeGenMap.count(" << RootName
- << ".getValue(" << CInfo.getNumResults() << "))) goto P"
- << PatternNo << "Fail; // Already selected for a chain use?\n";
+ if (NodeHasChain)
+ OS << " if (CodeGenMap.count(" << RootName
+ << ".getValue(" << CInfo.getNumResults() << "))) goto P"
+ << PatternNo << "Fail; // Already selected for a chain use?\n";
}
- if (!FoundChain) {
+ if (NodeHasChain && !FoundChain) {
OS << " SDOperand Chain = " << RootName << ".getOperand(0);\n";
FoundChain = true;
}
More information about the llvm-commits
mailing list