diff options
author | Chris Lattner <sabre@nondot.org> | 2007-12-06 07:47:55 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-12-06 07:47:55 +0000 |
commit | d3fd6d2b25fc4e932ac796664ae7f4cd810ced8a (patch) | |
tree | f997308334b6548298d00db05b4c995eca04334b /lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | e00cbad78de86ac8e736f35db35632c83ef64c1d (diff) |
third time around: instead of disabling this completely,
only disable it if we don't know it will be obviously profitable.
Still fixme, but less so. :)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@44658 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index ba3c0ac33d..fd0df3a0a1 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2134,12 +2134,6 @@ SDOperand DAGCombiner::visitXOR(SDNode *N) { /// visitShiftByConstant - Handle transforms common to the three shifts, when /// the shift amount is a constant. SDOperand DAGCombiner::visitShiftByConstant(SDNode *N, unsigned Amt) { - // FIXME: disable this for now. This pessimizes some common cases like: - // - //void foo(int *X, int i) { X[i & 1235] = 1; } - //int bar(int *X, int i) { return X[i & 255]; } - return SDOperand(); - SDNode *LHS = N->getOperand(0).Val; if (!LHS->hasOneUse()) return SDOperand(); @@ -2169,6 +2163,19 @@ SDOperand DAGCombiner::visitShiftByConstant(SDNode *N, unsigned Amt) { ConstantSDNode *BinOpCst = dyn_cast<ConstantSDNode>(LHS->getOperand(1)); if (!BinOpCst) return SDOperand(); + + // FIXME: disable this for unless the input to the binop is a shift by a + // constant. If it is not a shift, it pessimizes some common cases like: + // + //void foo(int *X, int i) { X[i & 1235] = 1; } + //int bar(int *X, int i) { return X[i & 255]; } + SDNode *BinOpLHSVal = LHS->getOperand(0).Val; + if ((BinOpLHSVal->getOpcode() != ISD::SHL && + BinOpLHSVal->getOpcode() != ISD::SRA && + BinOpLHSVal->getOpcode() != ISD::SRL) || + !isa<ConstantSDNode>(BinOpLHSVal->getOperand(1))) + return SDOperand(); + MVT::ValueType VT = N->getValueType(0); // If this is a signed shift right, and the high bit is modified |