[llvm-commits] CVS: llvm/lib/Target/TargetLowering.cpp

Chris Lattner lattner at cs.uiuc.edu
Sun Feb 26 16:22:39 PST 2006



Changes in directory llvm/lib/Target:

TargetLowering.cpp updated: 1.38 -> 1.39
---
Log message:

Just like we use the RHS of an AND to simplify the LHS, use the LHS to 
simplify the RHS.  This allows for the elimination of many thousands of 
ands from multisource, and compiles CodeGen/PowerPC/and-elim.ll:test2 
into this:

_test2:
        srwi r2, r3, 1
        xori r3, r2, 40961
        blr

instead of this:

_test2:
        rlwinm r2, r3, 31, 17, 31
        xori r2, r2, 40961
        rlwinm r3, r2, 0, 16, 31
        blr



---
Diffs of the changes:  (+17 -0)

 TargetLowering.cpp |   17 +++++++++++++++++
 1 files changed, 17 insertions(+)


Index: llvm/lib/Target/TargetLowering.cpp
diff -u llvm/lib/Target/TargetLowering.cpp:1.38 llvm/lib/Target/TargetLowering.cpp:1.39
--- llvm/lib/Target/TargetLowering.cpp:1.38	Sun Feb 26 17:36:02 2006
+++ llvm/lib/Target/TargetLowering.cpp	Sun Feb 26 18:22:28 2006
@@ -223,6 +223,23 @@
     // If the RHS is a constant, see if we can simplify it.
     if (TLO.ShrinkDemandedConstant(Op, DemandedMask & ~KnownZero2))
       return true;
+      
+    // If the RHS is a constant, check to see if the LHS would be zero without
+    // using the bits from the RHS.  Above, we used knowledge about the RHS to
+    // simplify the LHS, here we're using information from the LHS to simplify
+    // the RHS.
+    if (ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
+      uint64_t LHSZero, LHSOne;
+      ComputeMaskedBits(Op.getOperand(0), DemandedMask,
+                        LHSZero, LHSOne, Depth+1);
+      // If the LHS already has zeros where RHSC does, this and is dead.
+      if ((LHSZero & DemandedMask) == (~RHSC->getValue() & DemandedMask))
+        return TLO.CombineTo(Op, Op.getOperand(0));
+      // If any of the set bits in the RHS are known zero on the LHS, shrink
+      // the constant.
+      if (TLO.ShrinkDemandedConstant(Op, ~LHSZero & DemandedMask))
+        return true;
+    }
         
     // Output known-1 bits are only known if set in both the LHS & RHS.
     KnownOne &= KnownOne2;






More information about the llvm-commits mailing list