The bitcode reader can create an shuffle with a place holder mask which it will
authorMon P Wang <wangmp@apple.com>
Wed, 26 Oct 2011 00:34:48 +0000 (00:34 +0000)
committerMon P Wang <wangmp@apple.com>
Wed, 26 Oct 2011 00:34:48 +0000 (00:34 +0000)
fix up later. For this special case, allow such a mask to be considered valid.
<rdar://problem/8622574>

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

lib/VMCore/Instructions.cpp
test/Bitcode/shuffle.ll [new file with mode: 0644]

index b3a720527a8ec563fcf1d9f4584e8633c4d779be..c8dcdc8ac39e3e8cba4295ccf24ef9e279b11104 100644 (file)
@@ -1576,10 +1576,17 @@ bool ShuffleVectorInst::isValidOperands(const Value *V1, const Value *V2,
         return false;
       }
     }
-  }
-  else if (!isa<UndefValue>(Mask) && !isa<ConstantAggregateZero>(Mask))
+  } else if (!isa<UndefValue>(Mask) && !isa<ConstantAggregateZero>(Mask)) {
+    // The bitcode reader can create a place holder for a forward reference
+    // used as the shuffle mask. When this occurs, the shuffle mask will
+    // fall into this case and fail. To avoid this error, do this bit of
+    // ugliness to allow such a mask pass.
+    if (const ConstantExpr* CE = dyn_cast<ConstantExpr>(Mask)) {
+      if (CE->getOpcode() == Instruction::UserOp1)
+        return true;
+    }
     return false;
-  
+  }
   return true;
 }
 
diff --git a/test/Bitcode/shuffle.ll b/test/Bitcode/shuffle.ll
new file mode 100644 (file)
index 0000000..c3c01c6
--- /dev/null
@@ -0,0 +1,31 @@
+; RUN: llvm-as < %s | llvm-dis
+
+; <rdar://problem/8622574>
+; tests the bitcodereader can handle the case where the reader will initially
+; create shuffle with a place holder mask.
+
+
+define <4 x float> @test(<2 x double> %d2)  {
+entry:
+  %call20.i = tail call <4 x float> @cmp(<2 x double> %d2,
+                                        <2 x double> bitcast (
+                                          <4 x float> shufflevector (
+                                            <3 x float> shufflevector (
+                                              <4 x float> shufflevector (
+                                                <3 x float> bitcast (
+                                                  i96 trunc (
+                                                    i128 bitcast (<2 x double> bitcast (
+                                                      <4 x i32> <i32 0, i32 0, i32 0, i32 undef> to <2 x double>)
+                                                    to i128) to i96)
+                                                  to <3 x float>),
+                                                <3 x float> undef,
+                                                <4 x i32> <i32 0, i32 1, i32 2, i32 undef>),
+                                              <4 x float> undef,
+                                            <3 x i32> <i32 0, i32 1, i32 2>),
+                                            <3 x float> undef,
+                                            <4 x i32> <i32 0, i32 1, i32 2, i32 undef>)
+                                          to <2 x double>))
+  ret <4 x float> %call20.i
+}
+
+declare <4 x float> @cmp(<2 x double>, <2 x double>)