From: Mon P Wang Date: Wed, 26 Oct 2011 00:34:48 +0000 (+0000) Subject: The bitcode reader can create an shuffle with a place holder mask which it will X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=cf62b371a970d109fa373e2fc2f5a024cdadcf42;p=oota-llvm.git The bitcode reader can create an shuffle with a place holder mask which it will fix up later. For this special case, allow such a mask to be considered valid. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142992 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp index b3a720527a8..c8dcdc8ac39 100644 --- a/lib/VMCore/Instructions.cpp +++ b/lib/VMCore/Instructions.cpp @@ -1576,10 +1576,17 @@ bool ShuffleVectorInst::isValidOperands(const Value *V1, const Value *V2, return false; } } - } - else if (!isa(Mask) && !isa(Mask)) + } else if (!isa(Mask) && !isa(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(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 index 00000000000..c3c01c6692c --- /dev/null +++ b/test/Bitcode/shuffle.ll @@ -0,0 +1,31 @@ +; RUN: llvm-as < %s | llvm-dis + +; +; 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> to <2 x double>) + to i128) to i96) + to <3 x float>), + <3 x float> undef, + <4 x i32> ), + <4 x float> undef, + <3 x i32> ), + <3 x float> undef, + <4 x i32> ) + to <2 x double>)) + ret <4 x float> %call20.i +} + +declare <4 x float> @cmp(<2 x double>, <2 x double>)