Implement Regression/Transforms/InstCombine/bswap-fold.ll,
authorChris Lattner <sabre@nondot.org>
Wed, 29 Nov 2006 05:02:16 +0000 (05:02 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 29 Nov 2006 05:02:16 +0000 (05:02 +0000)
folding   seteq (bswap(x)), c -> seteq(x,bswap(c))

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32006 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 1e1db20ff2f971e99e349576c34a4b89c5f7a7a7..92760b60ac13f72f024ef467aeb94c3e2414d090 100644 (file)
@@ -4664,7 +4664,7 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {
         break;
       }
 
-    // Simplify seteq and setne instructions...
+    // Simplify seteq and setne instructions with integer constant RHS.
     if (I.isEquality()) {
       bool isSetNE = I.getOpcode() == Instruction::SetNE;
 
@@ -4780,6 +4780,29 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {
           }
         default: break;
         }
+      } else if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(Op0)) {
+        // Handle set{eq|ne} <intrinsic>, intcst.
+        switch (II->getIntrinsicID()) {
+        default: break;
+        case Intrinsic::bswap_i16:   // seteq (bswap(x)), c -> seteq(x,bswap(c))
+          WorkList.push_back(II);  // Dead?
+          I.setOperand(0, II->getOperand(1));
+          I.setOperand(1, ConstantInt::get(Type::UShortTy,
+                                           ByteSwap_16(CI->getZExtValue())));
+          return &I;
+        case Intrinsic::bswap_i32:   // seteq (bswap(x)), c -> seteq(x,bswap(c))
+          WorkList.push_back(II);  // Dead?
+          I.setOperand(0, II->getOperand(1));
+          I.setOperand(1, ConstantInt::get(Type::UIntTy,
+                                           ByteSwap_32(CI->getZExtValue())));
+          return &I;
+        case Intrinsic::bswap_i64:   // seteq (bswap(x)), c -> seteq(x,bswap(c))
+          WorkList.push_back(II);  // Dead?
+          I.setOperand(0, II->getOperand(1));
+          I.setOperand(1, ConstantInt::get(Type::ULongTy,
+                                           ByteSwap_64(CI->getZExtValue())));
+          return &I;
+        }
       }
     } else {  // Not a SetEQ/SetNE
       // If the LHS is a cast from an integral value of the same size,