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 | eedaf92fcf15ca066f89b10ba8c2212a4697cdfd (patch) | |
| tree | 3df38e387c8f845961d17af814d282ce47e7d962 /llvm/lib/CodeGen | |
| parent | b5fdfb96121e001366654f4936f5f0d6c0ced33f (diff) | |
| download | bcm5719-llvm-eedaf92fcf15ca066f89b10ba8c2212a4697cdfd.tar.gz bcm5719-llvm-eedaf92fcf15ca066f89b10ba8c2212a4697cdfd.zip | |
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. :)
llvm-svn: 44658
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 19 | 
1 files changed, 13 insertions, 6 deletions
| diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index ba3c0ac33dc..fd0df3a0a11 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/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 | 

