[InstCombine] make ((X & C) ^ C) form consistent for vectors

It would be better to create a 'not' here, but that's not possible yet.

llvm-svn: 341410
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 19322dd..202ec07 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -2784,12 +2784,10 @@
     return BinaryOperator::CreateAnd(Op0, Builder.CreateNot(X));
   // (X & Y) ^ Y --> ~X & Y
   // (Y & X) ^ Y --> ~X & Y
-  // Canonical form with a non-splat constant is (X & C) ^ C; don't touch that.
-  // TODO: Why do we treat arbitrary vector constants differently?
+  // Canonical form is (X & C) ^ C; don't touch that.
   // TODO: A 'not' op is better for analysis and codegen, but demanded bits must
   //       be fixed to prefer that (otherwise we get infinite looping).
-  const APInt *Unused;
-  if (!match(Op1, m_APInt(Unused)) &&
+  if (!match(Op1, m_Constant()) &&
       match(Op0, m_OneUse(m_c_And(m_Value(X), m_Specific(Op1)))))
     return BinaryOperator::CreateAnd(Op1, Builder.CreateNot(X));