third time around: instead of disabling this completely,
authorChris Lattner <sabre@nondot.org>
Thu, 6 Dec 2007 07:47:55 +0000 (07:47 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 6 Dec 2007 07:47:55 +0000 (07:47 +0000)
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

lib/CodeGen/SelectionDAG/DAGCombiner.cpp
test/CodeGen/X86/shift-combine.ll

index ba3c0ac33dcb7f8773d928cc7a286ccbda404817..fd0df3a0a1174c8dfe0c8ecb4a7af7bdf3dc91d1 100644 (file)
@@ -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
index c8df5b020800361b0b5d82a54a1832676aec7438..543bb223787542e5fb702c1097975c479bca9b2b 100644 (file)
@@ -1,5 +1,4 @@
 ; RUN: llvm-as < %s | llc | not grep shrl
-; XFAIL: *
 
 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
 target triple = "i686-apple-darwin8"