[llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Chris Lattner lattner at cs.uiuc.edu
Tue Sep 12 23:02:56 PDT 2006

Changes in directory llvm/lib/CodeGen/SelectionDAG:

SelectionDAGISel.cpp updated: 1.275 -> 1.276
Log message:

If LSR went through a lot of trouble to put constants (e.g. the addr of a global
in a specific BB, don't undo this!).  This allows us to compile 
CodeGen/X86/loop-hoist.ll into:

        xorl %eax, %eax
***     movl L_Arr$non_lazy_ptr, %ecx
        movl 4(%esp), %edx
LBB1_1: #cond_true
        movl %eax, (%ecx,%eax,4)
        incl %eax
        cmpl %edx, %eax
        jne LBB1_1      #cond_true
LBB1_2: #return

instead of:

        xorl %eax, %eax
        movl 4(%esp), %ecx
LBB1_1: #cond_true
***     movl L_Arr$non_lazy_ptr, %edx
        movl %eax, (%edx,%eax,4)
        incl %eax
        cmpl %ecx, %eax
        jne LBB1_1      #cond_true
LBB1_2: #return

This was noticed in 464.h264ref.  This doesn't usually affect PPC,
but strikes X86 all the time.

Diffs of the changes:  (+9 -0)

 SelectionDAGISel.cpp |    9 +++++++++
 1 files changed, 9 insertions(+)

Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.275 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.276
--- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.275	Sun Sep 10 01:36:57 2006
+++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp	Wed Sep 13 01:02:42 2006
@@ -3234,6 +3234,15 @@
       if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(I)) {
         MadeChange |= OptimizeGEPExpression(GEPI, TLI.getTargetData());
       } else if (CastInst *CI = dyn_cast<CastInst>(I)) {
+        // If the source of the cast is a constant, then this should have
+        // already been constant folded.  The only reason NOT to constant fold
+        // it is if something (e.g. LSR) was careful to place the constant
+        // evaluation in a block other than then one that uses it (e.g. to hoist
+        // the address of globals out of a loop).  If this is the case, we don't
+        // want to forward-subst the cast.
+        if (isa<Constant>(CI->getOperand(0)))
+          continue;
         // If this is a noop copy, sink it into user blocks to reduce the number
         // of virtual registers that must be created and coallesced.
         MVT::ValueType SrcVT = TLI.getValueType(CI->getOperand(0)->getType());

More information about the llvm-commits mailing list