Implement InstCombine/vec_shuffle.ll:%test7, simplifying shuffles with
authorChris Lattner <sabre@nondot.org>
Fri, 5 Jan 2007 07:36:08 +0000 (07:36 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 5 Jan 2007 07:36:08 +0000 (07:36 +0000)
undef operands.

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

lib/Transforms/Scalar/InstructionCombining.cpp

index c1a331faecb68892c039f5e802bf359ddb61b194..eaab4c6b9c58d79c59207ed1e75bbc07d5bc201b 100644 (file)
@@ -8833,8 +8833,30 @@ Instruction *InstCombiner::visitShuffleVectorInst(ShuffleVectorInst &SVI) {
   if (isa<UndefValue>(SVI.getOperand(2)))
     return ReplaceInstUsesWith(SVI, UndefValue::get(SVI.getType()));
   
-  // TODO: If we have shuffle(x, undef, mask) and any elements of mask refer to
+  // If we have shuffle(x, undef, mask) and any elements of mask refer to
   // the undef, change them to undefs.
+  if (isa<UndefValue>(SVI.getOperand(1))) {
+    // Scan to see if there are any references to the RHS.  If so, replace them
+    // with undef element refs and set MadeChange to true.
+    for (unsigned i = 0, e = Mask.size(); i != e; ++i) {
+      if (Mask[i] >= e && Mask[i] != 2*e) {
+        Mask[i] = 2*e;
+        MadeChange = true;
+      }
+    }
+    
+    if (MadeChange) {
+      // Remap any references to RHS to use LHS.
+      std::vector<Constant*> Elts;
+      for (unsigned i = 0, e = Mask.size(); i != e; ++i) {
+        if (Mask[i] == 2*e)
+          Elts.push_back(UndefValue::get(Type::Int32Ty));
+        else
+          Elts.push_back(ConstantInt::get(Type::Int32Ty, Mask[i]));
+      }
+      SVI.setOperand(2, ConstantPacked::get(Elts));
+    }
+  }
   
   // Canonicalize shuffle(x    ,x,mask) -> shuffle(x, undef,mask')
   // Canonicalize shuffle(undef,x,mask) -> shuffle(x, undef,mask').