summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/TargetLowering.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-02-27 00:36:27 +0000
committerChris Lattner <sabre@nondot.org>2006-02-27 00:36:27 +0000
commita60751dd43bcd1f3ac806f789c270b4241929419 (patch)
tree38896951c016fb81715710679f40fc10981dc62a /llvm/lib/Target/TargetLowering.cpp
parent27220f8958f4c31a27a4fead41c7556b2a8c3d29 (diff)
downloadbcm5719-llvm-a60751dd43bcd1f3ac806f789c270b4241929419.tar.gz
bcm5719-llvm-a60751dd43bcd1f3ac806f789c270b4241929419.zip
Check RHS simplification before LHS simplification to avoid infinitely looping
on PowerPC/small-arguments.ll llvm-svn: 26389
Diffstat (limited to 'llvm/lib/Target/TargetLowering.cpp')
-rw-r--r--llvm/lib/Target/TargetLowering.cpp35
1 files changed, 17 insertions, 18 deletions
diff --git a/llvm/lib/Target/TargetLowering.cpp b/llvm/lib/Target/TargetLowering.cpp
index 1dd2f5f3ed9..176ddac0249 100644
--- a/llvm/lib/Target/TargetLowering.cpp
+++ b/llvm/lib/Target/TargetLowering.cpp
@@ -201,7 +201,23 @@ bool TargetLowering::SimplifyDemandedBits(SDOperand Op, uint64_t DemandedMask,
KnownZero = ~KnownOne & DemandedMask;
return false; // Don't fall through, will infinitely loop.
case ISD::AND:
- // If either the LHS or the RHS are Zero, the result is zero.
+ // If the RHS is a constant, check to see if the LHS would be zero without
+ // using the bits from the RHS. Below, we use 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;
+ }
+
if (SimplifyDemandedBits(Op.getOperand(1), DemandedMask, KnownZero,
KnownOne, TLO, Depth+1))
return true;
@@ -224,23 +240,6 @@ bool TargetLowering::SimplifyDemandedBits(SDOperand Op, uint64_t DemandedMask,
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;
// Output known-0 are known to be clear if zero in either the LHS | RHS.
OpenPOWER on IntegriCloud