Changes in directory llvm/lib/Target/X86:
X86ISelDAGToDAG.cpp updated: 1.8 -> 1.9 --- Log message: For ISD::RET, if # of operands >= 2, try selection the real data dep. operand first before the chain. e.g. int X; int foo(int x) { x += X + 37; return x; } If chain operand is selected first, we would generate: movl X, %eax movl 4(%esp), %ecx leal 37(%ecx,%eax), %eax rather than movl $37, %eax addl 4(%esp), %eax addl X, %eax which does not require %ecx. (Due to ADD32rm not matching.) --- Diffs of the changes: (+10 -2) X86ISelDAGToDAG.cpp | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.8 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.9 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.8 Fri Dec 9 18:48:20 2005 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Mon Dec 12 14:32:18 2005 @@ -356,15 +356,22 @@ break; case ISD::RET: { - SDOperand Chain = Select(N->getOperand(0)); // Token chain. - switch (N->getNumOperands()) { + SDOperand Chain = N->getOperand(0); // Token chain. + unsigned NumOps = N->getNumOperands(); + + // Note: A bit of a hack / optimization... Try to delay chain selection + // as much as possible. So it's more likely it has already been selected + // for a real use. + switch (NumOps) { default: assert(0 && "Unknown return instruction!"); case 3: + Chain = Select(Chain); assert(0 && "Not yet handled return instruction!"); break; case 2: { SDOperand Val = Select(N->getOperand(1)); + Chain = Select(Chain); switch (N->getOperand(1).getValueType()) { default: assert(0 && "All other types should have been promoted!!"); @@ -378,6 +385,7 @@ } } case 1: + Chain = Select(Chain); break; } if (X86Lowering.getBytesToPopOnReturn() == 0) _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits